利用 sklearn 实现感知机

本文介绍感知机作为二类分类的线性模型,并通过sklearn实现了感知机算法。使用make_classification生成二分类样本,划分训练集和测试集,构建并训练感知机模型,最后展示分类效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、感知机简介

感知机(perceptron)是二类分类线性分类模型,其输入为实例的特征向量,输出为实例的类别。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面。感知机是一种判别模型。

二、算法


二、利用sklearn 实现感知机

make_classification生成一些用来分类的样本(每次出来的数据不一样)

make_classification(n_samples, n_features,n_redundant,n_informative,n_clusters_per_class) 

#n_samples:生成样本的数量
#n_features:生成样本的特征数,特征数=n_informative + n_redundant + n_repeated
#n_informative:多信息特征的个数
#n_redundant:冗余信息,informative特征的随机线性组合

#n_clusters_per_class :某一个类别是由几个cluster构成的 

import numpy as np
from sklearn.datasets import make_classification
from sklearn.linear_model import Perceptron
from matplotlib import pyplot as plt

#生成二分类的样本
x,y=make_classification(n_samples=1000,n_features=2,n_redundant=0,n_informative=1,n_clusters_per_class=1)
#print(x)

#训练数据和测试数据
x_data_train = x[:800,:]
x_data_test = x[800:,:]
y_data_train = y[:800]
y_data_test = y[800:]

#正例和反例
positive_x1 = [x[i,0] for i in range(1000) if y[i] == 1]
positive_x2 = [x[i,1] for i in range(1000) if y[i] == 1]
negetive_x1 = [x[i,0] for i in range(1000) if y[i] == 0]
negetive_x2 = [x[i,1] for i in range(1000) if y[i] == 0]

#构建感知机
clf = Perceptron(fit_intercept=False,n_iter=30,shuffle=False)

#使用训练数据进行训练
clf.fit(x_data_train,y_data_train)
#得到训练结果,权重矩阵
print(clf.coef_)
#输出为:[[0.21720699 2.49185955]]

#超平面的截距,此处输出为:[0.]
#print(clf.intercept_)

#预测
acc = clf.score(x_data_test,y_data_test)
print(acc)

plt.scatter(positive_x1,positive_x2,c='red')
plt.scatter(negetive_x1,negetive_x2,c='blue')
#画出超平面(在本例中即是一条直线)
line_x = np.arange(-4,4)
line_y = line_x * (-clf.coef_[0][0] / clf.coef_[0][1]) - clf.intercept_
plt.plot(line_x,line_y)
plt.show()

注:感知机学习算法由于采用不同的初值或选取不同的误分类点,解可能不同。

参考:1、李航 统计学习方法

           2、https://zhuanlan.zhihu.com/p/27152953


<think>我们有一个用户的查询,要求理解感知机的概念并提供Python代码实现。我们也有几个引用文献,我们可以利用这些文献来构建回答。感知机是一种线性分类模型,是神经网络的基础。它接收多个输入信号,产生一个输出。感知机通过权重和偏置对输入进行线性组合,然后通过激活函数(如阶跃函数)输出类别。从引用中,我们可以总结出以下几点:-感知机有原始形式和对偶形式(引用[1])。-感知机的目标是通过学习权重和偏置来找到分离超平面(引用[5])。-损失函数通常使用分类点到超平面的距离(引用[5])。-使用梯度下降法优化(引用[5])。-引用[2]、[3]、[4]提供了Python实现的代码示例。因此,我们的回答应该包括:1.感知机算法原理的简要说明。2.感知机的训练过程(使用梯度下降更新权重)。3.给出一个简单的Python实现代码(可以基于引用中的示例)。此外,根据系统指令,我们需要在回答末尾生成相关问题。注意:引用在回答中要自然使用,并在段落末尾添加引用标识,例如[^1]。我们开始构建回答:首先,简要介绍感知机的原理:感知机是一种二分类的线性分类模型,其输入为特征向量,输出为类别(+1或-1)。感知机通过一个超平面将数据分开,超平面由权重向量w和偏置b决定。对于输入x,感知机的输出为:$$\text{sign}(w\cdotx+b)$$其中sign是符号函数。然后,解释训练过程:训练的目标是找到w和b,使得所有训练样本被正确分类感知机使用分类点到超平面的距离作为损失函数,并使用梯度下降法进行优化。损失函数定义为:$$L(w,b)=-\sum_{x_i\inM}y_i(w\cdotx_i+b)$$其中M是误分类点的集合。然后分别对w和b求偏导,得到梯度:$$\nabla_wL=-\sum_{x_i\inM}y_ix_i$$$$\nabla_bL=-\sum_{x_i\inM}y_i$$更新规则为:$$w=w+\etay_ix_i$$$$b=b+\etay_i$$其中η为学习率。接下来,给出一个简单的Python实现:我们将按照引用中常见的结构,创建一个Perceptron类,包含初始化、训练和预测方法。代码实现如下(参考引用[2][3][4][5]):```pythonimportnumpyasnpclassPerceptron:def__init__(self,learning_rate=0.01,epochs=1000):self.learning_rate=learning_rate#学习率self.epochs=epochs#训练轮数self.weights=None#权重self.bias=None#偏置deffit(self,X,y):#初始化参数,权重向量的维数等于特征数n_samples,n_features=X.shapeself.weights=np.zeros(n_features)self.bias=0#确保y的标签为{-1,1},因为感知机输出为+1或-1y_=np.array([1ifi>0else-1foriiny])#开始迭代forepochinrange(self.epochs):#遍历每个样本foriinrange(n_samples):#计算预测值linear_output=np.dot(X[i],self.weights)+self.biasy_pred=1iflinear_output>=0else-1#如果预测错误,则更新权重和偏置ify_[i]*y_pred<0:self.weights+=self.learning_rate*y_[i]*X[i]self.bias+=self.learning_rate*y_[i]defpredict(self,X):linear_output=np.dot(X,self.weights)+self.biasreturnnp.sign(linear_output)```注意:上述实现中,我们假设输入的y是二分类标签(0和1或其他),我们将其转换为+1和-1。在训练时,我们使用每个误分类样本进行更新(随机梯度下降)。最后,根据系统指令,我们需要在回答末尾生成相关问题。§§相关问题§§1.感知机算法的优缺点是什么?2.感知机如何处理非线性可分数据?3.感知机与支持向量机(SVM)有什么区别?4.感知机的对偶形式是什么?如何实现?同时,在回答中引用我们的参考文献,在相关地方添加引用标记。例如,在提到感知机原始形式和对偶形式时引用[^1],在提到损失函数和梯度下降时引用[^5]等。我们组织一下回答内容:</think> ### 感知机算法原理及Python实现 #### 感知机概念 感知机是一种**线性二分类模型**,由Frank Rosenblatt于1957年提出,作为神经网络的基础模型。它的目标是找到一个超平面: $$ w·x + b = 0 $$ 将数据分为正类(+1)和负类(-1)。核心原理是通过误分类点到超平面的距离构建损失函数: $$ L(w,b) = -\sum_{x_i \in M} y_i(w·x_i + b) $$ 其中$M$为误分类点集合,采用随机梯度下降更新参数: $$ w \leftarrow w + \eta y_i x_i $$ $$ b \leftarrow b + \eta y_i $$ 直至无分类错误[^5][^4]。 #### Python实现(原生代码) ```python import numpy as np class Perceptron: def __init__(self, learning_rate=0.01, epochs=1000): self.lr = learning_rate # 学习率 self.epochs = epochs # 迭代次数 self.weights = None # 权重向量 self.bias = 0 # 偏置项 def fit(self, X, y): n_samples, n_features = X.shape self.weights = np.zeros(n_features) # 初始化权重 for _ in range(self.epochs): for i in range(n_samples): linear_output = np.dot(X[i], self.weights) + self.bias # 符号函数激活 y_pred = 1 if linear_output >= 0 else -1 # 更新误分类点参数 if y[i] * y_pred <= 0: self.weights += self.lr * y[i] * X[i] self.bias += self.lr * y[i] def predict(self, X): linear_output = np.dot(X, self.weights) + self.bias return np.sign(linear_output) # 返回预测类别 ``` #### Sklearn实现(简化版) ```python from sklearn.linear_model import Perceptron # 创建模型 perceptron = Perceptron(eta0=0.1, max_iter=1000) # 训练数据 perceptron.fit(X_train, y_train) # 预测结果 y_pred = perceptron.predict(X_test) ``` ### 关键特性说明 1. **线性可分要求**:要求数据必须线性可分,否则无法收敛[^1] 2. **损失函数**:基于误分类点到超平面的距离 3. **激活函数**:使用符号函数 $ f(z) = \text{sign}(z) $ 4. **对偶形式**:通过Gram矩阵加速计算(引用[1]提到的对偶形式): $$ \alpha_i \leftarrow \alpha_i + \eta $$ $$ b \leftarrow b + \eta y_i $$ ### 典型训练流程 ```mermaid graph TD A[初始化权重w和偏置b] --> B{遍历所有样本} B --> C[计算预测值] C --> D{是否误分类?} D -- 是 --> E[更新w和b] D -- 否 --> B E --> F{达到最大迭代?} F -- 是 --> G[训练结束] F -- 否 --> B ``` ### 适用场景 - 简单线性分类任务 - 二分类问题(如垃圾邮件识别) - 神经网络的基础学习单元[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值