DustinChu Blog

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

整理一下自己學習的筆記 也希望可以幫助到正在學習機器學習的人
這篇程式是在Jupyter Notebook 上執行編譯的

創建 Numpy.array 的方法

import numpy as np

創建0矩陣

1
np.zeros(10)

結果
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

創建的數值 默認是浮點數

1
np.zeros(10).dtype

結果
dtype(‘float64’)

建立10個整數

1
np.zeros(10 , dtype = int )

結果
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

也可以傳入二維

1
np.zeros( (3 , 5 ) )

結果
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])

第一個參數他是名子的 也可以這樣寫

1
np.zeros( shape = (3 , 5 ) , dtype = int )

結果
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])

獲得全1的向量

1
np.ones(10)

結果
array([1., 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

1
np.full ( ( 3 , 5 ) , 555 )

加入參數名 這邊fill_value 可以傳變數名稱 也可以不傳 加入變數名稱 維護會比較容易一些

1
np.full ( shape = ( 3 , 5 ) , fill_value = 555 )

傳入的這兩個值 可以交換

1
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 是不可以傳浮點數的

1
[i for i in range (0 , 20 , 2) ]

結果
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

numpy 的arange 可以傳浮點數 第三個參數=補償 (預設值也是1)

1
np.arange(0, 1 , 0.2)

結果
array([0. , 0.2, 0.4, 0.6, 0.8])

只傳一個參數的話 起始值預設 是0

1
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個值 與起始點 終止點 形成等差數列 他們的間距是相等的

1
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的話

1
np.linspace( 0 , 20 ,11 )

結果
array([ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18., 20.])

random

生成0 - 9的隨機數
(區間是0-10 但這隨機數是取不到10的)

1
np.random.randint( 0 , 10 )

結果
9

生成 0 - 9 隨機數的向量

1
np.random.randint( 0 , 10 , 10)

結果
array([9, 0, 9, 8, 2, 5, 7, 8, 4, 3])

生成 0 - 9 隨機數二維矩陣
(第三個參數 可以給他一個名稱會比較好閱讀))

1
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

1
2
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 之間分布的值)
如果不輸入值 默認會產生一個

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 之間的隨機浮點數

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分佈的隨機浮點數

1
np.random.normal()

結果
0.7543888054016835

指定 均值 方差
(指定均值為10 方差為100 分佈的隨機數)

1
np.random.normal(10 , 100)

結果
114.58354338987674

也可以指定他的大小
(均值為0 方差為1 3*5的隨機矩陣)

1
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

先建立一個一維的數組 與二維數組 接下來會使用到

1
2
x = np.arange(10)
x

結果
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

二維數組

1
2
X = np.arange(15).reshape(3 , 5)
X

結果
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])

###基本屬性###

查看幾維的數組

1
x.ndim

結果
1

1
X.ndim

結果
2

shape 返回是一個原組

1
x.shape

結果
(10,)

1
X.shape

結果
(3, 5)

size 元素個數

1
x.size

結果
10

1
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]])

1
x[0]

結果
0

1
x[-1]

結果
9

python 寫法

1
X[0][0]

結果
0

建議使用Numpy的方式 後面會到為什麼

1
X[2,2]

結果
12

使用欺騙方法 從0開始一直到5不包含5

1
x[0:5]

結果
array([0, 1, 2, 3, 4])

如果:前面不輸入值的話 就是從頭一直訪問到第5元素

1
x[:5]

結果
array([0, 1, 2, 3, 4])

如果:後面不輸入值得話 就是從第5個元素訪問到最後

1
x[5:]

結果
array([0, 1, 2, 3, 4])

可傳入第三個參數 第三個參數=補償 如果前面兩個不填寫
就是從頭訪問到尾 每次補償為2

1
x[::2]

結果
array([0, 2, 4, 6, 8])

補償也可以傳入-1 代表從倒數的訪問方式

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]])

如果想要得到前兩行的前三列

1
X[:2, :3]

結果
array([[0, 1, 2],
[5, 6, 7]])

如果使用python 的兩個[]來取值的話
來看一下會發生什麼事

1
X[:2][:3]

結果
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])

1
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數組

1
X[:2 , ::2]

結果
array([[0, 2, 4],
[5, 7, 9]])

訪問行從最後一行到第一行 到著數 列也是從最後一列到著數

1
X[::-1,::-1]

結果
array([[14, 13, 12, 11, 10],
[ 9, 8, 7, 6, 5],
[ 4, 3, 2, 1, 0]])

矩陣降維處理 只取第一行

1
X[0]

結果
array([0, 1, 2, 3, 4])

也可以用二維的表達方式

1
X[0,:]

結果
array([0, 1, 2, 3, 4])

這樣會變成一維的向量

1
X[0,:].ndim

結果
1

要取一列的話 :代表取全部的行 列的維度上只取0 只看第一列

1
X[: , 0 ]

結果
array([ 0, 5, 10])

這樣得到也是一維的數組

1
X[: , 0].ndim

結果
1

子矩陣

1
2
subX = X[:2, :3]
subX

結果
array([[0, 1, 2],
[5, 6, 7]])

如果將subX 將其中的值修改

1
2
subX[0 , 0 ] = 100
subX

結果
array([[100, 1, 2],
[ 5, 6, 7]])

但X原矩陣 有沒有被改變?
在python 使用這種方式 是建立一個新的矩陣
subX 與 原本的X 是沒有關係的
但是在Numpy不是這樣的
在Numpy為了效率的關係 所以他會影響到原矩陣
如果修改原矩陣的元素 subX子矩陣也會跟著更改

1
X

結果
array([[100, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[ 10, 11, 12, 13, 14]])

COPY

要用Numpy建立一個 與子矩陣沒關係的元素的話 要使用.copy

1
2
subX = X[:2 , :3].copy()
subX

結果
array([[100, 1, 2],
[ 5, 6, 7]])

subX 0 0 修改值

1
2
subX [0,0 ] = 0
subX

結果
array([[0, 1, 2],
[5, 6, 7]])

1
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的矩陣

1
x.reshape(2,5)

結果
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])

####使用reshape 是沒有改變x 本身的####

1
x

結果
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

如果要將改變的存起來的話 需要給他新的值

1
2
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]) 變成二維數組

1
2
B =x.reshape(1,10)
B

結果 是有兩個[][]
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])

1
B.ndim

結果
2

1
B.shape

結果
(1 , 10)

如果想要10行 有多少 不管列有多少

1
x.reshape(10 , -1)

結果
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])

也可以 我想要有5列 不管它有多少行

1
x.reshape(-1 , 5)

結果
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])

合併操作

如果只需要合併兩個的話也可以傳兩個進去就好

1
2
3
4
5
6
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])

二維矩陣也可以合併

1
2
3
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]])

沿著列的方向合併

1
np.concatenate([A , A] , axis = 1)

結果
array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])

二維與一維合併

1
np.concatenate([ A , z.reshape(1, -1)])

結果
array([[ 1, 2, 3],
[ 4, 5, 6],
[555, 555, 55]])

這樣A還是原來的值

1
A

結果
array([[1, 2, 3],
[4, 5, 6]])

如果想要保存起來需要賦上一個新的值

1
2
A2 = np.concatenate([ A , z.reshape(1, -1)])
A2

結果
array([[ 1, 2, 3],
[ 4, 5, 6],
[555, 555, 55]])

如果使用concatenate 又要加上reshape 覺得太麻煩的話
可以使用vstack 可以直接二維與一維合併

1
2
3
4
5
6
7
8
9
10
11
12
13
np.vstack([ A , z])
```
>結果
array([[ 1, 2, 3],
[ 4, 5, 6],
[555, 555, 55]])
####有vstack 也有hstack水平方向####
```python
B = np.full(( 2 , 2 ) , 100)
B

結果
array([[100, 100],
[100, 100]])

1
np.hstack([ A , B])

結果
array([[ 1, 2, 3, 100, 100],
[ 4, 5, 6, 100, 100]])

分割

1
2
x = np.arange(10)
x

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

split 傳入兩個參數 (切割三段)
第一個參數分割的數組
第二個參數分割點

1
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 (切割兩段)####

1
x2 ,x3 =np.split(x, [ 5])

x2

array([0, 1, 2, 3, 4])

x3

array([5, 6, 7, 8, 9])

二維

1
A = np.arange(16).reshape(( 4 , 4 ))

結果
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])

分成兩部分

1
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####

1
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這個點作為分割點 進行分割

1
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 水平方向分割

1
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]])

如果前面三個代表三個特徵 最後一個代表目標值
將特徵矩陣 與目標值向量 分割

1
2
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]])

1
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]])

很多時候希望目標值 是個向量

1
y[ : , 0 ]

array([ 3, 7, 11, 15])

文章標題:scikit-learn machine learning (一) (學習筆記整理)

文章作者:Dustinchu

發布時間:2018年03月01日 - 02:03

最後更新:2018年07月03日 - 20:07

原始連結:https://dustinchu.github.io/2018/03/01/scikit-learn-machine-learning-1/

許可協議: 屬名-非商業性使用-禁止編譯 4.0 國際 轉載請保留原文連結及作者。