K近邻---Python---机器学习

本文详细介绍KNN算法的实现原理及步骤,包括数据集创建、距离计算、选择最近邻及分类计数等关键环节,并提供了完整的伪代码示例。

KNN算法伪代码:

这里写图片描述

实现KNN算法基础程序:

"""
Created on Tue Oct 11 19:05:33 2016

@author: Administrator
"""

from numpy import *   #科学计算包
import operator       #运算符模块

def creatDataSet():
    group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])  #创建数据集
    labels=['A','A','B','B']                          #创建标签
    return group,labels

                                          #inX,用于分类的输入向量。即将对其进行分类。
def classify0(inX,dataSet,labels,k):  # inX用于需要分类的数据,dataSet输入训练集
######输入与训练样本之间的距离计算######
     dataSetSize=dataSet.shape[0]    # 读取数据集行数,shape[1]则为列数
     diffMat=tile(inX,(dataSetSize,1)) -dataSet
                 #tile:numpy中的函数。tile将原来的一个数组,扩充成了4个一样的数组。
                 #diffMat得到了目标与训练数值之间的差值。
     sqDiffMat=diffMat**2            #各个元素分别平方  
     sqDistances=sqDiffMat.sum(axis=1)  # 每一个列向量相加,axis=0为行相加  
                                       #对应列相乘,即得到了每一个距离的平方
     distances=sqDistances**0.5         #开方,得到距离。
     sortedDistIndicies=distances.argsort()   #升序排列
 #选择距离最小的k个点。
     classCount={}
     for i in range (k):
         voteIlabel=labels[sortedDistIndicies[i]]  #排名前k个贴标签
         classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #get(key,default=None),就是造字典
 ######找到出现次数最大的点######
  #以value值大小进行排序,reverse=True降序
     sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),
                             reverse=True)
 #key = operator.itemgetter(1),operator.itemgetter函数
 #获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值
     return sortedClassCount [0] [0]
  #返回出现次数最多的value的key

欧氏距离计算:

     dataSetSize=dataSet.shape[0]                # 读取数据集
     diffMat=tile(inX,(dataSetSize,1)) -dataSet  #做扩展
     sqDiffMat=diffMat**2                        #平方  
     sqDistances=sqDiffMat.sum(axis=1)          #列向量累加                          
     distances=sqDistances**0.5                  #开方

选择距离最小的K个点:

classCount={}
for i in range (k):                                        #排名前K个
     voteIlabel=labels[sortedDistIndicies[i]]              #排名前k个贴标签
     classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #分类计数                        
sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),
reverse=True)                                               #计数排序
 return sortedClassCount [0] [0]                        #返回排序次数最多的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值