k-临近算法

来源:互联网 发布:淘宝主图图标素材 编辑:程序博客网 时间:2024/09/21 09:25

####################### 该代码文件可以直接运行,无需修改,输入数据 inx 可以自由修改以测试该分类器

import operator 

from numpy import *

####创建和准备的数据集
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])      ###这里有4组数据,每组数据抽象出两个特征
labels = ['A','A','B','B']    ######每组数据所属的类别
return group,labels  


def classify0(inx,dataset,labels,k):           ##########创建一个分类器,功能:判断数据 inx 属于哪个类别
datasetsize = dataset.shape[0]           获得训练样本集的大小

        ####计算距离

diffmat = tile(inx,(datasetsize,1)) - dataset      

print diffmat
sqdiffmat = diffmat ** 2
sqdistances = sqdiffmat.sum(axis = 1)
distances = sqdistances ** 0.5

print distances

        ########排序,sortdistinedicies存储的是下标(按距离从小到大排序)

sortdistindicies = distances.argsort() 
print sortdistindicies

classcount = {}

       ############选取距离最小的k个点,并保存成字典形式(类别:该类别频率)

for i in range(k):
votelabel = labels[sortdistindicies[i]]
classcount[votelabel] = classcount.get(votelabel,0) + 1

print votelabel, classcount[votelabel]

      ###########对这k个点按照类别频率进行排序(从高到低)

###sortedclasscount = sorted(classcount.iteritems(),key = operator.itemgetter(1),reverse = True)
sortedclasscount = sorted(classcount.iteritems(),key = lambda d:d[1],reverse = True)
print sortedclasscount[0]   ###打印出现频率最高的类别,即为数据 inx 的类别
print sortedclasscount1[0]
def main():        
dataset,labels = createDataSet()
print dataset
classify0([0,0],dataset,labels,3)
if __name__ == '__main__':
main()
0 0