機器學習初探 感知機模型理解與簡單例項

2021-09-16 13:38:18 字數 3621 閱讀 8193

假設我們有以下兩種標籤的二維資料,標籤分別為-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...