机器学习——感知机模型
文章目录
前言
在学习神经网络模型时,最先接触的大概率是感知机模型
,本篇博客主要介绍了感知机模型以及其应用的二分类模型,使用的数据集是我们常见的鸢尾花数据集。
1.感知机模型介绍
1.1基本概念
神经网络:由具有适应性的简单单元组成的广泛并行互联的网络,它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应
感知机:由两层神经元组成输入层
(用于接收外界信号)和输出层
(做出判断)
1.2数学表达
感知机可以看作是一个线性分类器。它接收输入向量x=(x1,x2,x3,…,xn),其中n为输入特征的数量,例如在鸢尾花分类任务中,输入特征可能是花的花瓣长度、花瓣宽度等。
将所有输入按照一定的权重w=(w1,w2,w3,…,wn)进行累加与阈值进行运算,结果通过激活函数输出。因此感知机模型的输出表达可以写为:
其中,w和x表示向量,sign()
是阶跃函数
1.3几何解释
- 在二维空间中(n=2,输入特征为x1和x2),感知机模型的决策边界是一条直线。
- 对于线性可分的数据,感知机的目标是找到合适的w和b,使得这条直线能够将不同类别的数据点分开。例如,在一个简单的两类数据集(如正类和负类)中,正类的数据点在直线的一侧,负类的数据点在直线的另一侧。
- 在高维空间中,决策边界是一个超平面,超平面的方程为wx+b=0,它将高维空间划分为两个区域,分别对应两个不同的类别。
1.4优缺点
- 优点:
1.简单易懂,计算效率高。它的结构和学习算法都比较直观,容易理解和实现。
2.对于线性可分的数据,感知机能够保证在有限的迭代次数内找到一个能够正确分类所有数据的决策边界。 - 缺点:
1.只能处理线性可分的数据。如果数据不是线性可分的,感知机无法收敛,即无法找到一个合适的决策边界来正确分类所有样本。
2.它没有考虑数据中的概率信息,只是简单地进行二分类,在处理复杂的实际问题时,可能无法提供足够准确的分类结果。
2.二分类应用
2.1应用介绍
从 iris 数据集中取出[sepal length,sepal width]两个属性作为样本特征,取前两类样本训练感知机网络进行二分类实验。每一类取前 40 个样本作为训练集,剩余的 10 个样本作为测试集。
2.2准备数据集
2.2.1环境检查
本案例使用的是鸢尾花数据集,该数据集封装在sklearn
库中,所以如果没有安装该库,可以在终端执行下行代码安装该库:
pip install scikit-learn
2.2.2数据集介绍
如果你对鸢尾花数据集并不熟悉,可以通过下面代码进行了解:
from sklearn.datasets import load_iris
iris=load_iris()
print(iris.DESCR)
该数据集共四个特征,可以分为三类,每类50个样本,这时我们可以通过下面代码具体查看数据集的信息。
print(iris.data)
print(iris.target)
print(iris.values())
这里为了方便换成jupyter notebook
,部分代码的执行可能需要加print()
.
2.2.3获取数据
dataset=iris.data[:100,:2]
datalabel=iris.target[:100]
datalabel,dataset
运行结果:
2.2.4划分数据集
将数据集划分为训练集和验证集,在划分数据集前需要将标签置为{-1,1}
datalabel[:50]=-1
datalabel[50:]=1
x_train=[]
x_test=[]
y_train=[]
y_test=[]
x_train.append(dataset[:40])
x_test.append(dataset[40:50])
y_train.append(datalabel[:40])
y_test.append(datalabel[40:50])
x_train.append(dataset[50:90])
x_test.append(dataset[90:100])
y_train.append(datalabel[50:90])
y_test.append(datalabel[90:100])
import numpy as np
x_train=np.array(x_train).reshape(80,2)
y_train=np.array(y_train).reshape(80,1)
x_test=np.array(x_test).reshape(20,2)
y_test=np.array(y_test).reshape(20,1)
x_train.shape,x_test.shape,y_train.shape,y_test.shape
这里数据集的划分有多种方式,上述仅供参考,代码略显冗长
2.3可视化训练集
使用matplotlib
模块可视化散点图
import matplotlib.pyplot as plt
plt.scatter(x_train[:40,0],x_train[:40,1],c='r')
plt.scatter(x_train[40:,0],x_train[40:,1],c='g')
plt.show()
2.4训练过程
采用随机梯度下降
,更新公式为:
2.4.1首轮梯度下降
w=[1,1]
b=0
learning_rate=0.1
indices = np.random.permutation(len(y_train))
loss=0
for i in indices:
predict=np.sign(np.dot(w,x_train[i])+b)
if predict*y_train[i]<=0:
loss+=1
w+=learning_rate*y_train[i]*x_train[i]
b+=learning_rate*y_train[i]
loss,w,b
运行结果:
2.4.2多轮梯度下降
此时在训练集上已经无误差,即能够正确分类。
2.5可视化分类结果
plt.scatter(x_train[:40,0],x_train[:40,1],c='r')
plt.scatter(x_train[40:,0],x_train[40:,1],c='g')
x=np.linspace(3,8,100)
y=-(w[0]*x+b)/w[1]
plt.plot(x,y,c='b')
plt.show()
备注:这里有人问我,直线y为什么写成y=-(w[0]*x+b)/w[1]
该表达式,这里简单解释一下,因为该模型拟合的是超平面,在三维图像中应该是如下图所示:
我们这里画的图象是投影在z=0
的平面上,所以此处画的是超平面与z=0
的交线,简单推证一下就能得到上述直线的表达式啦!!!
2.6在验证集验证
right=0
for i in range(len(y_test)):
predict=np.sign(np.dot(w,x_test[i])+b)
if predict==y_test[i]:
right+=1
right/len(y_test)
结语
至此已经完成了利用感知机完成分类问题,对神经网络和梯度下降应该有了更深的理解,上述代码可能有问题欢迎批评指正!!!
原文地址:https://blog.csdn.net/2401_85464956/article/details/144299549
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!