说白了,感知机就是找到一条直线(称作超平面)用来把两类点分开,这个直线用线性方程表示就是感知机。关键是如何找到分隔两类点的这个(最优)线性方程。
感知机模型
![](https://img.haomeiwen.com/i1367973/e1a0853feee2489f.jpg)
感知机模型的损失函数
因为点到超平面的距离是正的,所以损失函数是非负的。误分类点越少,误分类点离超平面越近,损失函数值就越小。感知机的学习策略就是找到使损失函数最小的参数w,b,也即是找到了感知机模型。
![](https://img.haomeiwen.com/i1367973/1fbd6819594fd226.jpg)
一些问题:
![](https://img.haomeiwen.com/i1367973/98c635b960f84433.jpg)
因为:
当数据点是正确值为+1的时候,你误分类了,那么你判断为-1,则算出来f(x)<0,所以-yi * f(x)>0
当数据点是正确值为-1的时候,你误分类了,那么你判断为+1,则算出来f(x)>0,所以-yi * f(x)>0
参考链接:浅析感知机(一)--模型与学习策略
![](https://img.haomeiwen.com/i1367973/854e9f32ca67a0b4.jpg)
2、因为两类是线性可分的,则很显然可能不只有一个分隔超平面。那么如何确定最优的超平面呢?
方程中yi什属于{+1,-1},具体什么时候应该是+1,什么时候应该是-1呢?
3、如何保证没有误分类点?如何是二分类的,则在有限次迭代后即可。
sign是符号函数
感知机模型损失函数的优化方法,什么是梯度下降法
梯度下降法即表示进行求导,然后向函数值减少的方向不断调整,直到找到极小值。这里要可以参考凸优化以及微积分里面的求导数和偏导数。
![](https://img.haomeiwen.com/i1367973/43ef2ee0bc71648e.jpg)
感知机模型算法过程
随机抽取一个误分类点,通过更新参数w,b使其梯度下降。当实例点被误分类,即位于分离超平面的错误侧,则调整w, b的值,使分离超平面向该无分类点的一侧移动,直至误分类点被正确分类
感知机学习算法的原始形式
![](https://img.haomeiwen.com/i1367973/f83a720c7289fabe.jpg)
# 感知机学习算法初始形式实现代码
import numpy as np
def Train(X_train, Y_train):
#获取维度参数
m, n = np.shape(X_train)
#初始化w,b
w = np.zeros((n, 1))
b = 0
while True:
count = m #统计修改次数,若没有变化,则退出while语句
for i in range(m):
result = Y_train[i]*(np.dot(X_train[i], w) + b)
if result <= 0: #计算yi(w*xi+b),其中np.dot表示矩阵相乘
count -= 1
#更新w,b。注意这里面的对w,b的循环的更新情况
for j in range(n):
w[j] = w[j] + Y_train[i]*X_train[i][j]
b = b + Y_train[i]
print("w:(",w,")","b:",b)
break
if count== m:
break
return w,b
def main():
X_train = np.array(([3, 3], [4,3], [1,1]))
Y_train = np.array(([1,1,-1]))
print(Train(X_train, Y_train))
if __name__ == '__main__':
main()
感知机学习算法的对偶形式
感知机算法的对偶形式看的不是很懂,还需要花时间来看。一个是参数变了以及更新的形式变了。
另外一个就是算法的收敛性的以及证明还需要细看。
![](https://img.haomeiwen.com/i1367973/6d80cd70479e118e.jpg)
![](https://img.haomeiwen.com/i1367973/e13b2cb289695a02.jpg)
参考链接:
点到直线距离公式的几种推导
如何理解感知机学习算法的对偶形式?
浅析感知机(一)--模型与学习策略
感知机
感知机学习算法的对偶形式
网友评论