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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【附源码】一看就懂的感知机算法PLA

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【附源码】一看就懂的感知机算法PLA 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AI有道

一個有情懷的公眾號

本文所有的源代碼均放在了我的GitHub上,需要的點擊文末「閱讀原文」獲取。如果對你有用的話,別忘了Fork和Star哦!

什么是感知機「Perceptron」

PLA全稱是Perceptron Linear Algorithm,即線性感知機算法,屬于一種最簡單的感知機(Perceptron)模型。

感知機模型是機器學習二分類問題中的一個非常簡單的模型。它的基本結構如下圖所示:

其中,xi 是輸入, wi?表示權重系數, b 表示偏移常數。感知機的線性輸出為:

為了簡化計算,通常我們將 b 作為權重系數的一個維度,即 w0 。同時,將輸入 x 擴展一個維度,為1。這樣,上式簡化為:

scores 是感知機的輸出,接下來就要對 scores 進行判斷:

  • 若 scores≥0 ,則 y_pred=1 「正類」

  • 若 scores<0 ,則 y_pred=?1 「負類」

線性得分計算閾值比較兩個過程組成,最后根據比較結果判斷樣本屬于正類還是負類。

PLA理論解釋

對于二分類問題,可以使用感知機模型來解決。PLA的基本原理就是逐點修正,首先在超平面上隨意取一條分類面,統計分類錯誤的點;然后隨機對某個錯誤點就行修正,即變換直線的位置,使該錯誤點得以修正;接著再隨機選擇一個錯誤點進行糾正,分類面不斷變化,直到所有的點都完全分類正確了,就得到了最佳的分類面。

利用二維平面例子來進行解釋,第一種情況是錯誤地將正樣本「y=+1」分類為負樣本「y=-1」。此時,wx<0,即w與x的夾角大于90度,分類線?l?的兩側。修正的方法是讓夾角變小,修正w值,使二者位于直線同側:

修正過程示意圖如下所示:

第二種情況是錯誤地將負樣本「y=-1」分類為正樣本「y=+1」。此時, wx>0 ,即 w 與 x 的夾角小于90度,分類線 l 的同一側。修正的方法是讓夾角變大,修正 w 值,使二者位于直線兩側:

修正過程示意圖如下所示:

經過兩種情況分析,我們發現PLA每次 w 的更新表達式都是一樣的: w:=w+yx 。掌握了每次 w 的優化表達式,那么PLA就能不斷地將所有錯誤的分類樣本糾正并分類正確。

數據準備

該數據集包含了100個樣本,正負樣本各50,特征維度為2。

import numpy as np import pandas as pddata = pd.read_csv('./data/data1.csv', header=None) # 樣本輸入,維度(100,2) X = data.iloc[:,:2].values # 樣本輸出,維度(100,) y = data.iloc[:,2].values

下面我們在二維平面上繪出正負樣本的分布情況。

import matplotlib.pyplot as pltplt.scatter(X[:50, 0], X[:50, 1], color='blue', marker='o', label='Positive') plt.scatter(X[50:, 0], X[50:, 1], color='red', marker='x', label='Negative') plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.legend(loc = 'upper left') plt.title('Original Data') plt.show()

PLA算法

首先分別對兩個特征進行歸一化處理,即:

其中, μ 是特征均值, σ 是特征標準差。

# 均值 u = np.mean(X, axis=0) # 方差 v = np.std(X, axis=0)X = (X - u) / v# 作圖 plt.scatter(X[:50, 0], X[:50, 1], color='blue', marker='o', label='Positive') plt.scatter(X[50:, 0], X[50:, 1], color='red', marker='x', label='Negative') plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.legend(loc = 'upper left') plt.title('Normalization data') plt.show()

接下來對預測直線進行初始化,包括權重 w 初始化:

# X加上偏置項 X = np.hstack((np.ones((X.shape[0],1)), X)) # 權重初始化 w = np.random.randn(3,1)

接下來,計算scores,得分函數與閾值0做比較,大于零則 y? =1 ,小于零則 y? =?1。

s = np.dot(X, w) y_pred = np.ones_like(y) ? ?# 預測輸出初始化 loc_n = np.where(s < 0)[0] ? ?# 大于零索引下標 y_pred[loc_n] = -1

接著,從分類錯誤的樣本中選擇一個,使用PLA更新權重系數 w。

# 第一個分類錯誤的點 t = np.where(y != y_pred)[0][0] # 更新權重w w += y[t] * X[t, :].reshape((3,1))

更新權重 w 是個迭代過程,只要存在分類錯誤的樣本,就不斷進行更新,直至所有的樣本都分類正確(注意,前提是正負樣本完全可分)。

整個迭代訓練過程如下:

for i in range(100):s = np.dot(X, w)y_pred = np.ones_like(y)loc_n = np.where(s < 0)[0]y_pred[loc_n] = -1num_fault = len(np.where(y != y_pred)[0])print('第%2d次更新,分類錯誤的點個數:%2d' % (i, num_fault))if num_fault == 0:breakelse:t = np.where(y != y_pred)[0][0]w += y[t] * X[t, :].reshape((3,1))

迭代完畢后,得到更新后的權重系數 w ,繪制此時的分類直線是什么樣子。

# 直線第一個坐標(x1,y1) x1 = -2 y1 = -1 / w[2] * (w[0] * 1 + w[1] * x1) # 直線第二個坐標(x2,y2) x2 = 2 y2 = -1 / w[2] * (w[0] * 1 + w[1] * x2) # 作圖 plt.scatter(X[:50, 1], X[:50, 2], color='blue', marker='o', label='Positive') plt.scatter(X[50:, 1], X[50:, 2], color='red', marker='x', label='Negative') plt.plot([x1,x2], [y1,y2],'r') plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.legend(loc = 'upper left') plt.show()

其實,PLA算法的效率還算不錯,只需要數次更新就能找到一條能將所有樣本完全分類正確的分類線。所以得出結論,對于正負樣本線性可分的情況,PLA能夠在有限次迭代后得到正確的分類直線。

總結與疑問

本文導入的數據本身就是線性可分的,可以使用PLA來得到分類直線。但是,如果數據不是線性可分,即找不到一條直線能夠將所有的正負樣本完全分類正確,這種情況下,似乎PLA會永遠更新迭代下去,卻找不到正確的分類線。

對于線性不可分的情況,該如何使用PLA算法呢?我們下次將對PLA進行改進和優化。

喜歡我的文章就點個贊、點個廣告吧。

推薦閱讀

【1】干貨 | 林軒田機器學習「基石+技法」歷史文章匯總

【2】干貨 | 吳恩達deeplearning.ai專項課程歷史文章匯總

【3】簡單的梯度下降算法,你真的懂了嗎?

【4】力薦 | 臺大林軒田《機器學習基石》資源匯總

【5】機器學習中的維度災難

長按二維碼

掃描關注

總結

以上是生活随笔為你收集整理的【附源码】一看就懂的感知机算法PLA的全部內容,希望文章能夠幫你解決所遇到的問題。

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