溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python中怎么模擬感知機(jī)算法

發(fā)布時(shí)間:2021-07-10 13:45:05 來源:億速云 閱讀:209 作者:Leah 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)python中怎么模擬感知機(jī)算法,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

  1. 通過梯度下降模擬感知機(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é)果如圖
python中怎么模擬感知機(jī)算法
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é)果如圖
python中怎么模擬感知機(jī)算法

看完上述內(nèi)容,你們對(duì)python中怎么模擬感知機(jī)算法有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(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)容。

AI