感知机代码

cnblogs 2024-08-08 08:13:00 阅读 53

# -*- coding: utf-8 -*-

"""

Created on Wed Aug 7 20:50:03 2024

@author: 田雨

"""

# -*- coding: UTF-8 -*-

# 导入iris数据集

from sklearn.datasets import load_iris

# 导入数据划分包

from sklearn.model_selection import train_test_split

# 导入感知机模型包

from sklearn.linear_model import Perceptron

# 导入基本函数库

import matplotlib.pyplot as plt

import pandas as pd

import numpy as np

# 定义样本数量

global Sample_num

Sample_num = 100

iris = load_iris()

## 取出iris的标签

iris_target = iris.target

iris_features = pd.DataFrame(iris.data, columns=iris.feature_names)

## 将标签并入数组

iris_features['target'] = iris_target

iris_features.columns=['sepal length', 'sepal width', 'petal length', 'petal width', 'label']

# 取出样本集,使用前两个特征

x = np.array(iris_features.iloc[:Sample_num,0:2])

y = iris_target[:Sample_num]

# 切分数据集,70%训练集,30%测试集

x_train, x_test, y_train, y_test = train_test_split(x,y,test_size = 0.3)

# 定义感知机

pla = Perceptron(

fit_intercept=False, # 不计算偏置

shuffle = False # 在每个epoch重新打乱洗牌

)

# 模型训练

pla.fit(x_train,y_train)

# 输出权重和偏差

w = pla.coef_

b = pla.intercept_

print(f"权重(w) = {w}\n偏差(b) = {b}")

# 模型测试

result = pla.score(x_test,y_test)

print(f"测试结果准确率为:{result}")

#—————————————————————————— 画图——————————————————————————————

# 分开正例反例

# 正例横坐标

positive_x = [x[i,0] for i in range(Sample_num) if y[i] == 1]

# 正例纵坐标

positive_y = [x[i,1] for i in range(Sample_num) if y[i] == 1]

# 反例横坐标

negetive_x = [x[i,0] for i in range(Sample_num) if y[i] == 0]

# 反例纵坐标

negetive_y = [x[i,1] for i in range(Sample_num) if y[i] == 0]

# 画出散点图

plt.scatter(positive_x,positive_y,c='r')

plt.scatter(negetive_x,negetive_y,c='b')

# 画出超平面

line_x = np.arange(4,8)

# w[0][0]x+w[0][1]y+b=0 => 斜率:-w[0][0]/w[0][1]) 截距:-b/w[0][1]

line_y = line_x*(-w[0][0]/w[0][1])-b/w[0][1]

plt.plot(line_x,line_y)

plt.show()



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。