Machine Learning机器学习之K近邻算法(K-Nearest Neighbors,KNN)

简介: Machine Learning机器学习之K近邻算法(K-Nearest Neighbors,KNN)

前言

背景介绍:

K近邻算法最早由美国的科学家 Thomas Cover 和 Peter Hart 在 1967 年提出,并且在之后的几十年中得到了广泛的研究和应用。KNN 算法是一种基于实例的学习方法,它不像其他算法一样需要对数据进行假设或者参数拟合,而是直接利用已知的数据样本进行预测。

思想:

KNN 算法的思想是基于特征空间中的样本点之间的距离来进行分类。它假设相似的样本在特征空间中具有相似的类别,即距离较近的样本更可能属于同一类别。KNN 算法通过找到样本点周围的 K 个最近邻样本,根据它们的类别进行投票或者加权投票来确定新样本所属的类别。

原理:

  • 距离度量: KNN 算法通常使用欧氏距离、曼哈顿距离、闵可夫斯基距离等方法来度量样本点之间的距离。

这里简要介绍一下三种常见的距离度量:

欧氏距离(Euclidean Distance):是最常见的距离度量方法,表示两个点之间的直线距离。

公式:

其中, 是两个点的特征向量, 是特征的维度。

曼哈顿距离(Manhattan Distance):表示两个点在各个坐标轴上的绝对距离之和。

公式:

闵可夫斯基距离(Minkowski Distance):是欧氏距离和曼哈顿距离的一种泛化形式,可以表示为两点在各个坐标轴上的距离的 次方之和的 次方。

公式:

其中,是一个正整数 ,当 时,就是曼哈顿距离;当 时,就是欧氏距离。

  • K个最近邻: 对于给定的新样本,找到离它最近的 K 个训练样本。
  • 投票决策: 对于分类问题,根据 K 个最近邻样本的类别进行投票,将新样本归为票数最多的类别。对于回归问题,可以计算 K 个最近邻样本的平均值来预测新样本的输出。

KNN算法关键问题

  • 距离度量方法: KNN 算法需要计算样本之间的距离,常见的距离度量方法包括欧氏距离、曼哈顿距离、闵可夫斯基距离等。
  • 邻居选择规则: 在给定一个新样本时,需要选择它的 K 个最近邻样本。通常采用的方法是基于距离的排序,选择距离最近的 K 个样本。
  • 类别判定规则: 对于分类问题,KNN 采用多数表决的方式确定新样本的类别,即根据 K 个最近邻样本中所属类别的频率来决定新样本的类别。对于回归问题,通常采用平均值的方式来预测新样本的输出。
  • K 值选择: K 值的选择对 KNN 算法的性能影响较大。较小的 K 值可能会使模型过拟合,而较大的 K 值可能会使模型欠拟合。因此,需要通过交叉验证等方法来选择合适的 K 值。
  • 特征标准化: 在使用 KNN 算法之前,通常需要对特征进行标准化处理,以确保不同特征的尺度相同,避免某些特征对距离计算的影响过大。
  • 算法复杂度分析: KNN 算法的时间复杂度主要取决于样本数量和特征维度,因为需要计算新样本与所有训练样本的距离。因此,KNN 算法在处理大规模数据集时可能会效率较低。
  • 应用领域: KNN 算法广泛应用于分类和回归问题,特别是在图像识别、推荐系统、医疗诊断等领域有着重要的应用价值。

一、构建KNN算法

基于Python 实现 K 近邻算法,包括了数据准备、距离度量、邻居选择、类别判定规则和模型评估等操作步骤:

我们首先定义了一个 KNN 类,其中包括了初始化方法、训练方法(fit)、预测方法(predict)和评估方法(evaluate)。然后,我们使用一个简单的示例数据集进行了演示。在示例用法中,我们首先准备了训练集和测试集数据,然后初始化了 KNN 模型并进行了训练,接着使用测试集进行了预测,并计算了模型的准确率。

import numpy as np
from collections import Counter
 
class KNN:
    def __init__(self, k=3):
        self.k = k
 
    def fit(self, X_train, y_train):
        self.X_train = X_train
        self.y_train = y_train
 
    def predict(self, X_test):
        predictions = []
        for x in X_test:
            # 计算测试样本与所有训练样本的距离
            distances = [np.linalg.norm(x - x_train) for x_train in self.X_train]
            # 找到距离最近的 K 个邻居的索引
            nearest_neighbors_indices = np.argsort(distances)[:self.k]
            # 获取这 K 个邻居的类别
            nearest_neighbors_labels = [self.y_train[i] for i in nearest_neighbors_indices]
            # 对 K 个邻居的类别进行多数表决,确定测试样本的类别
            most_common_label = Counter(nearest_neighbors_labels).most_common(1)[0][0]
            predictions.append(most_common_label)
        return predictions
 
    def evaluate(self, X_test, y_test):
        predictions = self.predict(X_test)
        accuracy = np.mean(predictions == y_test)
        return accuracy
 
# 示例用法
if __name__ == "__main__":
    # 准备数据集
    X_train = np.array([[1, 2], [2, 3], [3, 4], [4, 5]])
    y_train = np.array([0, 0, 1, 1])
    X_test = np.array([[2, 2], [3, 3]])
 
    # 初始化和训练模型
    knn = KNN(k=2)
    knn.fit(X_train, y_train)
 
    # 预测和评估模型
    predictions = knn.predict(X_test)
    print("Predictions:", predictions)
 
    accuracy = knn.evaluate(X_test, np.array([0, 1]))
    print("Accuracy:", accuracy)

执行结果:

总结:

KNN 算法是一种简单有效的分类和回归算法,算法的核心思想是“近朱者赤,近墨者黑”,即认为与新样本距离较近的训练样本更可能具有相同的类别或者输出。它的基本假设是“相似的样本在特征空间中具有相似的类别”。因此,KNN 算法不需要对数据进行假设或者参数拟合,而是直接利用已有的数据进行预测。它没有显式地对数据进行假设或参数拟合,因此在处理复杂、非线性的问题时具有一定的优势。然而,KNN 算法的计算复杂度较高,特别是在处理大规模数据集时,因为需要计算样本之间的距离。此外,KNN 算法对异常值和噪声敏感,需要进行适当的数据预处理和参数调节。


相关文章
|
3天前
|
机器学习/深度学习 算法 数据处理
探索机器学习中的决策树算法
【5月更文挑战第18天】探索机器学习中的决策树算法,一种基于树形结构的监督学习,常用于分类和回归。算法通过递归划分数据,选择最优特征以提高子集纯净度。优点包括直观、高效、健壮和可解释,但易过拟合、对连续数据处理不佳且不稳定。广泛应用于信贷风险评估、医疗诊断和商品推荐等领域。优化方法包括集成学习、特征工程、剪枝策略和参数调优。
|
4天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】K-means算法与PCA算法之间有什么联系?
【5月更文挑战第15天】【机器学习】K-means算法与PCA算法之间有什么联系?
|
4天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】维度灾难问题会如何影响K-means算法?
【5月更文挑战第15天】【机器学习】维度灾难问题会如何影响K-means算法?
|
5天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】聚类算法中,如何判断数据是否被“充分”地聚类,以便算法产生有意义的结果?
【5月更文挑战第14天】【机器学习】聚类算法中,如何判断数据是否被“充分”地聚类,以便算法产生有意义的结果?
|
6天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
2天前
|
算法
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
MATLAB 2022a仿真实现了LDPC码的性能分析,展示了不同码长对纠错能力的影响。短码长LDPC码收敛快但纠错能力有限,长码长则提供更强纠错能力但易陷入局部最优。核心代码通过循环进行误码率仿真,根据EsN0计算误比特率,并保存不同码长(12-768)的结果数据。
21 9
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
|
4天前
|
算法
MATLAB|【免费】融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型
这段内容介绍了一个使用改进的麻雀搜索算法优化CNN-BiLSTM模型进行多输入单输出预测的程序。程序通过融合正余弦和柯西变异提升算法性能,主要优化学习率、正则化参数及BiLSTM的隐层神经元数量。它利用一段简单的风速数据进行演示,对比了改进算法与粒子群、灰狼算法的优化效果。代码包括数据导入、预处理和模型构建部分,并展示了优化前后的效果。建议使用高版本MATLAB运行。
|
6天前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。
|
6天前
|
资源调度 算法 块存储
m基于遗传优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真
MATLAB2022a仿真实现了遗传优化的LDPC码OSD译码算法,通过自动搜索最佳偏移参数ΔΔ以提升纠错性能。该算法结合了低密度奇偶校验码和有序统计译码理论,利用遗传算法进行全局优化,避免手动调整,提高译码效率。核心程序包括编码、调制、AWGN信道模拟及软输入软输出译码等步骤,通过仿真曲线展示了不同SNR下的误码率性能。
10 1
|
6天前
|
存储 算法 数据可视化
基于harris角点和RANSAC算法的图像拼接matlab仿真
本文介绍了使用MATLAB2022a进行图像拼接的流程,涉及Harris角点检测和RANSAC算法。Harris角点检测寻找图像中局部曲率变化显著的点,RANSAC则用于排除噪声和异常点,找到最佳匹配。核心程序包括自定义的Harris角点计算函数,RANSAC参数设置,以及匹配点的可视化和仿射变换矩阵计算,最终生成全景图像。

热门文章

最新文章