1 基礎概念
1. 機器學習應用三個關鍵
- 有某些有規律的目標待機器進行學習
- 我們不知如何編程
- 有能夠給機器進行學習的資料
2. 機器學習流程
- 首先將Data傳給我們的機器,Data也同時告訴了機器假設空間
- 讓機器對數據進行學習,選擇一個最好的假設
- 最後得到一個非常接近與目標函數f的假設函數g
3.數據挖掘與機器學習的區別
- 機器學習:利用數據來找到一個模型,使得模型能夠很好地解決目標問題
- 數據挖掘:從巨大的數據集當中發現一些有趣的聯繫
2 感知機
1.概念
- 感知機就相當於一僅有輸入層和輸出層的神經網絡,每一個連接權都代表該屬性的重要性程度,其中w0代表一個閾值。如果每個屬性值與其對應權重相乘之和大於該閾值,那麼根據sign函數,就可以做出分類。
2.PLA算法(感知機學習算法)
- 直觀上:通過迭代的方式,每一次選擇一條線,來更新權重向量,如果第t輪的線無法準確的預測結果,那就對權重向量做出改變,也就是對決策邊界進行調整。當樣本真實類別爲1,但感知機將其分類爲-1的時候,就用原來的權重向量減去x,使得決策線離x軸更近;當樣本真實類別爲-1,但感知機將其分類爲1的時候,就用原來的權重加上x,使得決策線離x軸更遠。不斷的進行迭代,最後使得其不再出錯。
- 根據上面所論述的規則,看下面的視圖
-
首先進入第一次迭代,先隨機初始化一條線,然後找到一個錯誤的點x1,x1∈1類,因此權重向量會加上這個x的值,所以線就會以圖片中心爲原點向順時針方向更新
-
由第一輪更新出來的決策邊界,又發現了一個分類錯誤的1類點,因此,下一次更新還是朝順時針更新。
-
這次更新完成之後找到一個分類錯誤的-1類點,因此下一次會向逆時針方向更新。
- 依此進行,最後迭代到一條近乎完美的決策邊界
- PLA何時停止呢?
假設我們的數據是線性可分的,因此肯定存在一條分界線,可以完美的將屬於不同類別的樣本進行分割,也就是說我們機器做出的分類與實際的分類是一模一樣的,因此根據公式可知,必有下列不等式成立,因爲W的轉置乘X與y同號。
再進一步,那麼必有隨機第t輪的值大於等於該最小值大於0.
下面再來看w_f與w_t的關係,由公式得:
又由上面的推導可知,w_f的轉置x_n(t)y_n(t)>miny_nw_fx_n
再進一步,可得下面不等式,該不等式可以反映出第t輪的w與w_f的乘積要小於第t+1輪w與w_f的乘積,當兩個向量的內積越來越大,說明兩個向量在越來越接近,但是這裏只考慮了一半,因爲有可能是因爲長度上的問題。
下面證明另外一半:
- 因爲PLA是知錯才改,因此根據PLA的機制,每一次增長的最大距離就是加上最大的向量x
- 又因爲兩個正規化權重向量內積的最大值是1,因此可證明PLA是會停止的。
- 那麼當我們的數據存在一些噪音,從而導致沒有辦法找到完美的線進行分界怎麼辦呢?
答:這裏可以使用Pocket算法,也就是在每一次找到一條新的線的時候都看看是不是比上一條好,如果是就將其保存下來,這樣可以找到局部最優解。
代碼實例:
- 首先查看數據分佈:
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from scipy.io import loadmat
data = loadmat('E:/Data/Ng/Coursera-ML-AndrewNg-Notes-master/code/ex6-SVM/data/ex6data1.mat')
X =data['X']
y = np.ravel(data['y'])
Data = np.insert(X,2,values=y,axis=1)
Data = pd.DataFrame(Data,columns=['X1','X2','Y'])
cluster1= Data[Data['Y'].isin([1])] #將屬於1類的樣本全部分離出來
cluster2= Data[Data['Y'].isin([0])] #將屬於0類的樣本全部分離出來
plt.scatter(cluster1['X1'],cluster1['X2'],color='red',marker='o',label='cluster1')
plt.scatter(cluster2['X1'],cluster2['X2'],color='blue',marker='x',label='cluster2')
plt.legend(loc=1)
plt.show()
結果如下:
- 定義sign函數與代價函數
def sign(x):
"""x>=0,則屬於1類;x<0,則屬於-1類"""
if x>=0:
return 1
else:
return -1
def cost(theta,X,y):
m = X.shape[0]
Cost=0.0
for i in range(m):
x_i = X[i,:]
h_i = sign(theta @ x_i.T)
y_i = y[i]
if h_i!= int(y_i):
Cost-= (y_i*h_i)
return Cost
- 隨機梯度下降
def gradient(theta,X,y,epoch,l):
m = X.shape[0]
index_list = np.arange(m)
for i in range(epoch):
index = int(np.random.choice(index_list,size=1))
x_i = X[index,:]
h_i = sign(x_i@theta.T)
y_i = y[index]
if h_i!=int(y_i):
theta = theta + (l*y_i)*x_i
return theta
if __name__ == '__main__':
Y = np.array([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1])
X = np.insert(X,0,values=np.ones(X.shape[0]),axis=1)
theta = np.zeros(X.shape[1])
theta = gradient(theta,X,Y,1000,1)
final_x2 = (theta[0] + theta[1]*X[:,1])/(-theta[2])
plt.scatter(cluster1['X1'],cluster1['X2'],color='red',marker='o',label='cluster1')
plt.scatter(cluster2['X1'],cluster2['X2'],color='blue',marker='x',label='cluster2')
plt.plot(X[:,1],f)
plt.legend(loc=1)
plt.show()
結果如下: