日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习系列(一)感知器分类算法

發布時間:2024/9/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习系列(一)感知器分类算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分類算法有兩種類型:感知器和適應性線性神經元

神經元的數學表示

w=[w1w2...wm],x=[x1x2...xm]w=\begin{bmatrix} w_1 \\ w_2 \\ ... \\ w_m \\ \end{bmatrix} , x=\begin{bmatrix} x_1 \\ x_2 \\ ... \\ x_m\\ \end{bmatrix}w=?????w1?w2?...wm???????,x=?????x1?x2?...xm???????
z=w1x1+w2x2+???+wmxmz=w_1x_1 + w_2x_2 + ···+w_mx_mz=w1?x1?+w2?x2?+???+wm?xm?
其中w為權重,x為訓練樣本

感知機的訓練步驟

  • 把權重向量初始化為0,或把每個分向量初始化為[0,1]間任意小數
  • 把訓練樣本輸入感知機,得到分類結果(-1或1)
  • 根據分類結果更新權重向量
  • 激活函數

    為了計算方便我們添加w0x0w_0x_0w0?x0?, 其中w0=?θ,x0=1w_0=-\theta,x_0=1w0?=?θx0?=1
    z=w0x0+w1x1+...+wmxm=wTx,?(z)={1if?z>0?1,otherwisez=w_0x_0 + w_1x_1+...+w_mx_m = w^Tx , \phi(z)=\begin{cases} 1 & \text {if z>0} \\ -1, & \text{otherwise} \end{cases} z=w0?x0?+w1?x1?+...+wm?xm?=wTx,?(z)={1?1,?if?z>0otherwise?
    這樣,當z>0z>0z>0時,?(z)=1\phi(z)=1?(z)=1,當z<0z<0z<0時,?(z)=?1\phi(z)=-1?(z)=?1.

    權重的更新算法

    • w(j)=w(j)+Δw(j)w(j)=w(j)+\Delta w(j)w(j)=w(j)+Δw(j)
    • Δw(j)=η?(y?y′)?x(j)\Delta w(j)=\eta*(y-y')*x(j)Δw(j)=η?(y?y)?x(j) : y表示x(j)的正確分類,y’表示感知機算出來的分類,x(j)表示訓練樣本??梢钥闯鰜砣绻兄鞯姆诸惤Y果y′y'y與正確分類yyy相同時,那么可以得到Δw(j)=0\Delta w(j)=0Δw(j)=0,也就可以得到w(j)=0w(j)=0w(j)=0,也就是說如果感知器可以正確對數據樣本進行正確分類,那么對權重w(j)w(j)w(j)就不需要進行調整;只有感知器得到了錯誤的分類結果之后,出需要調整權重向量w(j)w(j)w(j)
    • η\etaη 表示學習率是[0,1]之間的一個小數,一般有使用者自己設置。通過反復運行模型,人為根據經驗調整學習率η\etaη,使得模型訓練結果越來越好。
    • w(0)=0,Δw(0)=η?(y?y′)w(0)=0, \Delta w(0)=\eta*(y-y')w(0)=0,Δw(0)=η?(y?y)閾值的更新

    舉例說明如何更新權重

    假設

  • 權重向量初始化為:w=[0,0,0]w=[0,0, 0]w=[0,0,0]
  • 訓練樣本的值:x=[1,2,3]x=[1,2,3]x=[1,2,3]
  • 學習率:η=0.3\eta=0.3η=0.3
  • 這個樣本的正確分類y=1
  • 感知器算出來的分類是y’=-1
  • 調整權重向量Δw(0)=0.3?(1?(?1))?x(0)=0.3?2?1=0.6\Delta w(0)=0.3*(1-(-1))*x(0)=0.3*2*1=0.6Δw(0)=0.3?(1?(?1))?x(0)=0.3?2?1=0.6w(0)=w(0)+Δw(0)=0.6w(0) = w(0)+\Delta w(0)=0.6w(0)=w(0)+Δw(0)=0.6,則權重的第一個分量更新為0.6,即w=[0.6,0,0]w=[0.6,0,0]w=[0.6,0,0]

    同理,Δw(1)=0.3?(1?(?1))?x(1)=0.3?2?2=1.2\Delta w(1)=0.3*(1-(-1))*x(1)=0.3*2*2=1.2Δw(1)=0.3?(1?(?1))?x(1)=0.3?2?2=1.2,則更新權重的第二個分量為w(1)=w(1)+Δw(1)=1.2w(1)=w(1)+\Delta w(1)=1.2w(1)=w(1)+Δw(1)=1.2

    同理,Δw(2)=0.3?(1?(?1)?x(2))=0.3?2?3=1.8\Delta w(2)=0.3*(1-(-1)*x(2))=0.3*2*3=1.8Δw(2)=0.3?(1?(?1)?x(2))=0.3?2?3=1.8,則更新權重的第三個分量為w(2)=w(2)+Δw(2)=1.8w(2)=w(2)+\Delta w(2)=1.8w(2)=w(2)+Δw(2)=1.8

    最終可以得到更新后的權重向量為w=[0.6,1.2,1.8]w=[0.6, 1.2, 1.8]w=[0.6,1.2,1.8]

    這樣就可以再次將新的訓練樣本輸入到模型中,根據分類結果走相同的步驟繼續改進權重向量。

    感知器算法的適用范圍


    必須要滿足上圖中第一個圖中的情況,也就是預測的數據可以現行分割,感知器的訓練目標就是要找出這條線。而后面兩個情況,是無法進行線性可分的,不適用于感知器算法進行分類。

    代碼實現

    定義感知器類

    import numpy as npclass Perceptron(object):"""eta: 學習率n_iter: 權重向量的訓練次數w_: 神經分叉權重向量errors_: 用于記錄神經元判斷出錯次數"""def __init__(self, eta = 0.01, n_iter = 10):self.eta = etaself.n_iter = n_iterpassdef fit(self, X, y):"""輸入訓練數據,培訓神經元,X表示輸入樣本, y對應樣本的正確分類X: shape[n_samples, n_features]n_samples:表示有多少個訓練樣本數量n_features: 表示有多少個屬性例如:X: [[1,2,3], [4,5,6]] => n_samples=2;n_features=3y: [1, -1]表示第一個向量的分類是1, 第二個向量的分類是-1""""""首先初始化權重為0加一是因為激活函數w0,也就是閾值,這樣就只用判斷輸出結果是否大于0就可以了"""self.w_ = np.zero(1 + X.shape[1])self.errors_ = []"""只要出現錯誤分類,那么反復訓練這個樣本,次數是n_iter"""for _ in range(self.n_iter): errors = 0"""X:[[1,2,3], [4,5,6]]y:[1, -1]zip(X, y) => [[1,2,3,1], [4,5,6-1]]"""for xi, target in zip(X,y):"""update = η * (y-y')"""update = self.eta * (target - self.predict(xi))"""xi 是一個向量, 例如[1,2,3], target表示1update 是一個常量update*xi 等價于 [Δw(1) = X[1]*update, Δw(2) = X[2]*update, Δw(3) = X[3]*update]"""# w_[1:]表示w忽略第0個元素,從第一個元素開始往后self.w_[1:] += update * xiself.w_[0] += update * 1errors += int(update != 0.0)self.errors_.append(errors)passpassdef net_input(self, X):"""z = W0*1 + W1*X1 + W2*X2+ ...+ Wn*Xn"""return np.dot(X, self.w_[1:]) + self.w_[0]def predict(self, X):"""如果self.net_input(X) >= 0.0返回1, 否則返回-1"""return np.where(self.net_input(X) >= 0.0 , 1, -1)

    目前雖然有了感知器的分類算法,但是還沒有運行起來,下面將如何使用這個感知器分類算法,然后將訓練樣本輸入到模型中,最后進行預測數據。

    介紹訓練數據

    有了基本模型后,要做的就是要把大量的數據,輸入至模型中,讓模型通過對大量數據的觀察,總結出數據中隱含的某種規律,根據數據特點不斷調節模型中神經元權重數值,當神經元的權重數值調節到合適的范圍之內后,就可以利用訓練后的模型對新的數據進行預測分類。
    首先需要先介紹訓練數據的數據結構。訓練數據內容如下:

    使用pandas工具,來讀取數據,可以很容易的進行抽取數據。
    首先安裝pandas:pip install pandas -i https://pypi.douban.com/simple

    import pandas as pdfile="./iris.csv" df = pd.read_csv(file, header=None) print(df.head())

    結果輸出如下:

    可視化展示這個數據,使用matplotlib工具進行展示。

    import matplotlib.pyplot as plt import numpy as np from test3 import df# 將df中0到100行的數據的第四列賦值給y向量 y = df.loc[0:100, 4].values # 將Iris-setosa轉為-1,其余轉為1 y = np.where(y == 'Iris-setosa', -1, 1) # print(y) # 將df0到100行的數據的第0列和第2列抽取出來,賦值給x向量 X = df.iloc[0:100, [0, 2]].values # print(X) # 將X向量的錢50條數據的第0列作為x軸,第1列作為y軸坐標,畫在二維坐標軸,畫出來的點是紅色的'o', plt.scatter(X[:50, 0], X[:50, 1], color = 'red', marker='o', label='setosa') plt.scatter(X[50:100, 0], X[50:100, 1], color = 'blue', marker='x', label='versicolor') plt.xlabel('花瓣長度') plt.ylabel('花徑長度') plt.legend(loc='upper left') # 下面兩行解決亂碼問題 plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默認字體 plt.rcParams['axes.unicode_minus'] = Falseplt.show()


    可以看出來這兩類數據可以線性分割開。

    一步一步調試

    初始化eta=0.1, w=[0 0 0]5.1,1.4,target=-1, self.net_input(x)=W0*1+W1*5.1+W2*1.4=0,self.predict(xi)=1,update=eta*(target-self.predict(xi))=0.1*(-2)=-0.2,errors=1,W=[1*(-0.2)5.1*(-0.2)1.4*(-0.2)]=[-0.2 -1.02 -0.28] 4.9,1.4,target=-1, self.net_input(x)=W0*1+W1*4.9+W2*1.4=-0.2*1+(-1.02)*4.9+(-0.28)*1.4=-0.3918432<0,self.predict(xi)=-1,update=eta*(target-self.predict(xi))=0.1*0=0,errors=1,W=[-0.2+1*0-1.02+4.9*0-0.28+1.4*0]=[-0.2 -1.02 -0.28] 4.7,1.3,target=-1, self.net_input(x)=W0*1+W1*4.7+W2*1.3=-0.2+(-4.794)+(-0.364)<0,self.predict(xi)=-1,update=0,errors=1,W=[-0.2 -1.02 -0.28] 5.4,1.7,target=-1,self.net_input(x)<0,self.predict(xi)=-1,update=0,errors=1,W=[-0.2 -1.02 -0.28] 7,4.7,target=1,self.net_input(x)<0,self.predict(xi)=-1,update=0.2,errors=2,W=[(-0.2)+(0.2*1) (-1.02)+(0.2*7) (-0.28)+(0.2*4.7)]=[0 0.38 0.66]
  • 首先得到樣本數據和分類標簽target
  • 然后計算預測標簽的值predict
  • 更新權重W=eta*(target-predict), 將上一次的權重W進行累加w(j)+Δw(j)
  • 以此類推
  • 總結

    以上是生活随笔為你收集整理的机器学习系列(一)感知器分类算法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。