scikit-learn machine learning (一) (學習筆記整理)

scikit-learn machine learning (一) (學習筆記整理) — 圖 1

整理一下自己學習的筆記 也希望可以幫助到正在學習機器學習的人 這篇程式是在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])