当前位置: 首页 > article >正文

【AI知识】KNN算法原理代码示例可视化

KNN(K-Nearest Neighbors,K最近邻)是一种监督学习算法,常用于分类和回归任务。它的核心思想是:一个样本的类别,由其k个最近邻的样本中的多数类决定。 以下是KNN的详细介绍:

1. 选择K值: 选择一个正整数K,通常K值的选择会影响模型的性能。较小的K值会使模型对噪声敏感,而较大的K值可能会导致模型过于平滑,无法捕捉数据的细节。

2.计算距离: 对于待分类的点,计算其与训练集中每个点的距离。常用的距离度量包括:欧氏距离、曼哈顿距离、闵可夫斯基距离

3.选择邻居: 根据计算的距离,选择距离最小的K个邻居。

4.进行预测:

  • 分类:对K个邻居的类别进行投票,选择出现次数最多的类别作为预测结果。
  • 回归:对K个邻居的值取平均,作为预测结果。

KNN的优点:

  • 简单易懂: KNN算法直观,易于实现。
  • 无需训练: KNN是一种懒惰学习算法,只有在进行预测时才进行计算,不需要提前训练模型。

KNN的缺点:

  • 计算量大: 每次分类都需要计算新样本与所有训练样本的距离,尤其是对于大数据集。
  • 选择K值困难: K值的选取对分类结果影响很大,没有一个普适的最佳K值选择方法。
  • 对噪声敏感: 噪声数据可能会对分类结果产生较大的影响。
  • **维度灾难:**在高维特征空间中,距离计算的意义会变得模糊,影响分类效果。

KNN的应用场景:

  • 推荐系统: 根据用户的历史行为数据,找到与用户兴趣最相似的其他用户,然后向用户推荐这些用户喜欢的物品。
  • 文本分类: 将文本文档分成不同的类别,比如新闻分类、情感分析等。
  • 图像识别: 根据图像的特征,将图像分到不同的类别。

KNN代码示例&可视化:

import numpy as np
import matplotlib.pyplot as plt

# 计算欧氏距离
def euclidean_distance(point1, point2):
    return np.sqrt(np.sum((point1 - point2) ** 2))

# KNN分类器
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):
        predictions = [self._predict(x) for x in X]
        return np.array(predictions)

    def _predict(self, x):
        # 计算与所有训练样本的距离
        distances = [euclidean_distance(x, x_train) for x_train in self.X_train]
        # 获取最近的K个邻居的索引
        k_indices = np.argsort(distances)[:self.k]
        # 获取这些邻居的标签
        k_nearest_labels = [self.y_train[i] for i in k_indices]
        # 进行投票
        most_common = np.bincount(k_nearest_labels).argmax()
        return most_common

# 生成简单数据
def create_data():
    np.random.seed(0)
    X = np.concatenate((np.random.randn(50, 2) + [1, 1], np.random.randn(50, 2) + [5, 5]))
    y = np.array([0] * 50 + [1] * 50)
    return X, y

# 可视化函数
def visualize(X_train, y_train, X_test, predictions):
    plt.figure(figsize=(10, 6))
    plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, marker='o', label='Training Data', alpha=0.6)
    plt.scatter(X_test[:, 0], X_test[:, 1], c=predictions, marker='x', label='Predictions', alpha=0.8)
    plt.title('KNN Classification')
    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    plt.legend()
    plt.grid()
    plt.show()

# 主程序
X, y = create_data()
X_test = np.array([[2, 2], [3, 3], [4, 4], [6, 6]])  # 测试样本

knn = KNN(k=3)
knn.fit(X, y)
predictions = knn.predict(X_test)

visualize(X, y, X_test, predictions)

KNN后的可视化结果:
在这里插入图片描述


http://www.kler.cn/news/353462.html

相关文章:

  • 前端布局与响应式设计综合指南(三)
  • 电力建设中的常见翻译场景
  • PCL 点云配准 KD-ICP算法(精配准)
  • Invoke 和 InvokeRequired以及他们两个的区别
  • C++/初识C++
  • 【C语言】一维数组应用Fibonacci数列
  • 中文文本内容模板式总结,gpto1,claude某言初步测评
  • Vscode+Pycharm+Vue.js+WEUI+django火锅(五)Django的API
  • 021 elasticsearch索引管理
  • 10.10 QT服务器与客户端
  • 04 go语言(golang) - 变量和赋值过程
  • 配置MAC地址安全
  • 探索 Python 的测试与调试技巧
  • R语言手工实现主成分分析 PCA | 奇异值分解(svd) 与PCA | PCA的疑问和解答
  • 锐评 Nodejs 设计模式 - 创建与结构型
  • FFmpeg源码:avformat_new_stream函数分析
  • 2.4.ReactOS系统运行级别降低IRQL级别KfLowerIrql 函数
  • 搜维尔科技:SenseGlove Nova 2触觉反馈手套开箱测评
  • 【LaTex】12 usenix投稿模版 删除接受信息
  • android app执行shell命令视频课程补充android 10/11适配-千里马android