日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

感知机模型-原始版本【python实现】

發布時間:2025/4/16 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 感知机模型-原始版本【python实现】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概覽

感知機(perceptron)是一個二分類模型。對于輸入的特征向量,會輸出兩個類別(1和-1)。
perceptron是一個判別模型。(在1957年提出。)

數學模型

f(x)=sign(w?x+b)f(x)=sign(w·x+b)

  • xx為輸出
  • ww為權重
  • bb為偏置(bias)
  • signsign是符號函數

學習策略

  • 定義: 數據集的線性可分性。給定一個數據集合,當能找到一個w?x+1=0w?x+1=0超平面,將整個數據集完全劃分。

感知機采用的是,任何一個點到超平面的距離。

|w?x+b|w|w·x+b|‖w‖

  • 分母處為二范數

考慮誤判的點

  • (yi,xi)(yi,xi):誤判就是該是正的適合變成負的,該是負的時候變成正的了
    • yi>0yi>0 & w?xi+b<0w·xi+b<0
    • yi<0yi<0 & w?xi+b>0w·xi+b>0

整理一下,就是

yi?(w?xi+b)<0yi?(w·xi+b)<0

對于所有的誤判求個和,那就是要保證下面這個函數最小。

L(w,b)=?xiMyi?(w?xi+b)L(w,b)=?∑xi∈Myi?(w·xi+b)

MM 為誤差分類的集合。
誤差函數特性;

  • 非負
  • 連續可導(在正確地方為0,原因是這個點沒有被求和啊;在誤差的點上關于w,b是一個線性函數(只是求和了而已),自然連續可導)

通過矩陣求導(在矩陣論會學到,但是提前的話,直接用普通函數式子的求導,算出來的結果是一樣的。)

得到w的梯度和b的梯度。

感知機的原始形式

在所有點集中,選點(xi,yi)(xi,yi),如果yi(w?xi+b)0yi(w·xi+b)≤0(有誤差),那就用w+yi?xiw+yi?xi來代替原來的w。同樣,用b+yib+yi代替原來的b。

當然,一般來說會對所加梯度上,乘上一個系數,作為學習系數。(即,順著改變的動力)。

這個算法會一直進行,直到最后沒有誤差就end。

代碼

import numpy as np import matplotlib.pyplot as pltdef draw(w, b, label='before'):fontsize = 15plt.figure(1, figsize=(8, 6))plt.clf() # clear current figureplt.title(label)plt.scatter(data[:, 0], data[:, 1], c=target, cmap=plt.cm.Set1, edgecolors='k')plt.xlabel('Sepal length', fontsize=fontsize)plt.ylabel('Sepal width', fontsize=fontsize)plt.xlim(x_min, x_max)plt.ylim(y_min, y_max)ys = list(map(lambda x: (-w[0] * x + b) / w[1], [x_min, x_max]))plt.plot([x_min, x_max], ys)plt.show()if __name__ == '__main__':data = np.array([[-1, 1], [1, 3], [0, -2]])target = [-1, 1, -1]shape = data.shape# random initialnp.random.seed(5)w = np.random.random(shape[-1])b = np.random.random()x_min, x_max = data[:, 0].min() - 0.5, data[:, 0].max() + 0.5y_min, y_max = data[:, 1].min() - 0.5, data[:, 1].max() + 0.5draw(w, b)lamb = 0.5MAX_TIME = 1000for t in range(MAX_TIME):change = Falsefor i in range(shape[0]):if target[i] * (np.dot(w, data[i]) + b) <= 0:w += lamb * target[i] * data[i]b += lamb * target[i]change = Trueif not change:breakdraw(w, b, 'after')

總結

以上是生活随笔為你收集整理的感知机模型-原始版本【python实现】的全部內容,希望文章能夠幫你解決所遇到的問題。

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