第二章 感知機的python實現

2021-08-14 23:04:53 字數 3801 閱讀 8720

這裡是我的個人**:

本來想寫乙個關於感知機的總結,但如果要深入**,涉及的東西實在太多。僅僅淺嘗輒止的話,那我就相當於照搬原文,違背了我寫文章的初衷。

所以就單純地把我自己寫的感知機實現**發上來,輔助大家學習。

我還提供了乙個資料生成器,可以生成訓練模型所需要的資料。

簡單地對結果做了視覺化,具體繪製**見文末提供的github位址。跪求star=v=

感知機演算法用於計算得到劃分可二分資料集的超平面s。

我們定義優化函式為損失函式:

l=誤分類點到超平面s的距離和

\(d = \frac}|w \bullet + b|\)

\(l = - \sum\limits_n } (w \bullet + b)\)

採用隨機梯度下降演算法

\(\frac}} = - \sum\limits_n } \)

故對於每乙個誤分類點

\(w = w + \eta \)

輸入:w, b;

訓練:f(x)=sign(wx+b)

選取初值w0, b0

隨機選取資料(xi, yi)

如果為誤分類點,則更新

import numpy as np

import matplotlib.pyplot as plt

np.random.seed(1)

def

sign

(x):

if x > 0:

return

1; return -1

def

svg(x, y, w, b, learning_rate):

i = np.random.randint(0, x.shape[0])

# print("svg")

# print(w.shape)

# print(x[0].shape)

# print(np.dot(w, x[i]))

if y[i] * (np.dot(w, x[i]) + b) <= 0:

w = w + learning_rate * x[i].t * y[i]

b = b + learning_rate * y[i]

params =

return params

輸入:x

輸出:y=sign(wx+b)

def

predict

(x, w, b):

return sign(np.dot(w, x) + b)

dim = 2 #屬性數量

datasize = 10 #資料集大小

learning_rate = 0.1 #學習率

iterate = 1000 #迭代次數

x_train = np.array([[-1, 1], [-2, 0], [-1, 0], [-0.5, 0.5], [0, 0.5],[1, 3], [2, 3], [1, 1], [1, -0.5], [1, 0]])

x_train = x_train.reshape(10, dim, 1)

y_train = np.array([1, 1, 1, 1, 1, -1, -1, -1, -1, -1])

# print(x_train.shape)

# print(x_train[0].shape)

w = np.zeros((1, dim))

b = 0

assert(x_train.shape == (datasize, dim, 1))

assert(x_train[0].shape == (dim, 1))

assert(w.shape == (1, dim))

for x in range(iterate):

params = svg(x_train, y_train, w, b, learning_rate)

w = params['w']

b = params['b']

print(w)

print(b)

def

getdata

(rg, dim, size):

# w = np.random.rand(1, dim)

# b = np.random.randint(-rg/2, rg/2)

w = np.array([1, 1])

b = 2.5

x =

y =

for i in range(size):

x_i = np.random.rand(dim, 1) * rg - rg/2

y_i = -1

if np.dot(w, x_i) + b > 0:

y_i = 1

x = np.array(x)

y = np.array(y)

# print("getdata")

# print(x)

data =

return data

rangeofnumber = 10

#隨機數的範圍

dim = 2

#屬性數量

datasize = 1000

#資料集大小

testsize = 2000

#測試集大小

learning_rate = 0.05

#學習率

iterate = 1000

#迭代次數

data_train = getdata(rangeofnumber, dim, datasize)

x_train = data_train["x"]

y_train = data_train["y"]

# print(x_train.shape)

# print(x_train[0].shape)

w = np.zeros((1, dim))

b = 0

assert(x_train.shape == (datasize, dim, 1))

assert(x_train[0].shape == (dim, 1))

assert(w.shape == (1, dim))

for x in range(iterate):

params = svg(x_train, y_train, w, b, learning_rate)

w = params['w']

b = params['b']

print(w)

print(b)

data_test = getdata(rangeofnumber, dim, testsize)

x_test = data_test["x"]

y_test = data_test["y"]

y_predict =

for i in

range(testsize):

cnt = 0

for i in

range(testsize):

if y_test[i] == y_predict[i]:

cnt = cnt + 1

print("accuracy:%d" % (cnt / testsize * 100))

戳我的github

第二章 感知機

感知機 是根據輸入例項的特徵向量x 對其進行二類分類的線性分類模型 f x sign w,x b 感知機對應於輸入空間的分離超平面wx b 0 學習策略是極小化損失函式 損失函式對應於誤分類點到分離超平面的總距離 學習演算法是基於隨機梯度下降法的對損失函式的最優化演算法 有原始形式和對偶形式,演算法...

第二章 感知機

目錄感知機的演算法 begin sign x left 1 x geq 0 1 x 0 end right.end 假設空間 存在超平面 w cdot x b 0 使得正負樣例在超平面兩側 資料集線性可分的充分必要條件是,正負例項點所構成的凸殼互不相交 conv s lambda i x i sum...

魚書 第二章 感知機

1.感知機 接收多個輸入訊號 x1,x2,輸出乙個訊號 y w是權重,稱為 神經元 神經元或者 節點 輸入訊號分別乘以固定的權重送入到神經元,神經元計算訊號的總和,當超過設定的某個界限時,輸出1,這也稱為 神經元被啟用 其中,這個界限稱為閾值,用 表示。感知機的中的每個輸入訊號都有其固有的權重,權重...