机器学习常见模型(面试必备)
第一篇:感知机模型
一、感知机概述
1.1 感知机必备知识
- 针对:二分类问题
- 实质:分离超平面,是一个判别模型
- 策略:基于误分类的损失函数
- 方法:利用梯度下降对损失函数进行极小化
- 特点:简单易实现
- 分类:原始形式,对偶形式
1.2 原始感知机
-
输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1, y_1), (x_2, y_2), ... , (x_N, y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},其中 X i ∈ R n X_i\in R^n Xi∈Rn, y i ∈ y = { − 1 , + 1 } y_i \in y=\{-1, +1\} yi∈y={−1,+1}, i = 1 , 2 , . . . , N i=1, 2, ... , N i=1,2,...,N,学习率 η ( 0 < η ≤ 1 ) \eta(0<\eta \leq 1) η(0<η≤1)。
-
输出: w w w, b b b;模型 f ( x ) = s i g n ( w ⋅ x + b ) f(x)=sign(w \cdot x+b) f(x)=sign(w⋅x+b)
1、选取初始值 w 0 w_0 w0, b 0 b_0 b0;
2、在训练集中选取数据 ( x i , y i ) (x_i, y_i) (xi,yi);
3、如果 y i ( w ⋅ x + b ) ≤ 0 y_i(w \cdot x+b) \leq 0 yi(w⋅x+b)≤0,则 w = w + η y i x i w=w+\eta y_i x_i w=w+ηyixi;$b=b+\eta y_i $;
4、转至2
,直到训练集中没有误分类点。
1.3 对偶感知机
-
假设样本点 ( x i , y i ) (x_i, y_i) (xi,yi) 在整个更新过程中被误分类 n i n_i ni 次,那么权重更新公式更改为: w = ∑ i = 1 N n i η y i x i w=\sum\limits_{i = 1 }^N n_i \eta y_i x_i w=i=1∑Nniηyixi; b = ∑ i = 1 N n i η y i b=\sum\limits_{i = 1 }^N n_i \eta y_i b=i=1∑Nniηyi。那么模型函数为: f ( x ) = s i g n ( ∑ i = 1 N n i η y i x i ⋅ x + ∑ i = 1 N n i η y i ) 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)
-
按照新的权重更新方式,直到训练集中没有误分类点。
二、Python编程实现感知机
- 准备数据集
- 模型训练
- 效果测试
- 可视化展示
import numpy as np
import random
import matplotlib.pyplot as plt
# sign function
def sign(v):
if v > 0:
return 1
else:
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 sample
train_data2 = [[3, 1, -1], [4, 1, -1], [6, 2, -1], [7, 3, -1]] # negative sample
train_data = train_data1 + train_data2;
weight = [0, 0]
bias = 0
learning_rate = 0.1
train_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 * x1
weight[1] = weight[1] + learning_rate * y * x2
bias = bias + learning_rate * y
print("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 curve
plt.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':
break
test_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()
三、参考资料
总结
感知机算法到这里就结束了,望大家多多指点。