[Python]-機器學習Python入門《Python機器學習手冊》-01-向量、矩陣和陣列

CAMILIA發表於2022-04-20

《Python機器學習手冊——從資料預處理到深度學習》

這本書類似於工具書或者字典,對於python具體程式碼的呼叫和使用場景寫的很清楚,感覺雖然是工具書,但是對照著做一遍應該可以對機器學習中python常用的這些庫有更深入的理解,在應用中也能更為熟練。

以下是根據書上的程式碼進行實操,註釋基本寫明瞭每句程式碼的作用(寫在本句程式碼之前)和print的輸出結果(寫在print之後)。不一定嚴格按照書上內容進行,根據程式碼執行時具體情況稍作順序調整,也加入了一些自己的理解。

如果複製到自己的環境下跑一遍輸出,相信理解會更深刻更清楚。

部落格中每個程式碼塊代表一次完整的執行結果,可以直接以此為單位複製並執行。


01-向量、矩陣和陣列

本節主要是numpy庫的基本應用。
包括:

  1. 初始化與格式
  2. 資料讀取與批量處理
  3. 數值計算
  4. 矩陣計算
  5. 隨機數

01-1 初始化與格式

import numpy as np

# 建立一個行向量
vector = np.array([1,2,3])
# 建立一個列向量
vector = np.array([[1],[2],[3]]) 
print(vector)
# 建立一個矩陣
matrix = np.array([[0,0],[2,0],[0,3]])
print(type(matrix)) #<class 'numpy.ndarray'>
# 檢視行數和列數
print(matrix.shape) #(3, 2)
# 檢視元素數量
print(matrix.size) #6
# 檢視維數
print(matrix.ndim) #2
# 轉換為矩陣格式mat
matrix = np.mat(matrix)
print(type(matrix)) #<class 'numpy.matrix'>

from scipy import sparse
# 轉換為壓縮的稀疏行矩陣
matrix = sparse.csr_matrix(matrix)
print(matrix) 
#   (1, 0)        2
#   (2, 1)        3
print(type(matrix)) #<class 'scipy.sparse.csr.csr_matrix'>

01-2 資料讀取與批量處理

import numpy as np

matrix = np.array([[1,2,3],[4,5,6],[7,8,9]])
# 輸出矩陣第二行第三列的元素(下標從0開始)
# 注意此處下標與二維list不同
print(matrix[1,2]) # 6

# 一維切片,[起始位置:結束位置],包括起始位置,不包括結束位置元素
# 輸出第三個元素之前所有元素
vector = np.array([1,2,3])
print(vector[0:2])
# [1 2]

# 二維切片,與一維類似[起始位置:結束位置],不同維度用','隔開
# '1:'第二行及之後所有行
# ':2'第三列之前所有列
print(matrix[1:,:2])
# [[4 5]
#  [7 8]]

# 對一個陣列中多個元素同時應用某個函式
# 建立一個函式,add_100返回:輸入值+100的值
add_100 = lambda i : i + 100
# 建立向量化函式
vectorized_add_100 = np.vectorize(add_100)
# 對矩陣所有元素應用這個函式
print(vectorized_add_100(matrix))
# [[101 102 103] 
#  [104 105 106] 
#  [107 108 109]]

01-3 數值計算

import numpy as np

matrix = np.array([[1,2,3],[4,5,6],[7,8,9]])
# 求矩陣中最大的元素
print(np.max(matrix)) # 9
# 求矩陣中最小的元素
print(np.min(matrix)) # 1
# 求每列最大的元素,axis指維度
print(np.max(matrix, axis = 0)) # [7 8 9]
# 求每行最大的元素
print(np.max(matrix, axis = 1)) # [3 6 9]

# 計算矩陣的平均值
print(np.mean(matrix)) # 5.0
print(type(np.mean(matrix))) # <class 'numpy.float64'>

# 計算矩陣的方差
print(np.var(matrix)) # 6.666666666666667
print(type(np.var(matrix))) # <class 'numpy.float64'>

# 計算矩陣的標準差
print(np.std(matrix)) # 2.581988897471611
print(type(np.std(matrix))) # <class 'numpy.float64'>

# 以上計算均可以加引數axis求每行或每列
# 求每行的平均值
print(np.mean(matrix, axis = 1)) # [2. 5. 8.]

01-4 矩陣計算

01-4-1 矩陣變形與矩陣轉置

import numpy as np

matrix = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])

# 矩陣變形,不改變元素值,改變矩陣的形狀
# 將矩陣從4*3變為2*6
print(matrix.shape) # (4, 3)
matrix = matrix.reshape(2,6)
print(matrix.shape) # (2, 6)
print(matrix)
# [[ 1  2  3  4  5  6]
#  [ 7  8  9 10 11 12]]
# 也可以將其中一個維度設為預設'-1',會自己取整除之後的數作為預設維度
matrix = matrix.reshape(3,-1)
print(matrix.shape) # (3, 4)
print(matrix)
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]

# 以下三種情況注意區別:
# 情況1
matrix = matrix.reshape(1,-1)
print(matrix.shape) # (1, 12)
print(matrix)
# [[ 1  2  3  4  5  6  7  8  9 10 11 12]]
# 情況2
matrix = matrix.reshape(3,-1)
print(matrix.shape) # (3, 4)
matrix = matrix.reshape(matrix.size)
print(matrix.shape) # (12,)
print(matrix)
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
# 情況3
# 展開矩陣
matrix = matrix.reshape(3,-1)
print(matrix.shape) # (3, 4)
matrix = matrix.flatten()
print(matrix.shape) # (12,)
print(matrix)
# [ 1  7  2  8  3  9  4 10  5 11  6 12]

# 矩陣轉置
matrix = matrix.reshape(2,6)
print(matrix.shape) # (2, 6)
print(matrix)
# [[ 1  2  3  4  5  6]
#  [ 7  8  9 10 11 12]]
matrix = matrix.T
print(matrix.shape) # (6, 2)
print(matrix)
# [[ 1  7]
#  [ 2  8]
#  [ 3  9]
#  [ 4 10]
#  [ 5 11]
#  [ 6 12]]

01-4-2 矩陣的秩、行列式、跡、特徵值與特徵向量

import numpy as np

matrix = np.array([[1,1,3],[2,2,6],[3,3,9]])
print(matrix)
# [[1 1 3]
#  [2 2 6]
#  [3 3 9]]

# 矩陣的秩 r(A)
print(np.linalg.matrix_rank(matrix)) # 1

# 矩陣的行列式 det(A)或|A|
print(np.linalg.det(matrix)) # 0.0

# 矩陣的對角線元素 tr(A)
print(np.diagonal(matrix)) # [1 2 9]
# 可以引入引數offset對主對角線上下偏移
# 向上偏移
print(np.diagonal(matrix, offset = 1)) # [1 6]
# 向下偏移
print(np.diagonal(matrix, offset = -1)) # [2 3]

# 矩陣的跡 tr(A),即對角線元素之和
print(np.trace(matrix)) # 12
# 同樣可以對主對角線進行偏移
print(np.trace(matrix, offset = 1)) # 7

matrix = np.array([[-2,1,1],[0,2,0],[-4,1,3]])
# 矩陣的特徵值和特徵向量
eigen_values, eigen_vectors = np.linalg.eig(matrix)
# 特徵值
print(eigen_values)
# [-1.  2.  2.]
# 特徵向量
print(eigen_vectors)
# [[-0.70710678 -0.24253563  0.30151134]
#  [ 0.          0.          0.90453403]
#  [-0.70710678 -0.9701425   0.30151134]]

01-4-3 矩陣的加減、乘法和矩陣的逆

import numpy as np

mat_1 = np.array([[1,1,2],[1,1,2],[1,1,2]])
mat_2 = np.array([[1,2,1],[1,2,1],[1,2,1]])

# 矩陣相加
print(np.add(mat_1, mat_2))
# [[2 3 3]
#  [2 3 3]
#  [2 3 3]]
print(mat_1 + mat_2)
# [[2 3 3]
#  [2 3 3]
#  [2 3 3]]

# 矩陣相減
print(np.subtract(mat_1, mat_2))
# [[ 0 -1  1]
#  [ 0 -1  1]
#  [ 0 -1  1]]
print(mat_1 - mat_2)
# [[ 0 -1  1]
#  [ 0 -1  1]
#  [ 0 -1  1]]

# 矩陣乘法
print(np.dot(mat_1, mat_2))
# [[4 8 4]
#  [4 8 4]
#  [4 8 4]]
print(mat_1 @ mat_2)
# [[4 8 4]
#  [4 8 4]
#  [4 8 4]]

# 矩陣對應元素相乘
print(mat_1 * mat_2)
# [[1 2 2]
#  [1 2 2]
#  [1 2 2]]

# 矩陣的逆 A-1
mat = np.array([[0,1],[1,0]])
print(np.linalg.inv(mat))
# [[0. 1.]
#  [1. 0.]]

# 驗證:A*(A-1) = I
print(mat @ np.linalg.inv(mat))
# [[1. 0.]
#  [0. 1.]]

01-5 隨機數

import numpy as np

# 設計隨機數種子
np.random.seed(0)
# 生成3個0.0到1.0之間的隨機數
rand = np.random.random(3)
print(rand) # [0.5488135  0.71518937 0.60276338]

# 生成3個1到10之間的隨機整數
rand = np.random.randint(0, 11, 3)
print(rand) # [3 7 9]

# 從均值為0,標準差為1的正態分佈中抽取3個數
rand = np.random.normal(0, 1, 3)
print(rand) # [-1.42232584  1.52006949 -0.29139398]

# 從均值為0,散佈程度為1的logistic分佈中抽取3個數
rand = np.random.logistic(0, 1, 3)
print(rand) # [-0.98118713 -0.08939902  1.46416405]

# 從大於等於1,小於2的範圍中抽取3個數
rand = np.random.uniform(1, 2, 3)
print(rand) # [1.47997717 1.3927848  1.83607876]

相關文章