感知机学习算法的原始形式:http://blog.youkuaiyun.com/qq_29591261/article/details/77934696
本文相对于原文在代码中添加了自己的理解和注释,省略推理过程,想看原理推导的请参考原文:http://www.hankcs.com/ml/the-perceptron.html
关于对偶
对偶,简单地说,就是从一个不同的角度去解答相似问题,但是问题的解是相通的。
或者说原始问题比较难求解,我们去求解另外一个问题,希望通过更简单的方法得到原始问题的解。
对于感知机来说,简单来说,就是用α去记录每个yixi要加多少次,最后一次加上去就好了。
具体理解如下:

来源于知乎:https://www.zhihu.com/question/26526858
感知机学习算法的对偶形式
对偶指的是,将w和b表示为测试数据i的线性组合形式,通过求解系数得到w和b。具体说来,如果对误分类点i逐步修改wb修改了n次,则w,b关于i的增量分别为
,这里
,则最终求解到的参数分别表示为:

于是有算法2.2:

感知机对偶算法代码
- # -*- coding:utf-8 -*-
- # Filename: train2.2.py
- # Author:hankcs
- # Date: 2015/1/31 15:15
- import numpy as np
- from matplotlib import pyplot as plt
- from matplotlib import animation
-
- training_set = np.array([[[3, 3], 1], [[4, 3], 1], [[1, 1], -1], [[5, 2], -1]]) #训练样本
-
- a = np.zeros(len(training_set), np.float) #矩阵a的长度为训练集样本数,类型为float
- b = 0.0 #参数初始值为0
- Gram = None #Gram矩阵
- y = np.array(training_set[:, 1]) #y=[1 1 -1 -1]
- x = np.empty((len(training_set), 2), np.float) #x为4*2的矩阵
- for i in range(len(training_set)): #x=[[3., 3.], [4., 3.], [1., 1.], [5., 2.]]
- x[i] = training_set[i][0]
- history = [] #history记录每次迭代结果
-
- def cal_gram():
- """
- 计算Gram矩阵
- :return:
- """
- g = np.empty((len(training_set), len(training_set)), np.int)
- for i
|