假設我們有以下兩種標籤的二維資料,標籤分別為-1/1,我們想通過訓練到一條直線將它們很好的分開。
這條直線可能是以下這樣。
當然也可能是以下這樣。
甚至可能是斜率為負的直線。我們發現,有很多這樣的直線可以將它們分開(這裡舉例是乙個簡單的例子)
那麼,我們如何通過訓練找到其中一條直線,可以將兩類很好的分開呢?這裡可以用感知機的方法,這個例子是學習感知機最熟悉的配方。
規定step function對加權結果的對映作用為:
在理解以上的基礎上,我們還需要知道感知機是乙個監督學習的過程,只適用於二進位制神經元。
介紹訓練過程前,我們規定
學習訊號=期望輸出-實際輸出
這裡我們可以理解為真實結果/標籤與我們當前訓練結果/訓練標籤的差距。
訓練過程其實是乙個不斷調整權重的過程,這裡權重就是分界線的係數。
了解以上,訓練過程如下:
運用感知機,我們對之前提到的二分類問題進行分類,**如下:1. 初始話權重向量w0,可以設定為隨機數等。但是要位於【-1,1】之間。
2. 指定學習率lr,介於(0,1)間。注意學習率過小,收斂速度較慢。但是如果較大,容易在達到期望輸出時產生波動。
3. 開始以下迭代
3.1 計算學習訊號 r = d(期望輸出)-f(w'x)(訓練輸出)
3.2 計算權重調整 deltaw = lr*(d-r')*x
3.3 更新權重 w0 = w0+deltaw
4.不斷訓練直到訓練輸出==期望輸出,或者正確率達到某個條件。
迭代過程:## 感知機模型例項
import numpy as np
import matplotlib.pyplot as plt
def perceptron(x,y,weight,train_nums,lr):
# 在訓練次數內,進行以下迭代
for nums in range(train_nums):
# 計算當前權重下的線性加權結果
current_outcome = x.dot(weight)
# 將當前線性加權結果進行sigmod
current_outcome = np.sign(current_outcome)
# 根據實際輸出與期望輸出的差值調整權重
delatw = lr*(y-current_outcome.t).dot(x)
# 調整權重
weight = weight+delatw
print(current_outcome)
# 判斷訓練輸出結果和期望輸出結果是否相同
if (y == current_outcome).all():
break
return weight
if __name__ == "__main__":
# 設定訓練集
x = np.array([[1,4,3],[1,5,4],[1,4,5],[1,1,1],[1,2,1],[1,3,2]])
y = np.array([1,1,1,-1,-1,-1])
# 設定訓練次數和學習率,初始權重([-1,1])
train_nums = 100
lr = 0.1
np.random.seed(4)
weight = 2*(np.random.random(3)-0.5)
# 開始訓練
w = perceptron(x,y,weight,train_nums,lr)
# 輸出分界線並繪圖
x1 = np.array([1,6])
x2 = (-w[1]/w[2])*x1-w[0]/w[2]
plt.plot(x1,x2)
plt.plot(x[:,1][0:3],x[:,2][0:3],'ro')
plt.plot(x[:,1][3:6],x[:,2][3:6],'b*')
plt.show()
[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. 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.]
[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. -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.]
lr = 0.2;
w0 = 2*(rand(3,1)-0.5);
x = [1 4 3;1 5 4;1 4 5;1 1 1; 1 2 1;1 3 2];
y = [1,1,1,-1,-1,-1];
for nums = 1:100
current_out = x*w0;
deltaw = lr*(y-current_out')*x;
w0 = w0 + deltaw';
disp(current_out)
if current_out == y
break
endend
機器學習 感知機模型
感知機模型,主要的思想是用乙個函式,通過不斷的調節權值和偏置的數值,將乙個線性可分的集合分類 感知機演算法 fx sign w x b sign 1 x 0,1 x 0 對於最優的w,b的值,採用了損失函式 l w,b sum xi 屬於 m yi w xi b m 為錯誤分類點的集合 感知機學習演...
機器學習 感知機模型
目錄感知機 perceptron 是二類分類的線性分類模型,其輸入為例項的特徵向量,輸出為例項的類別,取 1 和 1 二值.感知機對應於輸入空間 特徵空間 中將例項劃分為正負兩類的分離超平面,屬於判別模型.感知機學習旨在求出將訓練資料進行線性劃分的分離超平面,為此匯入基於誤分類的損失函式,利用梯度下...
機器學習 手寫感知機模型
資料集來自mnist資料集,主要利用numpy裡的matrix矩陣計算。演算法的實現主要在於對引數w和b的求解。演算法的推導過程參考李航 統計學習方法 推導最優化函式然後更新引數的過程。import numpy as np import pandas as pd import time defdat...