阿里雲大學筆記 感知器

2021-10-08 23:06:02 字數 4300 閱讀 4549

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 生成測試...