目录
人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站
https://www.captainai.net/shuai
问题描述
平面上有两摊墨渍,它们的颜色分别是黄色和蓝色,墨渍分类问题就是是根据点的坐标,判断其染上的颜色。
从Sklearn的数据库中获取墨渍数据,每条数据是平面上的一个点,
特征组(即特征向量)为该点的坐标,标签为该点的颜色,0表示黄色,1表示蓝色。
- 实验目的
使用感知器算法完成对墨迹的分类。
- 实验内容
3.1数据导入
# 墨渍数据从Sklearn获取 |
3.2数据预处理
plt.plot(X[:, 0][y == 1], X[:, 1][y == 1], "bs", ms=3) # 正例蓝色点 |
将数据展示出来,正例为蓝色点,负例为黄色点。
为什么要y = 2 * y -1?
这是为了将y标签转化为-1或1。当y=1时,y = 2*1-1=1;当y=0时,y=2*0-1=-1。所以,在后面的应表示:
plt.plot(X_train[:, 0][y_train == -1], X_train[:, 1][y_train == -1] - 0.1, "yo", ms=3) |
3.3算法描述
感知器模型包含多个输入节点:X0-Xn,权重矩阵W0-Wn,一个输出节点O。
输入训练样本X和初始权重向量W,将其进行向量的点乘,然后将点乘求和结果如果小于等于0,来调整初始化权重向量W。如此反复,直到W调整到合适的结果为止。进而求出W,b。
在几何意义上,就是这个直线是在旋转,一直旋转到一个合适的位置。
import numpy as np |
3.4主要代码
ink.py
# 墨渍数据从Sklearn获取 |
perceptron.py
import numpy as np
# 感知器算法
class Perceptron:
def fit(self, X, y):
m, n = X.shape
w = np.zeros((n,1))
b = 0
done = False
while not done:
done = True
for i in range(m):
x = X[i].reshape(1,-1)
if y[i] * (x.dot(w) + b) <= 0:
w = w + y[i] * x.T
b = b + y[i]
done = False
self.w = w
self.b = b
def predict(self, X):
return np.sign(X.dot(self.w) + self.b)
- 实验结果及分析
如果训练集太大,那么根据测试集的评估结果不够准确;如果测试集过大,那么训练集与总体样本差别太大,不一定能反应总体的特征。
- 遇到的问题和解决方法
问题一:出现报错
图5-1报错
这里需要改变python的版本,python3.9会出现这样的错,改成python3.6就行了。
图5-2修改版本
问题二:对感知器的算法认识不深刻。
1.感知器算法原理
感知器算法通过对已知类别的训练样本集的学习,寻找一个满足上式的权向量。
2.算法步骤
(1)选择N个分属于和类的模式样本构成训练样本集{ X1, …, XN }构成增广向量形式,并进行规范化处理。任取权向量初始值W(1),开始迭代。迭代次数k=1。
(3)分析分类结果:只要有一个错误的分类,即不满足,则回到(2),直至对所有样本正确分类。
感知器算法是一种赏罚过程,这是算法的核心:
分类正确时,对权向量“赏”——这里用“不罚”,即权向量不变;
分类错误时,对权向量“罚”——对其修改,向正确的方向转换。
实现的代码:
#感知机算法 |
图5-3运行截图
如果感觉麻烦也可下载,感谢支持:
下载地址:https://download.csdn.net/download/m0_61504367/84717279