感知机代码
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()
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。