伪代码如下:
对未知类别属性的数据集中的每个点一次执行以下操作:
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前k个点所在类别出现的频率
(5)返回前k个点出现频率最高的类别作为当前点的预测分类;
本篇博文涉及到的知识请参考下述博文:
k近邻算法原理请参考:《机器学习实战》第2章阅读笔记1 K近邻算法概述
sum()函数参考:Numpy中sum函数的使用方法(Python自带sum函数)
tile()函数参考: Numpy中tile函数的用法
argsort()函数参考: Numpy中argsort()函数的用法
get()方法参考: Python中字典get方法的使用
operator.itemgette()r函数参考:Python中的operator.itemgetter函数
sorted()函数参考:Python中sorted()函数的高级用法详解
Python代码如下:
#!/usr/bin/env python
# -*- 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
# inX 用于分类的输入向量
# dataSet表示训练样本集
# 标签向量为labels,标签向量的元素数目和矩阵dataSet的行数相同
# 参数k表示选择最近邻居的数目
def classify0(inx, data_set, labels, k):
"""实现k近邻"""
data_set_size = data_set.shape[0] # 数据集个数,即行数
diff_mat = tile(inx, (data_set_size, 1)) - data_set # 各个属性特征做差
sq_diff_mat = diff_mat**2 # 各个差值求平方
sq_distances = sq_diff_mat.sum(axis=1) # 按行求和
distances = sq_distances**0.5 # 开方
sorted_dist_indicies = distances.argsort() # 按照从小到大排序,并输出相应的索引值
class_count = {} # 创建一个字典,存储k个距离中的不同标签的数量
for i in range(k):
vote_label = labels[sorted_dist_indicies[i]] # 求出第i个标签
# 访问字典中值为vote_label标签的数值再加1,
#class_count.get(vote_label, 0)中的0表示当为查询到vote_label时的默认值
class_count[vote_label] = class_count.get(vote_label, 0) + 1
# 将获取的k个近邻的标签类进行排序
sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)
# 标签类最多的就是未知数据的类
return sorted_class_count[0][0]
x = [0, 0] # 未知分类数据
data = createdataset() # 创建训练数据集合标签实例
a = classify0(x, data[0], data[1], 3) # 调用k近邻分类
print("未知数" + str(x) + "的类别为:", end=' ')
print(a) # 输出类别
上述代码运行结果为: