您的位置:首页 > 其它

k-近邻算法

2017-05-25 16:17 239 查看

算法伪代码如下:

对未知类别属性的数据集中的每个点依次执行以下操作

(1)计算已知类别数据集中的点与当前点之间的距离;

(2)按照距离递增次序排序;

(3)选取与当前点距离最小的走个点;

(4)确定前灸个点所在类别的出现频率;

(5)返回前k个点出现频率最高的类别作为当前点的预测分类。

# -*- coding: utf-8 -*-

# 这样也行
# coding:utf-8
from numpy import *
import operator
def createDataSet():
group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['A','A','B','B']
return group,labels

#k近邻算法
def classify0(inx,dataset,labels,k):
datasetsize=dataset.shape[0] #获取矩阵的行数
#距离计算 以下完成欧氏距离计算 d = 」(xA0 - xB0)2 + (xA{- xBt )2
# tile用于将数组第一维度扩展4倍,第二维度扩展一倍,再减去dataset
diffmat=tile(inx,(datasetsize,1))-dataset
#对差值矩阵进行平方运算
sqdiffmat=diffmat**2
sqdistance=sqdiffmat.sum(axis=1) #axis=1表示按行求和 ,axis=0表示按列求和
#进行开根号处理
distances=sqdistance**0.5 #欧式距离计算到此结束
print distances
sorteddistindiciles=argsort(distances) #argsort函数返回的是数组值从小到大的索引值
print sorteddistindiciles
classcount={}
#选择最小的k个点
for i in range(k):
voteilabel=labels[sorteddistindiciles[i]] #获取对应的标签
classcount[voteilabel]=classcount.get(voteilabel,0)+1 #d对对应的标签进行计数累加
#排序
sortedclasscount=sorted(classcount.iteritems(),
key=operator.itemgetter(1),reverse=True) #dictionary.iteritems()将classcount迭代成数组
#将字典分解为元组列表,然后使用程序第二行导入运算符模块的itemgetter ,按照第二个元素的次序对元组进行排序©。
#排序为逆序,即按照从最大到最小次序排序,最后返回发生频率最高的元素标签
return sortedclasscount[0][0]
group ,labels=createDataSet()
print classify0([0.5,0],group,labels,3)
4000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: