您的位置:首页 > 其它

k最近邻(k-nn)

2016-01-26 15:03 239 查看


本文介绍一种最简答的有监督学习算法:knn。具体算法如下:



如在下图中,训练样本只有四个记录,待分类样本为(3,7)。取k=3 。计算结果发现。1,3,4三条记录是最近邻样本。其中属于“好”类的有两个,“坏”类的有一个,所以待分类样本(3,7)的结果是“好”。如果取k=1,距离待分类样本最近是第三条记录,他的结果是“好”,所以待分类样本的结果也是“好”。可见这里使用knn是比较合理的。



源数据如下(raw_data)

1:7 7
1:7 4
0:3 4
0:1 4

代码如下(main.py)

#encoding=utf-8
#获取两个整型列表的平方差之和
def get_distance(list1,list2):
length=len(list1)
total=0
for i in xrange(0,length):
#print i,list1[i],list2[i]
result1= (list1[i] - list2[i]) ** 2
#print result1
total = total + result1
return total

predict_data=[3,7]#判断它的类别
raw_data=open("raw_data","r+")#读取源数据
raw_list=raw_data.readlines()
map_list=[]
record_index=0#
for ele in raw_list:#对于源数据的每一行 1:7 7
ele=ele.strip()
split_list=ele.split(":")
tag=split_list[0]
feature=split_list[1]
feature_list=feature.split(" ")
feature_list_int=[]
for ele in feature_list:
feature_list_int.append(int(ele.strip()))
list1=[]
list1.append(record_index)#每条记录的id
record_index = record_index + 1
for ele in feature_list:#每条记录的特性
list1.append(int(ele.strip()))
distance=get_distance(predict_data,feature_list_int)#每条记录和预测特征的欧式距离
list1.append(distance)
list1.append(int(tag.strip()))#每条记录的标签
#print list1
map_list.append(list1)
#list1=[ [0,7,7,16,1],[1,7,4,25,1],[2,3,4,9,0],[3,1,4,13,0] ]#未排序前的map_list: id feature1 feature2 distance tag
map_list.sort(key=lambda x:x[3])
map_file=open("map_data","w+")
for ele in map_list:#将处理后的数据写入文件
map_file.write(str(ele))
map_file.write("\n")
#下面开始knn算法
class1 = 0 #好
class2 = 1 #坏
class1_no = 0
class2_no = 0
k = 3
top_k_neighbor=map_list[0:k]#k个最近邻
for ele in top_k_neighbor:#统计k个最近邻中每个标签的数量
if ele[4] == class1:
class1_no = class1_no + 1
#print class1,ele[3]
if ele[4] == class2:
class2_no = class2_no + 1
#print class2,ele[3]
if(class1_no > class2_no):#哪个标签的数量最多,就是属于哪一类
print "good"
if(class1_no < class2_no):
print "bad"
if(class1_no == class2_no):
print "choose another k"


数据处理结果如下(map_data)

[2, 3, 4, 9, 0]
[3, 1, 4, 13, 0]
[0, 7, 7, 16, 1]
[1, 7, 4, 25, 1]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息