感知机实现
感知機算法原理
感知機學習算法的原始形式:
輸入:T=(x1,y1),...,(xn,yn)T={(x_1,y_1),...,(x_n,y_n)}T=(x1?,y1?),...,(xn?,yn?)其中,xix_ixi?屬于RnR^nRn,yiy_iyi?屬于{-1,1},i = 1,2,3,…,N;學習率a(0<a<=1)
輸出:w,b;
模型為f(x)=sign(w?x+b)f(x)=sign(w*x+b)f(x)=sign(w?x+b)
(1)設定處置w0,b0w_0,b_0w0?,b0?
(2)在訓練集中選取數據(xi,yi)(x_i,y_i)(xi?,yi?)
(3)如果yi(w?xi+b)<=0y_i(w*x_i+b)<=0yi?(w?xi?+b)<=0:
wi+1=wi+ayixiw_{i+1}=w_i+ay_ix_i wi+1?=wi?+ayi?xi?
bi+1=bi+ayib_{i+1}=b_i+ay_ibi+1?=bi?+ayi?
(4)轉至第(2)步直到訓練集中沒有誤分類點
定義一個感知機的類:
class Model:#定義模型類def __init__(self,data):#構造函數self.w = np.zeros(len(data[0])-1,dtype=np.float32)#為w賦初值大小為訓練數據集的x的維度print(self.w)self.b = 0#設置b的初值self.learn_rate = 0.1#設置學習率def sign(self,x,w,b):#定義模型函數f(x)=w*x + by = np.dot(w,x.T) + breturn ydef fit(self,x_train,y_train):#定義訓練函數is_wrong = False#設置循環控制變量while not is_wrong:wrong_count = 0#分類錯誤點的計數for d in range(len(x_train)):#遍歷提供的訓練集x = x_train[d]y = y_train[d]if (y*self.sign(x,self.w,self.b)) <= 0:#判斷更新參數的條件wrong_count += 1#分類錯誤點加一#更新兩個參數w,bself.w = self.w + self.learn_rate*np.dot(y,x)self.b = self.b + self.learn_rate*yif wrong_count == 0:#判斷是否還有分類錯誤點。is_wrong = Truereturn 'perceptron Model'具體訓練流程:進入循環遍歷所有的數據點并對每一個進行判斷,如果分類錯誤,錯誤的計數加一,然后更新兩個參數,直到遍歷完所有的數據點。如果錯誤計數不為0,說明還有錯誤點存在,利用新的參數再去遍歷所有數據點重復同樣的操作,直到數據集中沒有分類錯誤的數據。
模型已經編寫完畢,下面就要使用特定的數據進行測試:
采用sklearn中的iris的數據集來進行測試,在iris數據集中的特征向量是四維的,不利于顯示觀看,所以選取特征向量的前兩個特征,作為感知機輸入的特征向量。并且在iris數據集中的類別為三類,我們只選取前兩類。
下面是對數據處理的代碼:
最后就是使用模型和數據進行驗證了:
perceptron = Model(T) perceptron.fit(T[:,0:2],T[:,2]) #將訓練后的參數在圖像中顯示出來 x = np.linspace(4,7,10) y = -(perceptron.w[0]*x+perceptron.b)/perceptron.w[1] plt.plot(x,y) plt.scatter(T[T[:,2]==-1][:,0],T[T[:,2]==-1][:,1],label='0') plt.scatter(T[T[:,2]==1][:,0],T[T[:,2]==1][:,1],label='0')github源代碼
總結
- 上一篇: 如何将图片中的一个任意四边形区域的图像转
- 下一篇: 陈润生院士:我给自己取了个微信名,叫“微