什么是感知机
公式文字我也就不复现了,网上简直多如牛毛
(1)推荐看李航博士的《统计学习方法》
(2)或:https://www.jianshu.com/p/c91087e6e1ea(篇幅略小,简单了解)
第二篇文章篇幅较小,但基本介绍清楚了感知机的原始形式,想要进一步了解感知机的对偶形式,可自行搜索资料
以上两个推荐中,都是以两特征数据来分类的,也就是数据点和超平面可以在二维坐标系中呈现
于是我的代码也是如此,代码的可扩展性还是很大的,想要更高维度的数据可以自行修改
但是超过三维特征,将无法结合所有维度同时可视化
——————————————————————————————————————————————————
强烈建议仔细看书学懂了再来看代码!!!不要囫囵吞枣,之前我也是觉得自己看懂了,实际写代码就傻眼
好好想想参数怎么更新,怎么储存数据,怎么利用numpy矩阵…
- 全程都采用矩阵来计算,初始化函数中,参数矩阵是一个三维矩阵,其中最后一个是偏置b
- 创建numpy数组必须声明浮点数类型,否则当学习率不为1时,会导致参数更新自动取整,进而会出现迭代无法完成的情况。
- 包括收录数据时,也要声明为浮点类型,否则就导致数据自动变为取整型int32
def __init__(self):
self.learn_rate = 0.5 # 随意设置
self.w_b = np.array([[0],
[0],
[0]], dtype='float32') # 把三个参数放在一个矩阵中(w1, w2, b)
self.t_data = None
self.t_data_c = None # 因为要三个参数一起更新,观察书上的公式,其实就是y乘x1,x2,1,然后加到参数矩阵就行了所以又建立一个y值全是1的矩阵
- 数据收录,每个数据最后一个是1或-1,作为分类标记,然后每个数据以一行存入矩阵
- 理解参数如何更新后会发现,两个w1,w2是乘以y,然后+=
- b是直接加y
- 为了方便更新,我们建立两个train_data矩阵,第二个把y全部改为1,当是误分类点时,用于更新数据
def collect_data(self):
collect_1 = []
collect_2 = []
while True:
try: # 利用异常处理结束输入,别的没想到啥好办法。。
data = map(float, input("输入数据x1 x2 y(空格隔开)\
输入任意字母敲回车以结束:").split(' '))
data = list(data)
collect_1.append(copy.copy(data)) # 测试发现,下一行的更改会影响上一行,两个指向的变量地址一样,所以得copy一下
data[2] = 1
collect_2.append(data)
except ValueError:
print("数据收集完毕!")
break
self.t_data = np.array(collect_1, dtype='float32')
self.t_data_c = np.array(collect_2, dtype='float32')
- 参数更新迭代
- 终极目的是误分类点数为0,于是每次检测到一个误分类,便mistake += 1,直到某次更新后为0,跳出while
def gradient_descent(self):
print("开始迭代...")