机器学习(KNN算法)

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]])
>>> a
9
>>> a.shape
()
>>> a=np.sum([[0,1,2],[2,1,3]],axis=0)
>>> a
array([2, 2, 5])
>>> a.shape
(3,)
>>> a=np.sum([[0,1,2],[2,1,3]],axis=1)
>>> a
array([3, 6])
>>> a.shape
(2,)

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

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

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

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

实例:

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 27}

print "Value : %s" %  dict.get('Age')
print "Value : %s" %  dict.get('Sex', "Never")

以上实例输出结果为:

Value : 27
Value : 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个最近邻训练样本的标记,进而做出分类决策。这是平方级别的计算复杂度,一旦数据规模稍大,使用者便需要权衡更多计算时间的代价。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值