一、感知机学习算法的原始形式

算法

输入:2.3 感知机学习算法 - 图1
输出:w,b;2.3 感知机学习算法 - 图2

  1. 选取初值 2.3 感知机学习算法 - 图3
  2. 在训练集中选取数据2.3 感知机学习算法 - 图4
  3. 如果2.3 感知机学习算法 - 图5

2.3 感知机学习算法 - 图6

  1. 转至2,直至训练集中没有误分类点

感知机算法采取不同的初值或者选取不同的误分类点,解可以不同

二、算法的收敛性

相关证明略

训练数据集线性可分时,感知机学习算法收敛

三、感知机学习算法的对偶形式

对偶形式的思想:将w和b看作是实例和标签的线性组合。对于每一个样本(xi,yi),有2.3 感知机学习算法 - 图7次中将该样本作为了误分类点,故用它去更新参数。而一共有N个样本。
2.3 感知机学习算法 - 图8

算法

输入:2.3 感知机学习算法 - 图9
输出:2.3 感知机学习算法 - 图10

  1. 2.3 感知机学习算法 - 图11
  2. 在训练集中选取数据2.3 感知机学习算法 - 图12
  3. 如果2.3 感知机学习算法 - 图13
  4. 转至2,直至训练集中没有误分类点

Gram matrix

对偶形式中,训练实例仅以内积的形式出现。
为了方便可预先将训练集中的实例间的内积计算出来并以矩阵的形式存储,这个矩阵就是所谓的Gram矩阵
2.3 感知机学习算法 - 图14

四、代码

感知机python代码(原始形式)

  1. import numpy as np
  2. import logging
  3. logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  4. logger = logging.getLogger(__name__)
  5. def perceptron(dataArr,labelArr,iter=50):
  6. print('start')
  7. dataMat = np.mat(dataArr)
  8. labelMat = np.mat(labelArr).T
  9. m,n = np.shape(dataMat)
  10. w = np.zeros((1,n))
  11. b = 0
  12. h = 1
  13. for k in range(iter):
  14. for i in range(m):
  15. xi = dataMat[i]
  16. yi = labelMat[i]
  17. if -1*yi*(w*xi.T+b) >=0:
  18. w += h*yi*xi
  19. b += h*yi
  20. logger.info('round %d:%d training' % (k,iter))
  21. return w,b
  22. data_raw = np.loadtxt("CH02/Input/data_2-1.txt")
  23. X = data_raw[:, :2]
  24. y = data_raw[:, -1]
  25. w,b=perceptron(X,y,6)
  26. def model_test(dataArr, labelArr, w, b):
  27. print('start to test')
  28. dataMat = np.mat(dataArr)
  29. labelMat = np.mat(labelArr).T
  30. m, n = np.shape(dataMat)
  31. errorCnt = 0
  32. for i in range(m):
  33. xi = dataMat[i]
  34. yi = labelMat[i]
  35. result = -1 * yi * (w * xi.T + b)
  36. if result >= 0: errorCnt += 1
  37. accruRate = 1 - (errorCnt / m)
  38. return accruRate
  39. accruRate = model_test(X, y, w, b)
  40. print(accruRate)