赞
踩
1. 采用感知机学习算法建立模型
2. 神经元激活函数建议选用sign函数(数据集最后一列的标签请将 0 转换为 -1)
3. 迭代输出每一次更新后的 W 和 θ
4. 数据集线性可分,最好求解出线性超平面
实验结果
使用epoch=10,每个x都可以更新一次参数,可以看到10轮之内就可以收敛,达到不错的效果
开始训练时的参数更新情况
收敛
线性超平面为:0.13245762 * x - 0.08317062 * y + 0.5800000000000002 = 0
划分情况可视化
可以看到效果不错
实验中遇到的问题及解决方法:
心得体会:
通过这次实验,我对于感知机模型的原理有了进一步的了解,也通过实验对这一算法进行了实践,加深了印象。虽然实验中用到的模型比较简单,但是学习到了反向传播优化这一思想。通过可视化得出比较好的分类效果也令我备受鼓舞,期望在后面的学习中可以学到更多机器学习相关知识。为以后的学习工作打下坚实的基础。
- import numpy as np
- import matplotlib.pyplot as plt
-
-
- class Perceptron:
- def __init__(self, lr=0.01, epochs=100):
- self.lr = lr # 学习率
- self.epochs = epochs # 最大迭代次数
- self.w = None # 权重向量
- self.b = None # 偏置项
-
- def train(self, X, lable):
- # self.w = np.zeros(X.shape[1])
- self.w = np.random.randn(X.shape[1]) * np.sqrt(1 / X.shape[1])
- self.b = 0
- for epoch in range(self.epochs):
- for x, y in zip(X, lable):
- # y_hat = np.sign(np.dot(x, self.w) + self.b)
- y_hat = 1 if np.dot(x, self.w) + self.b >= 0 else -1
- self.w += self.lr * (y - y_hat) * x
- self.b += self.lr * (y - y_hat)
- print(self.w, self.b)
-
- def picture(self, X, lable):
- x1 = []
- x2 = []
- y1 = []
- y2 = []
- for x, y in zip(X, lable):
- if y == 1:
- x1.append(x[0])
- y1.append(x[1])
- else:
- x2.append(x[0])
- y2.append(x[1])
- plt.figure()
- x = [i for i in range(-5, 5)]
- y = [-(self.w[0] / self.w[1]) * i - self.b / self.w[1] for i in x]
- plt.plot(x, y)
- plt.scatter(x1, y1, color='blue')
- plt.scatter(x2, y2, color='red')
- plt.show()
-
-
- def get_data():
- dataset = np.loadtxt(r"D:\pythonProject\Machine_learning\test4\perceptron_data.txt")
- data = dataset[:, :2]
- lable = dataset[:, -1]
- lable = [-1.0 if i == 0 else i for i in lable]
- return data, lable
-
-
- data, lable = get_data()
- net = Perceptron(0.01, 10)
- net.train(data, lable)
- # net.train(data, lable)
- net.picture(data, lable)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。