机器学习笔记-KNN

本文深入讲解了K近邻(KNN)算法,一种简单且直观的有监督学习方法。重点介绍了KNN的核心思想、实现步骤及代码示例,帮助读者理解K值、距离度量和分类规则的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

机器学习笔记-KNN

0x00 系列文章目录

  1. 机器学习笔记-KNN
  2. 机器学习笔记-决策树
  3. 机器学习笔记-逻辑回归
  4. 机器学习笔记-信息熵

摘要

K近邻(KNN),全名为·k nearest neighbours·,即最近的K个邻居。

0x01 简介

  • KNN核心思想
    找到目标节点最近的K个样本点,将他们的Y值(分类)计数,取最多的那个分类作为目标点的分类结果。
  • 是一种无参(这里的无参指KNN不能通过学习得出的参数)模型
  • 超参数为人为提前设定的参数K
  • 可分别用于分类或回归
  • 属于有监督学习
  • K不一定为奇数,比如使用距离(比如取倒数,则越近权重越大)加权的表决

0x02 KNN实现步骤

  1. 利用已有数据作为训练样本,来对样本x进行预测
  2. 计算 x 和训练集中所有X的距离distances
  3. 对distances进行排序, 得到排序后的样本(距离度量可用欧氏距离、曼哈顿距离等)
  4. 选取距离最小的前k个点, 并统计每个类别(Y)出现次数
  5. 最终返回出现次数最多的那个类别Y(分类规则可选多数表决、加权表决等)作为预测结果

0x03 实现代码

下面是一个简易的KNN代码,K值默认为3,距离度量采用欧式距离,分类规则为多数表决:

import numpy as np
from collections import Counter


class KNN:
    def __init__(self, k=3):
        self.k = k
        self._X_train = None
        self._y_train = None

    def fit(self, X_train, y_train):
        self._X_train = X_train
        self._y_train = y_train

    # 通过训练数据预测测试集
    def predict(self, X):
        y_pred = np.array([self.predict_single(x) for x in X])
        return y_pred

    # 利用已有数据对样本x进行预测
    def predict_single(self, x):
        # 计算 x 和训练集中所有X的距离
        distances = self.get_distances(x)
        print("distances=", distances)

        # 对distances进行排序, 得到排序后的样本
        index = self.get_sort_indexs(distances)
        print("index", index)

        # 选取距离最小的前k个点, 并统计每个类别(Y)出现次数
        top_k_index = index[:self.k]
        print("top_k_index", top_k_index)

        # yt_list用来存放索引x对应的y值
        yt_list = []
        for item in top_k_index:
            yt_list.append(self._y_train[item])

        print("yt_list", yt_list)

        # yt_list_counter用来对y值出现次数计数
        yt_list_counter = Counter(yt_list);
        print("yt_list_Counter", yt_list_counter)

        # 最终返回出现次数最多的那个类别Y作为预测结果
        return yt_list_counter.most_common(1)[0][0]

    # 计算训练集中所有向量和给定向量间欧式距离
    def get_distances(self, x):
        distances = []
        for xt in self._X_train:
            distances.append(np.linalg.norm(xt - x))
        return np.array(distances)

    # 按从小到大顺序排列距离返回索引号
    def get_sort_indexs(self, distances):
        return np.argsort(distances)

# 训练集
X_train = np.array([[1.0, 1.1], [1.0, 1.0], [0.0, 0.0], [0.0, 0.1], [0.1, 0.1]])
y_train = np.array(['Cat', 'Cat', 'Dog', 'Dog', 'Dog'])

# 测试集
X_pred = np.array([[0.0, 0.0], [0.1, 0.1], [1.0, 1.0], [1.1, 1.1]])

clf = KNN()

# 训练
clf.fit(X_train, y_train)

# 测试
print(clf.predict(X_pred))

0x04 实验

可以看到第二章代码中我们输入的是
[0.0, 0.0], [0.1, 0.1], [1.0, 1.0], [1.1, 1.1]
四个测试样本。
运行程序结果如下:

['Dog' 'Dog' 'Cat' 'Cat']

结果符合预期,算法正确。

0x05 总结

KNN确实思想很简单,是一个很容易理解的有监督学习算法。

KNN最重要的3点是K值、距离度量(欧氏距离、曼哈顿距离)、分类规则(多数表决、加权表决)。
但要注意和KMeans相区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值