knn

寻找与这个待分类的样本在特征空间中距离最近的K个已标记的样本作为参考,来帮助我们做出分类决策

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 17 21:27:03 2017
@author: aa
"""
from sklearn.datasets import load_iris
iris=load_iris()
print(iris.data.shape)
#(150L, 4L)
#print iris.DESCR
from sklearn.cross_validation import train_test_split
# train_test_split 用于数据分割
X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.25,random_state=33)
# 采样25%作为测试集
from sklearn.preprocessing import StandardScaler
# 导入数据标准化模块
from sklearn.neighbors import KNeighborsClassifier
ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.fit_transform(X_test)
# 标准化 训练和测试数据
knc=KNeighborsClassifier()
knc.fit(X_train,y_train)
y_predict=knc.predict(X_test)
print 'The accuracy of K-Nearest Neighor Classifier is',knc.score(X_test,y_test)
# 模型自带的评估函数进行准确率测评
# 0.710526315789
from sklearn.metrics import classification_report
print classification_report(y_test,y_predict,target_names=iris.target_names)
# classification_report对预测结果进行更详细的分析
# precision recall f1-score support
#
# setosa 1.00 1.00 1.00 8
# versicolor 0.50 1.00 0.67 11
# virginica 1.00 0.42 0.59 19
#avg / total 0.86 0.71 0.70 38

该模型没有参数训练的过程,只是根据测试样本在训练数据的分布直接做出分类决策,因此KNN属于无参数模型,正是这样的决策算法,导致了其非常高的计算复杂度和内存消耗 。因为该模型每处理一个测试样本,都需要对所有预先加载在内存的训练样本进行遍历,逐一计算相似度、排序并且选取K个最近邻训练样本的标记,进而做出分类决策。这是平方级别的算法复杂度 ,一旦数据规模稍大,使用者便需要权衡更多计算时间的代价。