您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)python中怎么模擬感知機(jī)算法,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
通過梯度下降模擬感知機(jī)算法。數(shù)據(jù)來源于sklearn.datasets中經(jīng)典數(shù)據(jù)集。
import numpy as np import pandas as pd # 導(dǎo)入數(shù)據(jù)集load_iris。 # 其中前四列為花萼長(zhǎng)度,花萼寬度,花瓣長(zhǎng)度,花瓣寬度等4個(gè)用于識(shí)別鳶尾花的屬性, from sklearn.datasets import load_iris import matplotlib.pyplot as plot # load data iris = load_iris() # 構(gòu)造函數(shù)DataFrame(data,index,columns),data為數(shù)據(jù),index為行索引,columns為列索引 # 構(gòu)造數(shù)據(jù)結(jié)構(gòu) df = pd.DataFrame(data=iris.data, columns=iris.feature_names) # 在df中加入了新的一列:列名label的數(shù)據(jù)是target,即類型 # 第5列為鳶尾花的類別(包括Setosa,Versicolour,Virginica三類)。 # 也即通過判定花萼長(zhǎng)度,花萼寬度,花瓣長(zhǎng)度,花瓣寬度的尺寸大小來識(shí)別鳶尾花的類別。 df['label'] = iris.target df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label'] # 打印出label列值對(duì)應(yīng)的數(shù)量。以及列名稱、類型 # print(df.label.value_counts()) # 創(chuàng)建數(shù)組, # 第一個(gè)參數(shù):100表示取0-99行,即前100行;但100:表示100以后的所有數(shù)據(jù)。 # 第二個(gè)參數(shù),0,1表示第一列和第二列,-1表示最后一列 data = np.array(df.iloc[:100, [0, 1, -1]]) # 數(shù)組切割,X切除了最后一列;y僅切最后一列 X, y = data[:, :-1], data[:, -1] # 數(shù)據(jù)整理,將y中非1的改為-1 y = np.array([1 if i == 1 else -1 for i in y]) # 數(shù)據(jù)線性可分,二分類數(shù)據(jù) # 此處為一元一次線性方程 class Model: def __init__(self): # w初始為自變量個(gè)數(shù)相同的(1,1)陣 self.w = np.ones(len(data[0]) - 1, dtype=np.float32) self.b = 0 # 學(xué)習(xí)率設(shè)置為0.1 self.l_rate = 0.1 def sign(self, x, w, b): # dot函數(shù)為點(diǎn)乘,區(qū)別于*乘。 # dot對(duì)矩陣運(yùn)算的時(shí)候?yàn)榫仃嚦朔?,一行乘一列? # *乘對(duì)矩陣運(yùn)算的時(shí)候,是對(duì)應(yīng)元素相乘 y = np.dot(x, w) + b return y # 隨機(jī)梯度下降法 def fit(self, X_train, y_train): is_wrong = False while not is_wrong: # 記錄當(dāng)前的分類錯(cuò)誤的點(diǎn)數(shù),當(dāng)分類錯(cuò)誤的點(diǎn)數(shù)歸零的時(shí)候,即分類結(jié)束 wrong_count = 0 # d從0-49遍歷 for d in range(len(X_train)): # 這里的X為一行兩列數(shù)組 X = X_train[d] y = y_train[d] if y * self.sign(X, self.w, self.b) <= 0: self.w = self.w + self.l_rate * np.dot(y, X) self.b = self.b + self.l_rate * y wrong_count += 1 if wrong_count == 0: is_wrong = True return 'Perceptron Model!' def score(self): pass perceptron = Model() # 對(duì)perception進(jìn)行梯度下降 perceptron.fit(X, y) print(perceptron.w) x_points = np.linspace(4, 7, 10) # 最后擬合的函數(shù)瑞如下: # w1*x1 + w2*x2 + b = 0 # 其中x1就是下邊的x_points,x2就是y_ y_ = -(perceptron.w[0] * x_points + perceptron.b) / perceptron.w[1] plot.plot(x_points, y_) # scatter兩個(gè)屬性分別對(duì)應(yīng)于x,y。 # 先畫出了前50個(gè)點(diǎn)的花萼長(zhǎng)度寬度,這時(shí)的花類型是0; # 接著畫50-100,這時(shí)花類型1 plot.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0') plot.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1') # 橫坐標(biāo)名稱 plot.xlabel('sepal length') # 縱坐標(biāo)名稱 plot.ylabel('sepal width') plot.legend() plot.show()
結(jié)果如圖
2. sklearn中提供了現(xiàn)成的感知機(jī)方法,我們可以直接調(diào)用
import sklearn import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.linear_model import Perceptron iris = load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) df['label'] = iris.target # df.columns = [ # 'sepal length', 'sepal width', 'petal length', 'petal width', 'label' # ] data = np.array(df.iloc[:100, [0, 1, -1]]) X, y = data[:, :-1], data[:, -1] y = np.array([1 if i == 1 else -1 for i in y]) clf = Perceptron(fit_intercept=True, # true表示估計(jì)截距 max_iter=1000, # 訓(xùn)練數(shù)據(jù)的最大次數(shù) shuffle=True, # 每次訓(xùn)練之后是否重新訓(xùn)練 tol=None) # 如果不設(shè)置none那么迭代將在誤差小于1e-3結(jié)束 clf.fit(X, y) # 輸出粘合之后的w print(clf.coef_) # 輸出擬合之后的截距b print(clf.intercept_) # 畫布大小 plt.figure(figsize=(10, 10)) # 中文標(biāo)題 # plt.rcParams['font.sans-serif'] = ['SimHei'] # plt.rcParams['axes.unicode_minus'] = False # plt.title('鳶尾花線性數(shù)據(jù)示例') plt.scatter(data[:50, 0], data[:50, 1], c='b', label='Iris-setosa',) plt.scatter(data[50:100, 0], data[50:100, 1], c='orange', label='Iris-versicolor') # 畫感知機(jī)的線 x_ponits = np.arange(4, 8) y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1] plt.plot(x_ponits, y_) # 其他部分 plt.legend() # 顯示圖例 plt.grid(False) # 不顯示網(wǎng)格 plt.xlabel('sepal length') plt.ylabel('sepal width') plt.legend() plt.show()
結(jié)果如圖
看完上述內(nèi)容,你們對(duì)python中怎么模擬感知機(jī)算法有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。