机器学习简要笔记(三)-KNN算法

 1 #coding:utf-8
 2 
 3 import numpy as np
 4 import operator
 5 
 6 
 7 def classify(intX,dataSet,labels,k):
 8     '''
 9     KNN算法
10     '''
11     dataSetSize =dataSet.shape[0]
12     ##numpy 中shape[0]返回数组的行数,shape[1]返回列数
13     ##构建计算矩阵
14     ##intX横向重复dataSetSize次,纵向重复1次
15     ##例如intX=([1,2])--->([[1,2],[1,2],[1,2],[1,2]])便于后面计算
16     diffMat=np.tile(intX,(dataSetSize,1))-dataSet 
17     ##将待分类样品复制dataSetSize份并与dataSet每个测试样一一对应
18     ##计算待分类样品与已知样品的对应特征差值的平方
19     sqdiffMat=diffMat**2
20     ##计算待分类样品与每个已知样品的欧式距离
21     seqDistance=sqdiffMat.sum(axis=1)  ##axis=1代表横轴(第1轴),0代表竖轴(第0轴)
22     distance=seqDistance**0.5
23     print "distance:",distance
24     ##返回distance中元素从小到达排序后的索引
25     sortDistance=distance.argsort()
26     print "SortDistance:",sortDistance
27     classCount={}
28     for i in range(k):
29         voteLabel=labels[sortDistance[i]]
30         #print "第 %d 个 voteLabel = %s" %(i,voteLabel)
31         classCount[voteLabel]=classCount.get(voteLabel,0)+1
32     ##dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值
33     ##计算类别次数
34     ##key = operator.itemgetter(1)根据字典的值进行排序
35     ##key = operator.itemgetter(0)根据字典的键进行排序
36     ##reverse 降序排序字典
37     sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
38     ##sortClassCount={[“动作片”,2],("爱情片",1])
39     print "sortedClassCount:",sortedClassCount
40     return sortedClassCount[0][0]
41     
42  def File2Matrix(filename):
43     fr=open(filename,'r')
44     FileLines=fr.readlines()
45     ##获取数据的行数
46     NumOfFLines=len(FileLines)
47     ##建立数据返回矩阵
48     returnMat=np.zeros([NumOfFLines,3])
49     ##返回分类标签
50     classLabelVector=[]
51     ##行索引
52     index=0
53     for line in FileLines[1:]:
54         line=line.strip()##删除收尾空白字符
55         listFromLine =line.split("\t")
56         ##每行数据是\t划分的,将每行数据按照\t进行切片划分
57         returnMat[index,:]=listFromLine[1:4]
58         ##根据文本划分为1,2,3类
59         if listFromLine[-1]=="I. setosa":
60             classLabelVector.append(1)
61         elif listFromLine[-1]=="I. versicolor":
62             classLabelVector.append(2)
63         else:
64             classLabelVector.append(3)
65         index+=1
66     fr.close()
67     return returnMat,classLabelVector
68 
69 if __name__ =="__main__":
70     datas,labels=File2Matrix("iris_data.txt")
71     print datas[0:4]
72     print labels[0:4]
73     test = [5.9,3.0,5.1]
74     test_class = myKNN.classify(test,datas,labels,5)
75     if test_class=="1":
76         print "I. setosa"
77     elif  test_class=="3":
78         print "I. virginica"
79     else:
80         print "I. versicolor"
81 
82 
83     
84  
85     

'''本文件实现KNN
KNN算法的本质上使用模板匹配的思想。
要确定一个样本的类别,可以计算它与所有训练样本的距离,
然后找出和该样品最接近的k个样本,统计这些样本的类别进行投票,票数最多的那个类就是分类结果。
'''
'''
KNN算法是一种判别算法,即可支持分类,也可支持回归,是一种非线性模型。
它天然的支持多分类问题。KNN算法没有训练过程,是一种基于实例的算法。
KNN实现对Iris数据的分类。
'''
'''
KNN算法步骤
(1)计算距离
(2)选择距离最小的k个点
(3)排序
'''

猜你喜欢

转载自www.cnblogs.com/milliard/p/9491539.html