zoukankan      html  css  js  c++  java
  • 机器学习算法

    在上两节中,我们讲解了机器学习的决策树和k-近邻算法,本节我们讲解另外一种分类算法:支持向量机SVM。

    SVM是迄今为止最好使用的分类器之一,它可以不加修改即可直接使用,从而得到低错误率的结果。

    【案例背景】

    从前有两个地主,他们都是占山为王的一方霸主。本来各自吃饱自己的饭万事无忧,可是人心不知足蛇吞象啊,自己总是都想占对方的一亩三分地,冲突争吵从来都没有停歇过。当时的环境就是谁狠这土地就归谁,但是我们现在想从科学的角度来分析,如何让他们的地盘均分,画条边界线,从此互不干扰呢?

    【演示代码】

    import numpy as np  
    import matplotlib.pylab as plt
    from sklearn import svm  
    
    #生成随机分布的点
    np.random.seed(1)  
    X=np.r_[np.random.randn(20,2)-[2,2],np.random.randn(20,2)+[2,2]]  
    Y=[0]*20+[1]*20
    
    #在图中画出随机分布的点
    plt.scatter(X[:,0],X[:,1],c=Y,s=80,cmap=plt.cm.Paired) 
    
    #这里是SVM核心算法函数 
    clf=svm.SVC(kernel='linear')  
    clf.fit(X,Y)
      
    #画出分割线  
    w=clf.coef_[0]  
    a=-w[0]/w[1]  #得到斜率
    xx=np.linspace(-5,5)  
    yy=a*xx-(clf.intercept_[0])/w[1]  
    plt.plot(xx,yy,'k-')
      
    #在图中画出支持向量的点的两条直线
    b=clf.support_vectors_[0]  
    yy_down=a*xx+(b[1]-a*b[0])  
    b=clf.support_vectors_[-1]  
    yy_up=a*xx+(b[1]-a*b[0])
    plt.plot(xx,yy_down,'k--')  
    plt.plot(xx,yy_up,'k--')  
    
    #将支持向量的点特殊显示  
    plt.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],s=100)
    
    #在图中显示需要预测的点
    test_x1, test_y1 = (-3, -3)
    test_x2, test_y2 = (0, 5)
    plt.scatter([test_x1],[test_y1],s=100)
    plt.scatter([test_x2],[test_y2],s=100)
    Z1 = clf.predict([[test_x1, test_y1]])
    Z2 = clf.predict([[test_x2, test_y2]])
    print('预测结果:',Z1)  #显示预测结果
    print('预测结果:',Z2)  #显示预测结果
    
    plt.show()  

    【执行结果】

    预测结果: [0]
    预测结果: [1]

    【结果分析】

    在上图中,用了4种颜色的圆点和三条直线,他们分别表示如下:

    浅色点:地主1的建筑物

    紫色点:地主2的建筑物

    蓝色点:地主1和地主2相邻的关键建筑物

    黄色点:预测点1

    绿色点:预测点2

    实体直线:最终的分界线,即楚河汉界的分界线,直线下方是地主1的地盘,直线上方是地主2的地盘。

    虚线:关键点连成的直线,他们到分界线是等距的。

    我们看到预测结果,黄点预测结果显示0,表示它在地主1的地盘;绿点预测结果显示1,表示它在地主2的地盘。

    当然我们从肉眼也可以判断本次预测结果是对的。

    【算法总结】

    1. SVM算法只能划分两类物体,当然多类的情况可以转化为多次两类进行划分。

    2. SVM算法不仅能划分线性可分的情况,还可以划分更加复杂线性不可分的情况,核心思想是:变成高阶计算,然后映射到低阶,以后有机会再单独演示这种情况。

     OK, 本讲到此结束,后续更多精彩内容,请持续关注我的博客。

    本文为原创文章,请珍惜作者的劳动成果,转载请注明出处。

    原文地址:http://www.cnblogs.com/robin201711/p/7998613.html

  • 相关阅读:
    php中的抽象方法和抽象类,简单明了,一点通
    PHP_保留两位小数并且四舍五入(可用于精度计算)_保留两位小数并且不四舍五入
    如何使用php生成唯一ID的4种方法
    Redis案例——商品秒杀,购物车
    centos+python2+apache2+django环境搭建
    前端上传图片并显示
    通过容器提交镜像(docker commit)以及推送镜像(docker push)
    Name or service not known原因大全
    VMware Workstation 与 Device/Credential Guard 不兼容.在禁用 Device/Credenti
    win10家庭版VMware,禁用Device/Credential Guard不兼容问题
  • 原文地址:https://www.cnblogs.com/robin201711/p/7998613.html
Copyright © 2011-2022 走看看