机器学习---K邻近算法

本文详细介绍了K-邻近算法的基本概念、工作原理,包括如何选择K值、距离度量以及分类决策规则。还通过实例展示了如何实现KNN算法并应用于电影喜好分类。讨论了算法的优点和缺点,以及在实际应用中的注意事项。
摘要由CSDN通过智能技术生成

一.了解K-邻近算法

1.算法概述

k 近邻法 (k-nearest neighbor, k-NN) 是一种基本分类与回归方法。是数据挖掘技术中原理最简单的算法之一,核心功能是解决有监督的分类问题。KNN能够快速高效地解决建立在特殊数据集上的预测分类问题,但其不产生模型,因此算法准确 性并不具备强可推广性。

k近邻法 的输入为实例的特征向量,对应与特征空间的点;输出为实例的类别,可以取多类。

k近邻法 三个基本要素:k 值的选择、距离度量及分类决策规则。

2.算法思想

K-最近邻(K-Nearest Neighbor,简称 KNN)算法是一种基本的分类及回归方法。它的思想很简单,即对于一个新的待分类样本,找到与其距离最近的 K 个训练集中的样本,然后根据这 K 个样本的类别进行决策。具体而言,KNN 算法的步骤如下:

  1. 计算测试样本与每个训练样本之间的距离;
  2. 对距离进行排序,选择距离最近的 K 个训练样本;
  3. 根据这 K 个样本的标签进行决策,即将测试样本分为 K 个样本中出现次数最多的类别。

需要注意的是,在 KNN 算法中,距离的计算方式可以采用多种方法,例如欧氏距离、曼哈顿距离等。(在下面的例子中我们使用欧式距离)

一个实例的最近邻是根据标准欧氏距离定义的。更精确地讲,把任意的实例x表示为下面的特征向量:

其中ar(x)表示实例x的第r个属性值。那么两个实例xi和xj间的距离定义为d(xi,xj),其中:

二.实现Knn算法

我打算建立一个电影喜爱分类模型,可以根据你观看时长判断是否属于你喜爱的电影

1.数据集

那么我们先整理一份数据集:

2.代码展示

import numpy as np

def euclidean_distance(x1, x2):
    return np.sqrt(np.sum((x1 - x2) ** 2))

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

    def fit(self, X, y):
        self.X_train = X
        self.y_train = y

    def predict(self, X):
        y_pred = [self._predict(x) for x in X]
        return np.array(y_pred)

    def _predict(self, x):
        distances = [euclidean_distance(x, x_train) for x_train in self.X_train]
        k_indices = np.argsort(distances)[:self.k]
        k_nearest_labels = [self.y_train[i] for i in k_indices]
        most_common = np.argmax(np.bincount(k_nearest_labels))
        return most_common

# 创建示例数据集
X_train = np.array([[90], [120], [100], [80], [60]])
y_train = np.array([1, 0, 1, 1, 0])

# 创建并训练 KNN 模型
knn = KNN(k=3)
knn.fit(X_train, y_train)

# 测试数据集
X_test = np.array([[110], [70]])

# 对测试数据进行预测
y_pred = knn.predict(X_test)

# 打印预测结果
for i in range(len(X_test)):
    print("观看时长:", X_test[i], " 预测喜好:", "喜欢" if y_pred[i] == 1 else "不喜欢")

3.代码分析

  1. euclidean_distance 函数:该函数用于计算两个样本之间的欧氏距离。它接受两个样本向量 x1x2,利用 NumPy 的函数进行计算并返回距离值。

  2. KNN 类:该类封装了 KNN 算法的相关操作。

    • __init__ 方法初始化 KNN 对象,并接收一个参数 k,表示选择最近邻居的数量,默认为 3。

    • fit 方法将训练数据集的特征矩阵 X 和标签数组 y 存储起来,以备后续预测使用。

    • predict 方法用于对测试数据进行预测。它接收一个特征矩阵 X,然后遍历每个测试样本,调用 _predict 方法进行单个样本的预测,并将结果保存在 y_pred 列表中。最后,将 y_pred 转换为 NumPy 数组并返回。

    • _predict 方法用于对单个测试样本进行预测。它计算测试样本与训练样本之间的距离,并选择距离最近的 k 个训练样本。然后,统计这 k 个样本中出现次数最多的类别,并返回该类别作为预测结果。

  3. 示例数据集:给出了一个简单的示例数据集,包含观看时长和喜好标签。X_train 是包含观看时长的特征矩阵,y_train 是对应的喜好标签数组。

  4. 创建并训练 KNN 模型:首先创建一个 KNN 对象 knn,参数 k 设置为 3。然后调用 fit 方法,将训练数据集的特征矩阵 X_train 和标签数组 y_train 传递给模型进行训练。

  5. 测试数据集:创建一个测试数据集 X_test,包含一些观看时长。

  6. 对测试数据进行预测:调用模型的 predict 方法,传入测试数据集 X_test,获得对应的预测结果。

  7. 打印预测结果:遍历每个测试样本,在控制台上打印观看时长和预测的喜好结果。

三.总结

KNN算法的优点在于它不需要先验知识或者假设数据分布形式,因此比较适合处理非线性或复杂的问题。它还可以处理多类别和多回归问题。

KNN算法的缺点在于当训练集增大时,计算量会快速增加;另外,如果训练样本非常不平衡,那么KNN算法的表现通常不如其他方法。

在使用KNN算法时,需要合理地选择K值和距离度量方式,并对数据进行归一化处理以避免某些特征对结果的影响过大。此外,由于KNN算法依赖于距离计算,如果数据维度很高,那么距离计算会变得非常困难,这时候需要采用降维等技术来解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值