日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

感知机实现

發布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 感知机实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

感知機算法原理

感知機學習算法的原始形式:
輸入:T=(x1,y1),...,(xn,yn)T={(x_1,y_1),...,(x_n,y_n)}T=(x1?,y1?),...,(xn?,yn?)其中,xix_ixi?屬于RnR^nRnyiy_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數據集中的類別為三類,我們只選取前兩類。
下面是對數據處理的代碼:

#導入所需要的功能包 import numpy as np from sklearn.datasets import load_iris import matplotlib.pyplot as plt #載入數據集 iris_data = load_iris() print(iris_data.feature_names) #得到數據集的數據部分 iris = iris_data.data iris_length = iris[:,0]#取得特征向量的第一維 iris_width = iris[:,1]#取得特征向量的第二維 targets = iris_data.target#數據集中的類別集合 iris_length_0 = iris_length[targets==0]#選取類別為0的數據 iris_width_0 = iris_width[targets==0] iris_length_1 = iris_length[targets==1]#選取類別為1的數據 iris_width_1 = iris_width[targets==1] T = [] #使用for循環將訓練數據改為(x1,x2,y)的形式 for i in range(len(iris_length_0)):T.append([iris_length_0[i],iris_width_0[i],-1]) for i in range(len(iris_length_1)):T.append([iris_length_1[i],iris_width_1[i],1]) T = np.array(T) #繪制兩個類別的點 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') plt.legend()

最后就是使用模型和數據進行驗證了:

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源代碼

總結

以上是生活随笔為你收集整理的感知机实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。