给大家分享一篇 从零开始构造邻近分类器KNN

起步

本章介绍如何自行构造 KNN 分类器,这个分类器的实现上算是比较简单的了。不过这可能需要你之前阅读过这方面的知识。

前置阅读

分类算法之邻近算法:KNN(理论篇)

分类算法之邻近算法:KNN(应用篇)

欧拉公式衡量距离

关于距离的测量方式有多种,这边采用欧拉距离的测量方式:

这里写图片描述

对应的 python 代码:

import math
def euler_distance(point1: list, point2: list) -> float:
    """
    计算两点之间的欧拉距离,支持多维
    """
    distance = 0.0
    for a, b in zip(point1, point2):
        distance += math.pow(a - b, 2)
    return math.sqrt(distance)

KNN 分类器

import collections
import numpy as np
class KNeighborsClass(object):
    def __init__(self, n_neighbors=5):
        self.n_neighbors = n_neighbors

    def fit(self, data_set, labels):
        self.data_set = data_set
        self.labels = labels

    def predict(self, test_row):
        dist = []
        for v in self.data_set:
            dist.append(euler_distance(v, test_row))
        dist = np.array(dist)
        sorted_dist_index = np.argsort(dist) # 根据元素的值从大到小对元素进行排序,返回下标

        # 根据K值选出分类结果, ['A', 'B', 'B', 'A', ...]
        class_list = [ self.labels[ sorted_dist_index[i] ] for i in range(self.n_neighbors)]
        result_dict = collections.Counter(class_list)   # 计算各个分类出现的次数
        ret = sorted(result_dict.items(), key=lambda x: x[1], reverse=True) # 采用多数表决,即排序后的第一个分类
        return ret[0][0]

这个分类器不需要训练,因此在 fit 函数中仅仅保存其数据集和结果集即可。在预测函数中,需要依次计算测试样本与数据集中每个样本的距离。筛选出前 K 个,采用多数表决的方式。

测试

还是使用 sklearn 中提供的虹膜数据。

if __name__ == "__main__":
    from sklearn import datasets
    iris = datasets.load_iris()
    knn = KNeighborsClass(n_neighbors=5)
    knn.fit(iris.data, iris.target)
    predict = knn.predict([0.1, 0.2, 0.3, 0.4])
    print(predict)  # output: 1  
Python学习交流群:834179111,群里有很多的学习资料。欢迎欢迎各位前来交流学习。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值