区别
由误分类点调整 w , b 将
w , b
表示成
x
和 y 的线性组合的形式,从而得到
w , b
问1:如何简单地理解学习算法的对偶形式? 通常来说,对于原始形式不好解决的问题,可以转换到对应的对偶形式中,使之更容易求解。比如,在多维空间中运算量较大,感知机学习的对偶形式能够更加简地便计算。 问2:为什么在对偶形式中,迭代更新
α
和
b
能够得到参数 w 和
b
呢?
对偶形式的基本想法是,将 w 和
b
表示为实例 x i 和标记
y i
的线性组合的形式,通过求解其系数而求得
w
和 b .现在假设初始值
w 0 , b 0
均为
0
. 对误分类点 ( x i , y i ) 通过
w ← w + η y i x i
b ← b + η y i
逐步修改
w , b
. 设修改了
n
次,则 w , b 关于
( x i , y i )
的增量分别是
α i y i x i
和
α i y i
,这里
α i = n i η
. 最后学习到的
w , b
可以分别表示为
w = ∑ i = 1 N n i η y i x i = ∑ i = 1 N α i y i x i
b = ∑ i = 1 N n i η y i = ∑ i = 1 N α i y i
这里,
α i ≥ 0 , i = 1 , 2 , ⋯ , N
,当
η = 1
时
,
α i
表示第i个实例点由于误分二进行更新的次数. 当某一个实例点更新的次数越多,意味着它距离分离超平面越近,也就越难分类. 换句话说,这样的实例对学习结果影响最大.
3. 算法实现
例子:正样本点是
x 1 = ( 3 , 3 ) T , x 2 = ( 4 , 3 ) T ,
负样本点是
x 3 = ( 1 , 1 ) T ,
试用感知机学习算法对偶形式求感知机模型.
import numpy as np
x = np.array([[3 ,3 ],[4 ,3 ],[1 ,1 ]])
y = np.array([1 ,1 ,-1 ])
history = []
gramMatrix = x.dot(x.T)
print "gramMatrix = " ,gramMatrix
alpha = np.zeros(len(x))
b = 0
learnRate = 1
k = 0 ; i = 0
while 1 :
if y[i] * (np.sum(alpha * y * gramMatrix[i])+ b)<=0 :
alpha[i] = alpha[i] + learnRate
b = b + learnRate * y[i]
i = 0
k = k + 1
history.append([(alpha * y.T).dot(x), b])
print "iteration counter =" ,k
print "alpha = " ,alpha
print "b = " , b
continue
else :
i = i + 1
print "i = " ,i
if i >= x.shape[0 ]:
print "iteration finish"
break
w = (alpha*y.T).dot(x)
print "w = " , w
print "b = " , b
print "history w,b = " ,history
import matplotlib.pyplot as plt
from matplotlib import animation
fig = plt.figure()
ax = plt.axes()
line, = ax.plot([], [], 'g' , lw=2 )
label = ax.text([], [], '' )
def init () :
global x,y,line,label
plt.axis([-6 , 6 , -6 , 6 ])
plt.scatter(x[0 :2 ,0 ],x[0 :2 ,1 ],c ="r" ,label = "postive" ,s = 60 )
plt.scatter(x[2 ,0 ],x[2 ,1 ],c = "y" ,label = "negtive" ,s =60 )
plt.grid(True )
plt.xlabel('X1' )
plt.ylabel('X2' )
plt.title('myPerceptron' )
return line, label
def animate (i) :
global history, ax, line, label
w = history[i][0 ]
b = history[i][1 ]
if w[1 ] == 0 : return line, label
x1 = -6.0
y1 = -(b + w[0 ] * x1) / w[1 ]
x2 = 6.0
y2 = -(b + w[0 ] * x2) / w[1 ]
line.set_data([x1, x2], [y1, y2])
x1 = 0.0
y1 = -(b + w[0 ] * x1) / w[1 ]
label.set_text(str( history[i][0 ]) + ' ' + str(b))
label.set_position([x1, y1])
return line, label
anim = animation.FuncAnimation(fig, animate,init_func=init, frames=len(history), interval=1000 , repeat=True ,blit=True )
plt.legend(fancybox = True )
plt.show()
实现效果:
4. 总结
感知机是最简单最基础的分类器,理论也较简单. 但到了真正自己动手实现算法的时候,会遇到各种各样的问题. 说到底还是经验不足,以后有空还是要多推敲推敲代码. 一边实践,一边温习理论知识,理解才会更加深刻.
参考资料:
http://www.hankcs.com/ml/the-perceptron.html
本文作为个人学习笔记,有什么不正确的地方,还请多多批评指正
确定要放弃本次机会?
福利倒计时
:
:
立减 ¥
普通VIP年卡可用
立即使用
01-31
1584
07-22
1034
夏目_
CSDN认证博客专家
CSDN认证企业博客
60
积分
3
粉丝
5
获赞
1
评论
8
收藏
成就一亿技术人!