Bohrium
robot
新建

空间站广场

论文
Notebooks
比赛
课程
Apps
我的主页
我的Notebooks
我的论文库
我的足迹

我的工作空间

任务
节点
文件
数据集
镜像
项目
数据库
公开
教学案例|机器学习感知机模型
感知器
感知器
MileAway
发布于 2023-10-15
推荐镜像 :Basic Image:bohrium-notebook:2023-04-07
推荐机型 :c2_m4_cpu
赞 2
2
感知机模型
1. 导入所需库
2. 创建数据集
3. 训练感知机模型
4. 验证模型
5. 可视化分类结果
感知机模型存在的问题
创建环形数据集
训练感知机模型
可视化分类结果

感知机模型

感知机模型(Perceptron Model)是一个简单的线性分类模型,它的原理是将输入的特征向量与权重向量进行线性组合,然后通过激活函数(如阶跃函数)将结果映射到输出类别(如0或1)。在本教程中,我们将使用sklearn库创建一个简单的二分类数据集,并使用感知机模型进行分类,并可视化分类效果。

代码
文本

1. 导入所需库

首先,让我们导入所需的库。

代码
文本
[1]
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.linear_model import Perceptron
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
代码
文本

2. 创建数据集

接下来,我们将使用sklearnmake_classification()函数创建一个简单的二分类数据集。

代码
文本
[2]
# 创建二分类数据集
n_samples = 100
X, y = make_blobs(n_samples=n_samples, centers=2, random_state=0,cluster_std=0.7)
# 可视化数据集
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', edgecolors='k')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Generated Classification Dataset')
plt.show()
代码
文本

3. 训练感知机模型

在训练感知机模型之前,我们需要将数据集拆分为训练集和测试集。我们将使用sklearntrain_test_split()函数来完成这个任务。

代码
文本
[3]
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 创建感知机模型
perceptron = Perceptron(tol=1e-3, random_state=0)

# 训练感知机模型
perceptron.fit(X_train, y_train)
Perceptron()
代码
文本

4. 验证模型

使用测试集验证感知机模型的性能。

代码
文本
[4]
# 预测测试集
y_pred = perceptron.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy: {:.2f}'.format(accuracy))

# # 计算混淆矩阵
# cm = confusion_matrix(y_test, y_pred)
# print('Confusion Matrix:\n', cm)
Accuracy: 0.95
代码
文本

5. 可视化分类结果

现在,我们将可视化感知机模型的分类结果。

代码
文本
[5]
train_accuracy = perceptron.score(X_train, y_train)
test_accuracy = perceptron.score(X_test, y_test)

def plot_decision_boundary(model, X, y, title, accuracy, ax):
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.1),
np.arange(x2_min, x2_max, 0.1))

Z = model.predict(np.c_[xx1.ravel(), xx2.ravel()])
Z = Z.reshape(xx1.shape)

ax.contourf(xx1, xx2, Z, alpha=0.4, cmap='viridis')
ax.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap='viridis')
ax.set_xlabel('Feature 1')
ax.set_ylabel('Feature 2')
ax.set_title(title)

# 添加准确率文本
ax.text(0.5, 0.9, f'Accuracy: {accuracy * 100:.2f}%',
fontsize=12, ha='center', va='center', transform=ax.transAxes)

fig, axes = plt.subplots(1, 2, figsize=(12, 4))

plot_decision_boundary(perceptron, X_train, y_train, "Perceptron Model Classification Results (Train)", train_accuracy, axes[0])
plot_decision_boundary(perceptron, X_test, y_test, "Perceptron Model Classification Results (Test)", test_accuracy, axes[1])

plt.tight_layout()
plt.show()
代码
文本

感知机模型存在的问题

代码
文本

感知机最主要的问题,是感知机算法只能处理线性可分问题,即只能为线性可分数据找到一个线性分类器。对于线性不可分数据,感知机算法无法收敛,也就无法找到合适的分类器。

alt image-20231016071104784.png

代码
文本

我们可以用同样的方法来查看一下感知机在非线性数据集上的表现,让我们来创建一个环形数据集。

代码
文本

创建环形数据集

代码
文本
[6]
from sklearn.datasets import make_circles, make_moons

# 创建环形数据集
n_samples = 100
X, y = make_circles(n_samples=n_samples, noise=0.05, random_state=0)
# 创建月亮型数据集
# X, y = make_moons(n_samples=n_samples, noise=0.1, random_state=0)

# 可视化数据集
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', edgecolors='k')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Generated Classification Dataset')
plt.show()
代码
文本

训练感知机模型

代码
文本
[7]
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 创建感知机模型
perceptron = Perceptron(tol=1e-3, random_state=0)

# 训练感知机模型
perceptron.fit(X_train, y_train)

# 预测测试集
y_pred = perceptron.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy: {:.2f}'.format(accuracy))

# # 计算混淆矩阵
# cm = confusion_matrix(y_test, y_pred)
# print('Confusion Matrix:\n', cm)
Accuracy: 0.45
代码
文本

可视化分类结果

代码
文本
[8]
train_accuracy = perceptron.score(X_train, y_train)
test_accuracy = perceptron.score(X_test, y_test)

def plot_decision_boundary(model, X, y, title, accuracy, ax):
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.1),
np.arange(x2_min, x2_max, 0.1))

Z = model.predict(np.c_[xx1.ravel(), xx2.ravel()])
Z = Z.reshape(xx1.shape)

ax.contourf(xx1, xx2, Z, alpha=0.4, cmap='viridis')
ax.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap='viridis')
ax.set_xlabel('Feature 1')
ax.set_ylabel('Feature 2')
ax.set_title(title)

# 添加准确率文本
ax.text(0.5, 0.9, f'Accuracy: {accuracy * 100:.2f}%',
fontsize=12, ha='center', va='center', transform=ax.transAxes)

fig, axes = plt.subplots(1, 2, figsize=(12, 4))

plot_decision_boundary(perceptron, X_train, y_train, "Perceptron Model Classification Results (Train)", train_accuracy, axes[0])
plot_decision_boundary(perceptron, X_test, y_test, "Perceptron Model Classification Results (Test)", test_accuracy, axes[1])

plt.tight_layout()
plt.show()
代码
文本

可以看到,感知机模型完全无法处理非线性问题。

代码
文本
感知器
感知器
已赞2
本文被以下合集收录
从文献里来,到实践中去
MileAway
更新于 2024-08-31
8 篇15 人关注
temp
Hayden
更新于 2024-08-24
12 篇0 人关注
推荐阅读
公开
Active learning(主动学习)
TutorialAI
TutorialAI
lilpang
发布于 2023-11-08
7 转存文件2 评论
公开
2024.08.24 ChengLab新生培训 课堂小作业
notebookDeep Learning
notebookDeep Learning
suyanyi
更新于 2024-08-24