機器學習基石筆記-感知機-Day1

1 基礎概念

1. 機器學習應用三個關鍵

  • 有某些有規律的目標待機器進行學習
  • 我們不知如何編程
  • 有能夠給機器進行學習的資料

2. 機器學習流程

  1. 首先將Data傳給我們的機器,Data也同時告訴了機器假設空間
  2. 讓機器對數據進行學習,選擇一個最好的假設
  3. 最後得到一個非常接近與目標函數f的假設函數g

在這裏插入圖片描述

在這裏插入圖片描述

3.數據挖掘與機器學習的區別

  • 機器學習:利用數據來找到一個模型,使得模型能夠很好地解決目標問題
  • 數據挖掘:從巨大的數據集當中發現一些有趣的聯繫
    在這裏插入圖片描述

2 感知機

1.概念

  • 感知機就相當於一僅有輸入層和輸出層的神經網絡,每一個連接權都代表該屬性的重要性程度,其中w0代表一個閾值。如果每個屬性值與其對應權重相乘之和大於該閾值,那麼根據sign函數,就可以做出分類。

在這裏插入圖片描述
在這裏插入圖片描述

2.PLA算法(感知機學習算法)

  • 直觀上:通過迭代的方式,每一次選擇一條線,來更新權重向量,如果第t輪的線無法準確的預測結果,那就對權重向量做出改變,也就是對決策邊界進行調整。當樣本真實類別爲1,但感知機將其分類爲-1的時候,就用原來的權重向量減去x,使得決策線離x軸更近;當樣本真實類別爲-1,但感知機將其分類爲1的時候,就用原來的權重加上x,使得決策線離x軸更遠。不斷的進行迭代,最後使得其不再出錯。
    在這裏插入圖片描述
  • 根據上面所論述的規則,看下面的視圖
  1. 首先進入第一次迭代,先隨機初始化一條線,然後找到一個錯誤的點x1,x1∈1類,因此權重向量會加上這個x的值,所以線就會以圖片中心爲原點向順時針方向更新
    在這裏插入圖片描述

  2. 由第一輪更新出來的決策邊界,又發現了一個分類錯誤的1類點,因此,下一次更新還是朝順時針更新。
    在這裏插入圖片描述

  3. 這次更新完成之後找到一個分類錯誤的-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算法,也就是在每一次找到一條新的線的時候都看看是不是比上一條好,如果是就將其保存下來,這樣可以找到局部最優解。

在這裏插入圖片描述

代碼實例:

  1. 首先查看數據分佈:
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()

結果如下:
在這裏插入圖片描述

  1. 定義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
  1. 隨機梯度下降
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()

結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章