[机器学习篇]基于Scikit learn库中KNN,SVM算法的笔迹识别

前言

这里介绍,如何运用Scikit learn库中的KNN,SVM算法进行笔迹识别。

数据说明:

数据共有785列,第一列为label,剩下的784列数据存储的是灰度图像(0~255)的像素值 28*28=784

安装scikit learn库

看了很多安装教程,都没有安装成功。最后参考了官方网站的安装文档,只需要一步步照着做下来就能成功安装scikit learn 安装文档

函数介绍:

主成分分析(Principal components analysis,PCA):

一种分析、简化数据集的技术。主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征。过程是求协方差矩阵的特征值与特征向量,通过保留低阶主成分,忽略高阶主成分。这样低阶成分往往能够保留住数据的最重要方面。
c.f.:svd奇异值分析
实际中会用svd奇异值分析去代替它,因为pca计算量比较大。

from sklearn.decomposition import PCA
#从sklearn中导入PCA
pca = PCA(n_components=0.8,whiten=True)
#设置PCA参数
#n_components:
#设为大于零的整数,会自动的选取n个主成分,
#设为分数时,选择特征值占总特征值大于n的,作为主成分
#whiten:
#True表示做白化处理,白化处理主要是为了使处理后的数据方差都一致
pca.fit_transform(data)
pca.transform(data)
#对数据data进行主成分分析


from sklearn.neighbors import KNeighborsClassifier
#导入Scikit learn库中的KNN算法

neighbors=kneighbors([X, n_neighbors, return_distance])
#找到一个点的K近邻,n_neighbors近邻的数目
neighbors.fit(Training data,Target values)
#对训练集的输入和输出进行训练
pre= neighbors.predict(Test samples)
#对测试集的输入进行预测,返回预测出的标签

 
 

    KNN完整程序及注解

    import pandas as pd
    from sklearn.decomposition import PCA
    from sklearn.neighbors import KNeighborsClassifier
    import time
    
    if __name__ =="__main__":
        train_num = 20000
        test_num = 30000
        data = pd.read_csv('train.csv')
        train_data = data.values[0:train_num,1:]
        train_label = data.values[0:train_num,0]
        test_data = data.values[train_num:test_num,1:]
        test_label = data.values[train_num:test_num,0]
    
        t = time.time()
        pca=PCA(n_components = 0.8)
        train_x = pca.fit_transform(train_data)
        test_x = pca.transform(test_data)
        neighbors = KNeighborsClassifier(n_neighbors=4)
        neighbors.fit(train_x,train_label)
        pre= neighbors.predict(test_x)
    
        acc = float((pre==test_label).sum())/len(test_x)
        print u'准确率:%f,花费时间:%.2fs' %(acc,time.time()-t)
     
     

      运行结果:

      准确率:0.946000,花费时间:7.98s

      svm方法:

      支持向量机(Support Vector Machine,常简称为SVM)是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析。
      支持向量机建构一个或多个高维的超平面来分类资料点,这个超平面即为分类边界。直观来说,好的分类边界要距离最近的训练资料点越远越好。在支持向量机中,分类边界与最近的训练资料点之间的距离称为间隔(margin);支持向量机的目标即为找出间隔最大的超平面来作为分类边界。

      from sklearn import svm
      #从sklearn库中导入svm
       
       

      SVC函数

      svc=svm.SVC(*C=1.0*, *kernel='rbf'*, *degree=3*)
      #C是惩罚因子
      #kernel核方法,常用的核方法有:‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
      svc.fit(X, y, sample_weight=None)
      #对训练集的输入和输出进行训练
      svc.predict(x)
      #对测试集的输入进行预测,返回预测出的标签
      #####SVM完整程序及注解
       
       
        import pandas as pd
        from sklearn.decomposition import PCA
        from sklearn import svm
        import time
        
        if __name__ =="__main__":
            train_num = 5000
            test_num = 7000
            data = pd.read_csv('train.csv')
            train_data = data.values[0:train_num,1:]
            train_label = data.values[0:train_num,0]
            test_data = data.values[train_num:test_num,1:]
            test_label = data.values[train_num:test_num,0]
            t = time.time()
            #svm方法
            pca = PCA(n_components = 0.8,whiten = True)
            train_x = pca.fit_transform(train_data)
            test_x = pca.transform(test_data)
            svc = svm.SVC(kernel = 'rbf',C = 10)
            svc.fit(train_x,train_label)
            pre = svc.predict(test_x)
            acc = float((pre==test_label).sum())/len(test_x)
            print u'准确率:%f,花费时间:%.2fs' %(acc,time.time()-t)
         
         

          运行结果:

          准确率:0.953000,花费时间:13.95s

          对比:

          在对5000个数据进行训练,2000个数据进行测试的过程中,SVM比KNN的准确率更高,所用时间更长。







          • 1
            点赞
          • 3
            收藏
            觉得还不错? 一键收藏
          • 1
            评论

          “相关推荐”对你有帮助么?

          • 非常没帮助
          • 没帮助
          • 一般
          • 有帮助
          • 非常有帮助
          提交
          评论 1
          添加红包

          请填写红包祝福语或标题

          红包个数最小为10个

          红包金额最低5元

          当前余额3.43前往充值 >
          需支付:10.00
          成就一亿技术人!
          领取后你会自动成为博主和红包主的粉丝 规则
          hope_wisdom
          发出的红包
          实付
          使用余额支付
          点击重新获取
          扫码支付
          钱包余额 0

          抵扣说明:

          1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
          2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

          余额充值