k最近邻(k-nn)


本文介绍一种最简答的有监督学习算法: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]




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值