Python 實現簡單的感知機演算法

2022-08-03 07:39:08 字數 2445 閱讀 9178

隨機生成一些點和一條原始直線,然後用感知機演算法來生成一條直線進行分類,比較差別

import

numpy as np

import

matplotlib.pyplot as plt

%matplotlib inline

plt.rcparams[

'font.sans-serif

'] = ['

simhei

'] #

用來正常顯示中文標籤

plt.rcparams['

axes.unicode_minus

'] = false #

用來正常顯示負號

plt.rcparams['

figure.figsize

'] = (8.0,6.0) #

生成圖的大小

fig = plt.figure() #

產生新畫布

figa = plt.gca() #

獲取當前畫布

#產生100個點

n = 100xn = np.random.rand(n,2)

x = np.linspace(0,1) #

linspace函式可以生成元素為50的等差數列

#隨機生成一條直線

a =np.random.rand()

b =np.random.rand()

f = lambda x:a*x+b

#線性分割前面產生的點

yn = np.zeros([n,1])

for i in

range(n):

if(f(xn[i,0])>=xn[i,1]):

yn[i] = 1plt.plot(xn[i,0],xn[i,1],'

bo',markersize=12) #

'bo':用藍色圓圈標記

if(f(xn[i,0])]):

yn[i] = -1plt.plot(xn[i,0],xn[i,1],'

go',markersize=12) #

'go':用綠色圓圈標記

'''實現乙個二維感知機

對於給定的(x,y),感知機將通過迭代尋找最佳的超平面來進行分類

輸入:xn:資料點 n*2 向量

yn:分類結果 n*1 向量

maxiter:最大迭代次數(可選引數)

a:學習率(可選引數)

w:初始值(可選引數)

輸出:w:超平面引數使得 y=ax+b 最好地分割平面

注意:由於初始值為隨機選取,因此迭代到收斂可能需要一點時間

該函式僅為感知機的簡單實現,實際需要考慮更多的內容

'''n =xn.shape[0]

#生成超平面

f = lambda x:np.sign(w[0]*1+w[1]*x[0]+w[2]*x[1])

#反向傳播

for _ in

range(maxiter):

i =np.random.randint(n)

if(yn[i]!=f(xn[i,:])):

w[0] = w[0] + yn[i]*a*1w[1] = w[1] + yn[i]*a*xn[i,0]

w[2] = w[2] + yn[i]*a*xn[i,1]

return w

w =perceptron(xn,yn)

#利用權重w,計算 y=ax+b 中的a,b

new_b = -w[0] / w[2]

new_a = -w[1] / w[2]

y = lambda x:new_a*x+new_b

#分割顏色

sep_color = (yn) / 2.0plt.figure()

figa =plt.gca()

plt.scatter(xn[:,0],xn[:,1],c=sep_color.flatten(),s=50) #

s:表示點的大小

plt.plot(x,y(x),'

b--',label='

感知機分類結果')

plt.plot(x,f(x),'r

',label='

原始分類曲線')

plt.legend()

plt.title(

'原始曲線與感知機分類結果近似比較')

text(0.5, 1.0, '

原始曲線與感知機分類結果近似比較

感知機(Python實現,簡單)

usr bin python coding utf 8 importrandom fromnumpyimport importnumpyasnp deftraining train data1 3,3,1 4,3,1 正樣本 train data2 1,1,1 負樣本 train datas tra...

簡單感知機Python實現

import numpy as np import matplotlib.pyplot as plt plt.rcparams font.sans serif simhei 用來正常顯示中文標籤 plt.rcparams axes.unicode minus false 用來正常顯示負號 plt.r...

簡單感知機的實現

感知機演算法初步實現 import numpy as np 階躍函式 deff y return 1if y 0else 0def and x np.array 0,0 0,1 1,0 1,1 資料集 w np.array 0.038 0.044 c 0.042 閾值 a 0.015 學習速率a b...