perceptron.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from functools import reduce
  2. class Perceptron(object):
  3. def __init__(self, input_num, activator):
  4. ''' 初始化感知器,
  5. :param input_num: 设置输入参数的个数
  6. :param activator: 激活函数
  7. '''
  8. self.activator = activator
  9. # 初始化权重
  10. self.w = [0.0 for _ in range(input_num)]
  11. # 初始化偏置项
  12. self.b = 0.0
  13. def __str__(self):
  14. '''打印学习到的权重、偏置项
  15. :return:
  16. '''
  17. return 'w\t:%s\nb\t:%f\n' % (self.w, self.b)
  18. def fix(self, x, y, iteration_num, rate):
  19. """训练数据
  20. :param x: 输入训练数据,一组向量
  21. :param y: 对应的标签
  22. :param iteration_num: 训练轮数
  23. :param rate: 学习速率
  24. """
  25. for i in range(iteration_num):
  26. self.__one_tarin(x, y, rate)
  27. def __one_tarin(self, x, y, rate):
  28. """训练所有的数据(一次)
  29. :param x: 输入训练数据,一组向量
  30. :param y: 对应的标签
  31. :param rate: 学习速率
  32. :return:
  33. """
  34. for (x, y) in zip(x, y):
  35. # 预测结果
  36. t = self.predict(x)
  37. # 更新权重,求预测值与实际值的差距
  38. gap = y - t
  39. # 利用公式求w,b。 w = wi + r(t-y)xi b = b + r(t-y)
  40. self.w = list(map(lambda x_w: x_w[1] + rate * gap * x_w[0], zip(x, self.w)))
  41. self.b = self.b + gap * rate
  42. def predict(self, x):
  43. """输入x预测结果 使用了SGD(随机梯度下降算法)
  44. :param x: 向量
  45. :return:
  46. """
  47. # 返回[x1*w1, x2*w2, x3*w3...]
  48. sample = map(lambda x_w: x_w[0] * x_w[1], zip(x, self.w))
  49. # 计算 0.0 + x1*w1 + x2*w2 + x3*w3 +... 初始值为0.0
  50. y = reduce(lambda a, b: a + b, sample, 0.0)
  51. # 加上偏置项
  52. y = y + self.b
  53. # 激活函数
  54. y = self.activator(y)
  55. return y