02.感知机 李航统计学习方法
原文链接:https://blog.csdn.net/qq_39355828/article/details/117510739 (opens new window)
# 02.感知机 李航统计学习方法
数据为:
T={ { x1,y1},{ x2,y2},{ ...}} T=\left { \left { x_1,y_1 \right } ,\left { x_2,y_2 \right },\left { ... \right }\right } T={ { x1,y1},{ x2,y2},{ ...}}
感知机模型为:
f(x)=sign(w⋅x+b) f(x)=\operatorname{sign}(w \cdot x+b) f(x)=sign(w⋅x+b)
这是一个超平面,当分类为正时候,则输出为1,反之为0,损失函数如下,使得下士最小的w和b值就是要求的,使用梯度下降算法,进行搜索:
minw,bL(w,b)=−∑xi∈Myi(w⋅xi+b) \min {w, b} L(w, b)=-\sum{x_{i} \in M} y_{i}\left(w \cdot x_{i}+b\right) w,bminL(w,b)=−xi∈M∑yi(w⋅xi+b)
当出现分类错误的点时,就进行w更新,梯度下降方法如下:
w=w+ηyixib=b+ηyi w = w + \eta y_{i}x_{i}\ b = b + \eta y_{i} w=w+ηyixib=b+ηyi
python代码实现如下:
import numpy as np
def perceptron(x,y,r):#输入数据,包括数据,标签和学习率
size=np.shape(x)
print(size)
#w=np.zeros((1,size[1]))
w = np.zeros((1, size[1]))#w和输入数据的维度有关,由此可以实现内积
print(w.shape)
b=0
i=0
cnt=0#记录正确的计算方式
index=True
print(size[0])
while index:
result=y[i]*(np.inner(w,x[i])+b)#求y*(wx+b)
if result>0:#分类正确
cnt+=1
if result<=0:
w=w+r*y[i]*x[i]#梯度下降,更新W和b
b=b+r*y[i]
i=i+1
if size[0]==i and cnt==size[0]:#所有的数据使用完成 并且全部区分完成,则退出循环
index=False
if size[0]==i:
i=0
cnt=0
return w,b
dataSet = np.array([[3,3,3],[4,3,3],[1,1,1]])#数据准备
y = [1,1,-1]#标签
w,b = perceptron(dataSet,y,0.05)#0.05为下降梯度
print(w,b)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
参考:
解释:李航《统计学习方法》代码:https://blog.csdn.net/QianLong/article/details/103890023?opsrequestmisc= 解释:李航《统计学习方法》\ 代码:https://blog.csdn.net/QianLong_/article/details/103890023?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162268219916780255213563%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162268219916780255213563&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-103890023.pc_search_result_control_group&utm_term=%E6%84%9F%E7%9F%A5%E5%90%91%E9%87%8F%E6%9C%BA+%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0&spm=1018.2226.3001.4187 解释:李航《统计学习方法》代码:https://blog.csdn.net/QianLong/article/details/103890023?opsrequestmisc=