您的位置:首页 > 其它

手写一个机器学习的入门算法-感知器算法

2016-08-21 16:56 309 查看
用4x+5y=2000作为分界线制造了100个点;
初始分界线为0,0;
经过1000轮纠正后,结果是:
22x+31y=11876
对比结果4x+5y=2000
还是比较接近的。
刚开始更新w的那行代码搞错了,以为是用predict去纠正,其实应该用sample的真实值去纠正。
importrandom;

deffind_split(points):
w=(0,0,0)
for_inrange(1,2000):
print'w='+str(w);
forptinpoints:
(x1,x2,z)=pt;
(w1,w2,w3)=w;
predict=int((w1+w2*x1+w3*x2)>0)*2-1
ifpredict!=z:
print'wrong:'+str(pt)
w=(w1+z,w2+z*x1,w3+z*x2);
#break;
else:
print'right:'+str(pt)
returnw;

deftest_split(points,w):
points_2=filter(lambdapt:((int(w[0]+w[1]*pt[0]+w[2]*pt[1])>=0)*2-1)==pt[2],points)
returnpoints_2;

definit_points(max_x,max_y,num_of_pts):
points=[];
foriinrange(1,num_of_pts,1):
x=int(random.random()*max_x);
y=int(random.random()*max_y);
z=int((4*x+5*y)>=2000)*2-1
points.append((x,y,z));
returnpoints;


if__name__=='__main__':
points=init_points(400,500,100);
printpoints;
line=find_split(points);
print(line);
pts=test_split(points,line);
printpoints;
printlen(pts);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐