机器学习(KNN算法)

来源:互联网 发布:瞩目软件 编辑:程序博客网 时间:2024/05/04 12:26

1.KNN工作原理

简单地说,谷近邻算法采用测量不同特征值之间的距离方法进行分类。

存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近 邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最 后 ,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

2.KNN算法

机器学习实战书内的示例KNN算法python代码如下:

def classify0(inX,dataSet,labels,k):    #得到训练样本的行数    dataSetSize = dataSet.shape[0]    diffMat = tile(inX, (dataSetSize,1))-dataSet    sqDiffMat = diffMat**2    #将行相加则    sqDistances = sqDiffMat.sum(axis=1)    distances = sqDistances**0.5    #从小到大排序返回索引    sortedDistIndicies = distances.argsort()    #统计每个类的次数    classCount ={}    for i in range(k):        label = labels[sortedDistIndicies[i]]        #get函数获取键,若没有该键则默认值为0,原型为dict.get(key,default = None)        classCount[label] = classCount.get(label,0)+1    #对字典按键和值进行排序,reverse默认为false,则从小到大排序,operator.itemgetter(1)按值进行排序    sortedclassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True)    return sortedclassCount[0][0]


diffMat = tile(inX, (dataSetSize,1))-dataSet中tile函数用法如下:

函数格式tile(A,reps)

A:输入的array   B:A沿各个维度重复的次数

reps的数字从后往前分别对应A的第N个维度的重复次数。

如tile(A,2)表示A的第一个维度重复2遍

>>> tile(1,2)array([1, 1])
tile(A,(2,3))表示A的第一个维度重复3遍,然后第二个维度重复2遍

>>> b=[1,3,5]>>> tile(b,[2,3])array([[1, 3, 5, 1, 3, 5, 1, 3, 5],       [1, 3, 5, 1, 3, 5, 1, 3, 5]])

sqDistances = sqDiffMat.sum(axis=1)中sum函数用法如下:

.sum()函数是模块numpy的一个函数,参数axis默认为None,表示将所有元素的值相加, axis=1表示按行相加 , axis=0表示按列相加

>>> import numpy as np>>> a=np.sum([[0,1,2],[2,1,3]])>>> a9>>> a.shape()>>> a=np.sum([[0,1,2],[2,1,3]],axis=0)>>> aarray([2, 2, 5])>>> a.shape(3,)>>> a=np.sum([[0,1,2],[2,1,3]],axis=1)>>> aarray([3, 6])>>> a.shape(2,)

classCount[label] = classCount.get(label,0)+1中get()函数用法如下:

函数原型
dict.get(key, default=None)

key -- 字典中要查找的键。default -- 如果指定键的值不存在时,返回该默认值值。

返回指定键的值,如果值不在字典中返回默认值None。

实例:

#!/usr/bin/pythondict = {'Name': 'Zara', 'Age': 27}print "Value : %s" %  dict.get('Age')print "Value : %s" %  dict.get('Sex', "Never")

以上实例输出结果为:

Value : 27Value : Never

3.scikit-learn实现KNN算法

读取Iris数据集细节资料代码如下:

>>>#从sklearn.datasets 导入 iris 数据加载器>>>from sklearn.datasets import load_iris>>>#使用加载器读取数据并且存入变量iris。>>>iris = load_iris()>>>#查验数据规模>>>iris.data.shape>>>(150L,4L)>>>#从sklearn.cross_validation 里选择导入 train_test_split 用于数据分割>>>from sklearn.cross_validation import train_test_split>>>#利用随机种子random_state 采样25%的数据作为测试数据>>>X_train,X_test,y_train,y_test  = train_test_split(iris.data,iris.target,test_size = 0.25,random_state = 33)

使用K近邻分类器对数据进行类别预测代码如下:

>>>#从sklearn.preprocessing 里选择导入数据标准化模块>>>from sklearn.preprocessing import StandardScaler>>>#从sklearn.neighbors 里选择导入KNeighborsClassifier>>>from sklearn.neighbors import KNeighborsClassifier>>>#对训练和测试的特征数据进行标准化>>>ss = StandardScaler()>>>X_train = ss.fit_transform(X_train)>>>X_test = ss.transform(X_test)>>>#使用K近邻分类器对测试数据进行预测,预测结果保存在变量y_predict中>>>knc = KNeighborsClassifier()>>>knc.fit(X_train,y_train)>>>y_predict = knc.predict(X_test)

对K近邻分类器在数据上的预测性能进行评估代码如下:

>>>#使用模型自带的评估函数进行准确性测评>>>print 'The accuracy of K-Nearest Neighbor Classifier is',knc.score(X_test,y_test)>>>The accuracy of K-Nearest Neighbor Classifier is 0.894796455>>>#依然使用sklearn.metrics里面的classification_report模块>>>from sklearn.metrics import classification_report>>>print classification_report(y_test,y_predict,target_names = iris.target_names)

总结:

K近邻算法与其他模型最大的不同在于:该模型没有参数训练过程。也就是说,我们并没有通过任何学习算法分析训练,而只是根据测试样本在训练数据的分布直接做出分类决策。

该模型每处理一个测试样本,都需要对所有预先加载在内存的训练样本进行遍历、逐一计算相似度、排序并且选取K个最近邻训练样本的标记,进而做出分类决策。这是平方级别的计算复杂度,一旦数据规模稍大,使用者便需要权衡更多计算时间的代价。