首页 > 编程语言 > 详细

python实现PLA——感知机算法(学习笔记)

时间:2020-01-28 11:50:13      阅读:192      评论:0      收藏:0      [点我收藏+]

问题

     利用sklearn中的iris(鸢尾花)数据集,选用‘sepal length (cm)‘和 ’sepal width (cm)‘这两个特征,完成感知机算法。

分析

首先我们要考虑俩个问题:

1.如何去评判感知机的好与坏

 

2.感知机的优化策略  

技术分享图片

 

 

 技术分享图片

技术分享图片

 

技术分享图片

 

 下图为感知机算法流程:

 

 

 

 

技术分享图片

 

 技术分享图片

 

 原始形式代码实现

 

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3 from sklearn.datasets import load_iris
 4 from sklearn import datasets
 5 
 6 
 7 def sign(x):
 8     if x < 0:
 9         return -1
10     else:
11         return 1
12 
13 
14 def model(w, x, b):
15     y = (-b - w[0] * x) / w[1]  # 将直线转化为y=ax+b格式
16     return y
17 
18 
19 def fit(data):
20     learning_rate = 0.001   # 学习率
21     w = np.array([0.0, 0.0])
22     b = 0.2
23     sumCount = 0
24     while True:
25         count = 0
26         for i in range(data.shape[0]):
27             print(f迭代次数:{sumCount},w: {w},b: {b})
28             if data[i][-1] * sign(np.dot(w, data[i][0:2]) + b) <= 0:
29                 w += data[i][0:2] * data[i][-1] * learning_rate  # 根据计算得出的梯度和设定的学习率来调整w和b
30                 b += data[i][-1] * learning_rate
31                 count += 1
32                 sumCount += 1
33         if count == 0:  # 如果本轮迭代没有发现误分类点,则跳出循环
34             break
35     return w, b
36 
37 
38 iris = datasets.load_iris()
39 iris_data = load_iris().data
40 
41 sepal_length = np.array([iris_data[i][0] for i in range(iris_data.shape[0])])
42 sepal_width = np.array([iris_data[i][1] for i in range(iris_data.shape[0])])
43 # sepal_length为x轴,sepal_width为y轴
44 list = []
45 for i in range(50):  # 划分数据,前50个为一组,后50个为一组
46     list.append([sepal_length[i], sepal_width[i], 1])
47     list.append([sepal_length[50 + i], sepal_width[50 + i], -1])
48 data = np.array(list)
49 
50 plt.xlabel(sepal_length)
51 plt.xlim(4.2, 7.1)
52 plt.ylabel(sepal_width)
53 plt.ylim(1.5, 5)
54 for i in range(100):
55     if data[i][-1] == 1:
56         plt.scatter(data[i][0], data[i][1], color=blue, marker=*)
57     else:
58         plt.scatter(data[i][0], data[i][1], color=red, marker=o)
59 
60 w, b = fit(data)
61 x = np.array([i for i in range(len(sepal_length))])
62 plt.plot(x, model(w, x, b))
63 plt.show()

分析

首先我们要考虑俩个问题:

1.如何去评判感知机的好与坏

2.感知机的优化策略 

1.   在评判感知机的好与坏之前,我们需要定义感知机的模型: y=sign(技术分享图片·X+b),此题中的技术分享图片=(技术分享图片)X=(技术分享图片)技术分享图片,还需要定义感知机的损失函数,此处我们用误分类点到超平面S的总距离作为损失函数(此题中超平面即为一条分割数据的直线),下附距离推导过程,根据推导结果我们可知误分类点到S的总距离为:技术分享图片,技术分享图片=sign(技术分享图片·X+b),技术分享图片,且因为技术分享图片为常数,在比较大小时俩边可以消除,所以最后损失函数为:技术分享图片(M为误分类点的集合)

python实现PLA——感知机算法(学习笔记)

原文:https://www.cnblogs.com/FSeng/p/12218891.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!