123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- from functools import reduce
- class Perceptron(object):
- def __init__(self, input_num, activator):
- ''' 初始化感知器,
- :param input_num: 设置输入参数的个数
- :param activator: 激活函数
- '''
- self.activator = activator
- # 初始化权重
- self.w = [0.0 for _ in range(input_num)]
- # 初始化偏置项
- self.b = 0.0
- def __str__(self):
- '''打印学习到的权重、偏置项
- :return:
- '''
- return 'w\t:%s\nb\t:%f\n' % (self.w, self.b)
- def fix(self, x, y, iteration_num, rate):
- """训练数据
- :param x: 输入训练数据,一组向量
- :param y: 对应的标签
- :param iteration_num: 训练轮数
- :param rate: 学习速率
- """
- for i in range(iteration_num):
- self.__one_tarin(x, y, rate)
- def __one_tarin(self, x, y, rate):
- """训练所有的数据(一次)
- :param x: 输入训练数据,一组向量
- :param y: 对应的标签
- :param rate: 学习速率
- :return:
- """
- for (x, y) in zip(x, y):
- # 预测结果
- t = self.predict(x)
- # 更新权重,求预测值与实际值的差距
- gap = y - t
- # 利用公式求w,b。 w = wi + r(t-y)xi b = b + r(t-y)
- self.w = list(map(lambda x_w: x_w[1] + rate * gap * x_w[0], zip(x, self.w)))
- self.b = self.b + gap * rate
- def predict(self, x):
- """输入x预测结果 使用了SGD(随机梯度下降算法)
- :param x: 向量
- :return:
- """
- # 返回[x1*w1, x2*w2, x3*w3...]
- sample = map(lambda x_w: x_w[0] * x_w[1], zip(x, self.w))
- # 计算 0.0 + x1*w1 + x2*w2 + x3*w3 +... 初始值为0.0
- y = reduce(lambda a, b: a + b, sample, 0.0)
- # 加上偏置项
- y = y + self.b
- # 激活函数
- y = self.activator(y)
- return y
|