第一篇:感知机模型
输入:训练数据集 T={(x1,y1),(x2,y2),...,(xN,yN)}T=\{(x_1, y_1), (x_2, y_2), ... , (x_N, y_N)\}T={(x1,y1),(x2,y2),...,(xN,yN)},其中Xi∈RnX_i\in R^nXi∈Rn, yi∈y={−1,+1}y_i \in y=\{-1, +1\}yi∈y={−1,+1},i=1,2,...,Ni=1, 2, ... , Ni=1,2,...,N,学习率 η(0<η≤1)\eta(0<\eta \leq 1)η(0<η≤1)。
输出:www,bbb;模型 f(x)=sign(w⋅x+b)f(x)=sign(w \cdot x+b)f(x)=sign(w⋅x+b)
1、选取初始值 w0w_0w0,b0b_0b0;
2、在训练集中选取数据(xi,yi)(x_i, y_i)(xi,yi);
3、如果 yi(w⋅x+b)≤0y_i(w \cdot x+b) \leq 0yi(w⋅x+b)≤0,则 w=w+ηyixiw=w+\eta y_i x_iw=w+ηyixi;$b=b+\eta y_i $;
4、转至 2
,直到训练集中没有误分类点。
假设样本点 (xi,yi)(x_i, y_i)(xi,yi) 在整个更新过程中被误分类 nin_ini 次,那么权重更新公式更改为: w=∑i=1Nniηyixiw=\sum\limits_{i = 1 }^N n_i \eta y_i x_iw=i=1∑Nniηyixi;b=∑i=1Nniηyib=\sum\limits_{i = 1 }^N n_i \eta y_ib=i=1∑Nniηyi。那么模型函数为: f(x)=sign(∑i=1Nniηyixi⋅x+∑i=1Nniηyi)f(x)=sign(\sum\limits_{i = 1 }^N n_i \eta y_i x_i \cdot x+ \sum\limits_{i = 1 }^N n_i \eta y_i )f(x)=sign(i=1∑Nniηyixi⋅x+i=1∑Nniηyi)
按照新的权重更新方式,直到训练集中没有误分类点。
import numpy as np
import random
import matplotlib.pyplot as plt# sign function
def sign(v):if v > 0:return 1else:return -1# train function to get weight and bias
def training():train_data1 = [[1, 3, 1], [2, 5, 1], [3, 8, 1], [2, 6, 1]] # positive sampletrain_data2 = [[3, 1, -1], [4, 1, -1], [6, 2, -1], [7, 3, -1]] # negative sampletrain_data = train_data1 + train_data2;weight = [0, 0]bias = 0learning_rate = 0.1train_num = int(input("train num:"))for i in range(train_num):train = random.choice(train_data)x1, x2, y = train;y_predict = sign(weight[0] * x1 + weight[1] * x2 + bias)print("train data:x:(%d, %d) y:%d ==>y_predict:%d" % (x1, x2, y, y_predict))if y * y_predict <= 0:weight[0] = weight[0] + learning_rate * y * x1weight[1] = weight[1] + learning_rate * y * x2bias = bias + learning_rate * yprint("update weight and bias:")print(weight[0], weight[1], bias)print("stop training :")print(weight[0], weight[1], bias)# plot the train data and the hyper curveplt.plot(np.array(train_data1)[:, 0], np.array(train_data1)[:, 1], 'ro')plt.plot(np.array(train_data2)[:, 0], np.array(train_data2)[:, 1], 'bo')x_1 = []x_2 = []for i in range(-10, 10):x_1.append(i)x_2.append((-weight[0] * i - bias) / weight[1])plt.plot(x_1, x_2)plt.show()return weight, bias# test function to predict
def test():weight, bias = training()while True:test_data = []data = input("enter q to quit,enter test data (x1, x2):")if data == 'q':breaktest_data += [int(n) for n in data.split(',')]predict = sign(weight[0] * test_data[0] + weight[1] * test_data[1] + bias)print("predict==>%d" % predict)if __name__ == "__main__":test()
案例参考
感知机算法到这里就结束了,望大家多多指点。