当前位置:   article > 正文

机器学习实验4 实现感知机学习算法_使用感知机算法建立一个模型,并根据感知机算法流程对模型进行训练,得到一个能够准

使用感知机算法建立一个模型,并根据感知机算法流程对模型进行训练,得到一个能够准
  • 实验目的

1. 采用感知机学习算法建立模型

2. 神经元激活函数建议选用sign函数(数据集最后一列的标签请将 0 转换为 -1)

3. 迭代输出每一次更新后的 W 和 θ

4. 数据集线性可分,最好求解出线性超平面

  • 实验内容:
  1. 首先要把数据集里的数据进行处理,使用np.loadtxt()把数据读入ndarray,把前两列和最后一列的标签分开,并且数据集最后一列的标签请将 0 转换为 -1。

  1. 定义Perceptron单层感知机类,参数有四个,分别是学习率lr、迭代次数epochs、权重向量w和偏置项b,lr和epochs提供默认参数值0.01和100。

  1. 训练函数train(),首先初始化w和b,w使用Xavier初始化方法,可以获得更好的训练效果,b初始值设为0。然后两层循环,外层是迭代次数,内层循环每次取一个坐标值和lable,按照进行计算,f()激活函数使用sign函数。根据对w和b进行更新,并输出更新后的w和b的值。

  1. 经过训练之后,使用matplotlib对训练结果进行可视化,通过w和b的值得到超平面。直线的函数表达式为ax + by + c = 0,w的两个参数w[0],w[1]分别是a,b,b是表达式中的c,用plt.plot可以画出。数据集中的点根据其标签值,分为蓝色和红色的点,使用plt.scatter()画出。

实验结果

使用epoch=10,每个x都可以更新一次参数,可以看到10轮之内就可以收敛,达到不错的效果

开始训练时的参数更新情况

收敛

线性超平面为:0.13245762 * x - 0.08317062 * y + 0.5800000000000002 = 0

划分情况可视化

可以看到效果不错

  • 实验原理:

  • 心得体会:

实验中遇到的问题及解决方法:

  1. 权重的初始化对收敛速度等有影响,并且网络训练的过程中, 容易出现梯度消失和梯度爆炸的情况,导致大部分反向传播得到的梯度不起作用或者起反作用。通过查阅资料发现Xavier初始化方法是一种比较常用的且性能优秀的方法,可以尽可能的让输入和输出服从相同的分布,这样就能够避免后面层的激活函数的输出值趋向于0。
  2. 在画图的时候,数据集中的点要使用原来的标签而不是带入线性超平面中求出分类,这样会导致可视化结果中,相同颜色的点一定在直线两侧。

心得体会:

      通过这次实验,我对于感知机模型的原理有了进一步的了解,也通过实验对这一算法进行了实践,加深了印象。虽然实验中用到的模型比较简单,但是学习到了反向传播优化这一思想。通过可视化得出比较好的分类效果也令我备受鼓舞,期望在后面的学习中可以学到更多机器学习相关知识。为以后的学习工作打下坚实的基础。

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. class Perceptron:
  4. def __init__(self, lr=0.01, epochs=100):
  5. self.lr = lr # 学习率
  6. self.epochs = epochs # 最大迭代次数
  7. self.w = None # 权重向量
  8. self.b = None # 偏置项
  9. def train(self, X, lable):
  10. # self.w = np.zeros(X.shape[1])
  11. self.w = np.random.randn(X.shape[1]) * np.sqrt(1 / X.shape[1])
  12. self.b = 0
  13. for epoch in range(self.epochs):
  14. for x, y in zip(X, lable):
  15. # y_hat = np.sign(np.dot(x, self.w) + self.b)
  16. y_hat = 1 if np.dot(x, self.w) + self.b >= 0 else -1
  17. self.w += self.lr * (y - y_hat) * x
  18. self.b += self.lr * (y - y_hat)
  19. print(self.w, self.b)
  20. def picture(self, X, lable):
  21. x1 = []
  22. x2 = []
  23. y1 = []
  24. y2 = []
  25. for x, y in zip(X, lable):
  26. if y == 1:
  27. x1.append(x[0])
  28. y1.append(x[1])
  29. else:
  30. x2.append(x[0])
  31. y2.append(x[1])
  32. plt.figure()
  33. x = [i for i in range(-5, 5)]
  34. y = [-(self.w[0] / self.w[1]) * i - self.b / self.w[1] for i in x]
  35. plt.plot(x, y)
  36. plt.scatter(x1, y1, color='blue')
  37. plt.scatter(x2, y2, color='red')
  38. plt.show()
  39. def get_data():
  40. dataset = np.loadtxt(r"D:\pythonProject\Machine_learning\test4\perceptron_data.txt")
  41. data = dataset[:, :2]
  42. lable = dataset[:, -1]
  43. lable = [-1.0 if i == 0 else i for i in lable]
  44. return data, lable
  45. data, lable = get_data()
  46. net = Perceptron(0.01, 10)
  47. net.train(data, lable)
  48. # net.train(data, lable)
  49. net.picture(data, lable)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/514231
推荐阅读
相关标签
  

闽ICP备14008679号