xiaoxixi 2019-03-17
之前我们用自己写KNN算法[网址]识别了MNIST手写识别数据 [数据下载地址]
这里介绍,如何运用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进行主成分分析
KNeighborsClassifier官方文档
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);支持向量机的目标即为找出间隔最大的超平面来作为分类边界。
sklearn库svm官方文档
SVC
, NuSVC
和 LinearSVC
是三种用于对数据进行多类分类的类,我们这里主要用到SVC(class sklearn.svm.SVC)。
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的准确率更高,所用时间更长。
pytyhon学习资料
python学习资料