import numpy as np
import pandas as pd
data=pd.read_csv(
"data/iris.csv"
)data.head(
)
sepallength
sepalwidth
petallength
petalwidth
name
05.1
3.51.4
0.2iris-setosa
14.9
3.01.4
0.2iris-setosa
24.7
3.21.3
0.2iris-setosa
34.6
3.11.5
0.2iris-setosa
45.0
3.61.4
0.2iris-setosa
data.drop_duplicates(inplace=
true
)#因為感知器**結果為1與-1,所以對映為1與-1
data[
"name"
]=data[
"name"].
map(
)#data["name"].value_counts()
data=data[data[
"name"]!=
0]len(data)
97
class
perceptron
:"""感知器演算法,實現二分類"""
def__init__
(self,alpha,times)
:"""
初始化函式
alpha: float 學習率
times:int 迭代次數
"""self.alpha=alpha
self.times=times
defstep
(self,z)
:"""
階躍函式:
引數:z:類陣列型別(或者是標量型別)
returns:
value:int
如果z>=0,則返回1,否則返回-1。
"""# return 1 if z>=0 else 0 只針對標量
return np.where(z>=0,
1,-1
)def
fit(self,x,y)
:
x=np.asarray(x)
y=np.asarray(y)
#建立權重向量,初始值為0,長度比特徵多1(多出來的是截距)
self.w_=np.zeros(
1+x.shape[1]
)#建立損失列表,用來儲存每次跟新後的損失值
self.loss_=
#迴圈指定次數
for i in
range
(self.times)
:"""
感知器vs邏輯回歸:
邏輯回歸:使用所有樣本計算梯度,更新損失值。
感知器:使用單個樣本一次計算梯度,更新損失值。
"""loss=
0for x,target in
zip(x,y)
:#計算**值
y_hat=self.step(np.dot(x,self.w_[1:
])+self.w_[0]
) loss+=y_hat!=target
#更新權重:w(j)=w(j)+學習率*(真實值-**值)*x(j)
self.w_[0]
+=self.alpha*
(target-y_hat)
self.w_[1:
]+=self.alpha*
(target-y_hat)
*x #將迴圈累計的誤差值加到誤差列表中
defpredict
(self,x)
:return self.step(np.dot(x,self.w_[1:
])+self.w_[0]
)
t1=data[data[
"name"]==
1]t2=data[data[
"name"]==
-1]t1=t1.sample(
len(t1)
,random_state=
666)
t2=t2.sample(
len(t2)
,random_state=
666)
x_train=pd.concat(
[t1.iloc[:40
,:-1
],t2.iloc[:40
,:-1
]],axis=0)
y_train=pd.concat(
[t1.iloc[:40
,-1]
,t2.iloc[:40
,-1]
],axis=0)
x_test=pd.concat(
[t1.iloc[40:
,:-1
],t2.iloc[40:
,:-1
]],axis=0)
y_test=pd.concat(
[t1.iloc[40:
,-1]
,t2.iloc[40:
,-1]
],axis=
0)
p=perceptron(
0.1,10)
p.fit(x_train,y_train)
result=p.predict(x_test)
display(result)
display(y_test.values)
display(p.w_)
display(p.loss_)
array([ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1])
array([ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1],
dtype=int64)
array([-0.2 , -0.4 , -1. , 1.84, 0.84])
[1, 2, 2, 2, 0, 0, 0, 0, 0, 0]
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcparams[
"font.family"]=
"simhei"
mpl.rcparams[
"axes.unicode_minus"]=
false
#繪製真實值
plt.plot(y_test.values,
'ro'
,ms=
15,label=
"真實值"
)#繪製**值
plt.plot(result,
'gx'
,ms=
15,label=
"**值"
)plt.title(
"感知器二分類"
)plt.xlabel(
"樣本序號"
)plt.ylabel(
"類別"
#繪製目標函式損失值
plt.plot(
range(1
,p.times+1)
,p.loss_,
"o-"
,label=
"損失值"
)plt.title(
"損失函式"
)plt.xlabel(
"迭代次數"
)plt.ylabel(
"損失值"
學習筆記 感知器 單層感知器舉例
在人體神經網路中,神經細胞是有著基本處理訊號功能的基本單元,單層感知器就是人工神經網路中模擬人體神經細胞的基本單元。單層感知器 單層感知器是最簡單的神經網路,它包含輸入層和輸出層,訊號先經過線性組合器處理然後再經過啟用函式,最後輸出結果。1 輸入節點 input 輸入節點是訊號的輸入端,感知器可以有...
感知器學習筆記
感知器 perceptron 是一種用於線性可分資料集的二類分類器演算法。這種演算法的侷限性很大 只能將資料分為 2 類 資料必須是線性可分的 雖然有這些侷限,但是感知器是 ann 和 svm 的基礎,理解了感知器的原理,對學習ann 和 svm 會有幫助,所以還是值得花些時間的。感知器可以表示為 ...
感知器演算法
coding utf 8 created on thu oct 15 13 58 06 2015 author think 感知器演算法 import mkdata as mk import numpy as np import matplotlib.pyplot as plt n 100 生成測試...