《机器学习实战》第2章阅读笔记2 K近邻算法实现(附详细代码及注释)

伪代码如下:

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

(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)  # 输出类别

上述代码运行结果为:

猜你喜欢

转载自blog.csdn.net/Sophia_11/article/details/84973015
今日推荐