[关闭]
@xuchongfeng 2017-12-31T05:40:39.000000Z 字数 2250 阅读 96

机器学习基石

机器学习 感知机


  1. 基本符号定义
    image_1c2iqgg30fj5194g9oa1bshprp9.png-46.6kB
  2. 学习模型
    image_1c2iqmtu5iv215544e61rvodv0m.png-48.9kB
  3. 推导
    数据集的线性可分性
    给定一个数据集, 其中, 如果存在某个超平面S,存在 将数据集的正实例点和负实例点完全分开,则称该数据集线性可分。
    符号定义
    损失函数
    使用梯度下降法进行求解


    的更新公式为


    其中为学习率learning rate
    证明该算法是收敛的,即通过有限步N的迭代,能找到将数据集正负实例分开
    证明:
    • 存在满足条件的的超平面将数据正确分开:且存在, 对所有

      可知对于任意,
      则存在
    • , 则训练集上的误分类次数满足

      对于第K个误分类的实例,存在

      则w针对该错误的分类实例的更新为


则公式<1>


可得

又可得公式<2>

由<1><2>可得



4. 代码实现

  1. #!/usr/bin/python
  2. # coding: utf-8
  3. import numpy as np
  4. DATA_PATH = r"C:\Users\Administrator\PycharmProjects\learn_machine_learning\perceptron\dataset\data.dat"
  5. def init():
  6. data = np.loadtxt(DATA_PATH)
  7. X = data[:,0:-1]
  8. y = data[:,-1]
  9. return X, y
  10. class Perceptron(object):
  11. def __init__(self, w_shape, learning_rate=0.01):
  12. self.w = np.random.rand(w_shape[1], w_shape[0])
  13. self.b = np.random.rand(1)
  14. self.learning_rate = learning_rate
  15. def fit(self, X, y):
  16. while True:
  17. w, b = np.copy(self.w), np.copy(self.b)
  18. count = 0
  19. for i in range(len(X)):
  20. if y[i] * ((np.dot(w, X[i])) + b) < 0:
  21. count += 1
  22. self.w += self.learning_rate * y[i] * X[i]
  23. self.b += self.learning_rate * y[i]
  24. if count == 0: break
  25. def predict(self, x):
  26. return 1 if self.w * x + self.b > 0 else -1
  27. def main():
  28. X, y = init()
  29. perceptron = Perceptron((X.shape[1], 1))
  30. perceptron.fit(X, y)
  31. print(perceptron.w, perceptron.b)
  32. if __name__ == "__main__":
  33. main()

参考资料:
1. 统计学习方法-李航
2. 机器学习基石课程-林轩田

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注