scikit-learn machine learning (一) (學習筆記整理)
整理一下自己學習的筆記 也希望可以幫助到正在學習機器學習的人 這篇程式是在Jupyter Notebook 上執行編譯的
創建 Numpy.array 的方法
import numpy as np
創建0矩陣
np.zeros(10)
結果
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
創建的數值 默認是浮點數
np.zeros(10).dtype
結果 dtype(‘float64’)
建立10個整數
np.zeros(10 , dtype = int )
結果 array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
也可以傳入二維
np.zeros( (3 , 5 ) )
結果 array([[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]])
第一個參數他是名子的 也可以這樣寫
np.zeros( shape = (3 , 5 ) , dtype = int )
結果 array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])
獲得全1的向量
np.ones(10)
結果 array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
當然這也可以傳入二維
np.ones( ( 3 , 5 ) )
結果 array([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]])
傳入指定值 傳入555 是 整型 要浮點型 要輸入555.0
np.full ( ( 3 , 5 ) , 555 )
加入參數名 這邊fill_value 可以傳變數名稱 也可以不傳 加入變數名稱 維護會比較容易一些
np.full ( shape = ( 3 , 5 ) , fill_value = 555 )
傳入的這兩個值 可以交換
np.full ( fill_value = 555 , shape = ( 3 , 5 ) )
結果 array([[555, 555, 555, 555, 555], [555, 555, 555, 555, 555], [555, 555, 555, 555, 555]])
arange
用生成表達式的方式建立 第一個參數=起始點 第二個參數=中止點 第三個參數=補償(不填默認唯1) 結果不包刮20 python 的range 是不可以傳浮點數的
[i for i in range (0 , 20 , 2) ]
結果 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
numpy 的arange 可以傳浮點數 第三個參數=補償 (預設值也是1)
np.arange(0, 1 , 0.2)
結果 array([0. , 0.2, 0.4, 0.6, 0.8])
只傳一個參數的話 起始值預設 是0
np.arange(10 )
結果 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
linspace
參數與arange 一樣 第三個值不是補償 ( 這邊是0 - 20 的區間裡等長的擷出10個點 這邊10個點是包含 0 和20 ) 0 是起始點 20是終止點 中間8個值 與起始點 終止點 形成等差數列 他們的間距是相等的
np.linspace( 0 , 20 ,10 )
結果 array([ 0. , 2.22222222, 4.44444444, 6.66666667, 8.88888889, 11.11111111, 13.33333333, 15.55555556, 17.77777778, 20. ])
如果要以2為補償使用linspace的話
np.linspace( 0 , 20 ,11 )
結果 array([ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18., 20.])
random
生成0 - 9的隨機數 (區間是0-10 但這隨機數是取不到10的)
np.random.randint( 0 , 10 )
結果 9
生成 0 - 9 隨機數的向量
np.random.randint( 0 , 10 , 10)
結果 array([9, 0, 9, 8, 2, 5, 7, 8, 4, 3])
生成 0 - 9 隨機數二維矩陣 (第三個參數 可以給他一個名稱會比較好閱讀))
np.random.randint( 0 , 10 , size = (3 , 5 ))
結果 array([[8, 0, 3, 0, 1], [7, 6, 4, 6, 8], [7, 1, 3, 1, 2]])
讓隨機數產生一致 如果機器學習算法中要驗證這些隨機的向量 或是隨機的矩陣 但是每次取的值都是不一致的 這會沒辦法驗證 隨機數通常都是偉隨機數 都會有一個key
np.random.seed(500)
np.random.randint( 0 , 10 , size = (3 , 5 ))
這樣子生成 生成的都會是一致的 結果 array([[7, 1, 1, 8, 7], [1, 1, 5, 9, 2], [2, 3, 6, 8, 7]])
生成隨機的浮點數 (是在0 - 1 之間分布的值) 如果不輸入值 默認會產生一個
np.random.random(10)
結果 array([0.31647204, 0.36173317, 0.45072243, 0.91526806, 0.45995858, 0.27367946, 0.91749612, 0.45953222, 0.54459121, 0.69069037])
也可以生成一個二維0 - 1 之間的隨機浮點數
np.random.random((3 ,5))
結果 array([[0.83083808, 0.63590931, 0.64981717, 0.95375833, 0.56995437], [0.6352015 , 0.03646224, 0.74912676, 0.85806843, 0.48540734], [0.23216177, 0.50338804, 0.13613189, 0.1730703 , 0.10495834]])
產生符合正態分佈的浮點數 符合均值為0 方差為1分佈的隨機浮點數
np.random.normal()
結果 0.7543888054016835
指定 均值 方差 (指定均值為10 方差為100 分佈的隨機數)
np.random.normal(10 , 100)
結果 114.58354338987674
也可以指定他的大小 (均值為0 方差為1 3*5的隨機矩陣)
np.random.normal(0 , 1 , (3 ,5 ))
結果 array([[-0.23283302, 0.20643376, 0.3993155 , 1.46962845, -0.86042417], [ 0.90035145, -0.34036856, 0.59739536, -0.40102587, -1.59174938], [-0.56669195, 0.33081722, 0.58673318, 0.18174824, 0.87216409]])
Numpy.array 基本操作
import numpy as np
先建立一個一維的數組 與二維數組 接下來會使用到
x = np.arange(10)
x
結果 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
二維數組
X = np.arange(15).reshape(3 , 5)
X
結果 array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
###基本屬性###
查看幾維的數組
x.ndim
結果 1
X.ndim
結果 2
shape 返回是一個原組
x.shape
結果 (10,)
X.shape
結果 (3, 5)
size 元素個數
x.size
結果 10
X.size
結果 15
###Unmpy.array資料訪問###
x 值 = array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) X 值 = array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
x[0]
結果 0
x[-1]
結果 9
python 寫法
X[0][0]
結果 0
建議使用Numpy的方式 後面會到為什麼
X[2,2]
結果 12
使用欺騙方法 從0開始一直到5不包含5
x[0:5]
結果 array([0, 1, 2, 3, 4])
如果:前面不輸入值的話 就是從頭一直訪問到第5元素
x[:5]
結果 array([0, 1, 2, 3, 4])
如果:後面不輸入值得話 就是從第5個元素訪問到最後
x[5:]
結果 array([0, 1, 2, 3, 4])
可傳入第三個參數 第三個參數=補償 如果前面兩個不填寫 就是從頭訪問到尾 每次補償為2
x[::2]
結果 array([0, 2, 4, 6, 8])
補償也可以傳入-1 代表從倒數的訪問方式
x[::-1]
結果 array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
X 值 = array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
如果想要得到前兩行的前三列
X[:2, :3]
結果 array([[0, 1, 2], [5, 6, 7]])
如果使用python 的兩個[]來取值的話 來看一下會發生什麼事
X[:2][:3]
結果 array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
X[:2]
結果 array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
[:2]結果與 [:2][:3] 一樣的 [:2]代表取X這個數組的前兩個元素 也就是前兩行的內容 [:2][:3]這邊的[:3] python 在解析的時候是取 array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) 的前三元素 但這個數組裡面只有兩個元素 最終的結果依然是這兩個元素 [][]來搜尋數組的時候會沒辦法表達我們的語意的情況 所以真正表達取 前兩行的前三列的話 必須使用[:2,:3] 使用Numpy的話 一維數組 也盡量使用[2,2]這種表達式
訪問前兩行 每一行從頭到尾 但是間隔為2數組
X[:2 , ::2]
結果 array([[0, 2, 4], [5, 7, 9]])
訪問行從最後一行到第一行 到著數 列也是從最後一列到著數
X[::-1,::-1]
結果 array([[14, 13, 12, 11, 10], [ 9, 8, 7, 6, 5], [ 4, 3, 2, 1, 0]])
矩陣降維處理 只取第一行
X[0]
結果 array([0, 1, 2, 3, 4])
也可以用二維的表達方式
X[0,:]
結果 array([0, 1, 2, 3, 4])
這樣會變成一維的向量
X[0,:].ndim
結果 1
要取一列的話 :代表取全部的行 列的維度上只取0 只看第一列
X[: , 0 ]
結果 array([ 0, 5, 10])
這樣得到也是一維的數組
X[: , 0].ndim
結果 1
子矩陣
subX = X[:2, :3]
subX
結果 array([[0, 1, 2], [5, 6, 7]])
如果將subX 將其中的值修改
subX[0 , 0 ] = 100
subX
結果 array([[100, 1, 2], [ 5, 6, 7]])
但X原矩陣 有沒有被改變? 在python 使用這種方式 是建立一個新的矩陣 subX 與 原本的X 是沒有關係的 但是在Numpy不是這樣的 在Numpy為了效率的關係 所以他會影響到原矩陣 如果修改原矩陣的元素 subX子矩陣也會跟著更改
X
結果 array([[100, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [ 10, 11, 12, 13, 14]])
COPY
要用Numpy建立一個 與子矩陣沒關係的元素的話 要使用.copy
subX = X[:2 , :3].copy()
subX
結果 array([[100, 1, 2], [ 5, 6, 7]])
subX 0 0 修改值
subX [0,0 ] = 0
subX
結果 array([[0, 1, 2], [5, 6, 7]])
X
結果 array([[100, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [ 10, 11, 12, 13, 14]])
###Reshape ###
x 值 = array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
如果要將這10個值 變成2 * 5的矩陣
x.reshape(2,5)
結果 array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
####使用reshape 是沒有改變x 本身的####
x
結果 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
如果要將改變的存起來的話 需要給他新的值
A = x.reshape(2,5)
A
結果 array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
如果要將 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 變成二維數組
B =x.reshape(1,10)
B
結果 是有兩個[][] array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
B.ndim
結果 2
B.shape
結果 (1 , 10)
如果想要10行 有多少 不管列有多少
x.reshape(10 , -1)
結果 array([[0], [1], [2], [3], [4], [5], [6], [7], [8], [9]])
也可以 我想要有5列 不管它有多少行
x.reshape(-1 , 5)
結果 array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
合併操作
如果只需要合併兩個的話也可以傳兩個進去就好
import numpy as np
x = np.array([1 , 2 , 3])
y = np.array([3 , 2 , 1 ])
z = np.array([555, 555, 55])
np.concatenate([x , y , z])
結果 array([ 1, 2, 3, 3, 2, 1, 555, 555, 55])
二維矩陣也可以合併
A = np.array([[ 1 , 2 ,3],
[4 , 5 ,6]])
np.concatenate([A , A])
結果 array([[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]])
沿著列的方向合併
np.concatenate([A , A] , axis = 1)
結果 array([[1, 2, 3, 1, 2, 3], [4, 5, 6, 4, 5, 6]])
二維與一維合併
np.concatenate([ A , z.reshape(1, -1)])
結果 array([[ 1, 2, 3], [ 4, 5, 6], [555, 555, 55]])
這樣A還是原來的值
A
結果 array([[1, 2, 3], [4, 5, 6]])
如果想要保存起來需要賦上一個新的值
A2 = np.concatenate([ A , z.reshape(1, -1)])
A2
結果 array([[ 1, 2, 3], [ 4, 5, 6], [555, 555, 55]])
如果使用concatenate 又要加上reshape 覺得太麻煩的話 可以使用vstack 可以直接二維與一維合併
np.vstack([ A , z])
結果 array([[ 1, 2, 3], [ 4, 5, 6], [555, 555, 55]])
####有vstack 也有hstack水平方向####
B = np.full(( 2 , 2 ) , 100)
B
結果 array([[100, 100], [100, 100]])
np.hstack([ A , B])
結果 array([[ 1, 2, 3, 100, 100], [ 4, 5, 6, 100, 100]])
分割``` python
x = np.arange(10) x
>array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
**split 傳入兩個參數 (切割三段)
第一個參數分割的數組
第二個參數分割點**
``` python
x1 , x2 ,x3 =np.split(x, [ 3 , 7 ])
x1 0-3 不包含3
array([0, 1, 2]) x2 3 , 7 中間的內容 array([3, 4, 5, 6]) X3 7到結尾的內容 array([7, 8, 9])
####split (切割兩段)####
x2 ,x3 =np.split(x, [ 5])
x2
array([0, 1, 2, 3, 4])
x3
array([5, 6, 7, 8, 9])
二維
A = np.arange(16).reshape(( 4 , 4 ))
結果 array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]])
分成兩部分
A1 , A2 = np.split(A , [2] )
A1
array([[0, 1, 2, 3], [4, 5, 6, 7]])
A2
array([[ 8, 9, 10, 11], [12, 13, 14, 15]])
####列的方向分割 axis 默認=0####
A1 , A2 = np.split(A , [2] , axis = 1)
A1
array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]])
A2
array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])
####也可用vsplit 垂直方向分割####
A垂直的方向 以2這個點作為分割點 進行分割
upper , lower = np.vsplit(A , [2])
upper
array([[0, 1, 2, 3], [4, 5, 6, 7]])
lower
array([[ 8, 9, 10, 11], [12, 13, 14, 15]])
hvsplit 水平方向分割``` python
left , right = np.hsplit(A , [2])
**left**
>array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]])
**right**
>array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])
**如果前面三個代表三個特徵 最後一個代表目標值
將特徵矩陣 與目標值向量 分割**
``` python
data = np .arange(16).reshape((4 , 4 ))
data
array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]])
x , y =np.hsplit(data , [-1])
x
array([[ 0, 1, 2], [ 4, 5, 6], [ 8, 9, 10], [12, 13, 14]])
y
array([[ 3], [ 7], [11], [15]])
很多時候希望目標值 是個向量
y[ : , 0 ]
array([ 3, 7, 11, 15])