K最近邻算法:简单高效的分类和回归方法

简介: K最近邻算法:简单高效的分类和回归方法

🍀简介

K最近邻(K-nearest neighbors,简称KNN)算法是一种基于实例的机器学习方法,可以用于分类和回归问题。它的思想非常简单,但在实践中却表现出了出色的效果。本文将介绍KNN算法的原理、应用场景和优缺点,并通过示例代码演示其实现过程


🍀KNN算法原理

KNN算法基于一个假设:相似的样本具有相似的特征。它的工作流程如下

  • 计算待分类样本与训练集中每个样本之间的距离(通常使用欧氏距离或曼哈顿距离)
  • 选取距离最近的K个样本作为邻居
  • 根据邻居样本的标签进行投票,将待分类样本归类为得票最多的类别(分类问题)或计算邻居样本标签的平均值(回归问题)
    欧拉距离如下

🍀KNN算法应用场景

KNN算法在以下场景中广泛应用

  • 分类问题:如垃圾邮件过滤、图像识别等
  • 回归问题:如房价预测、股票价格预测等
  • 推荐系统:根据用户和物品的相似度进行推荐
  • 异常检测:检测异常行为或异常事件

例如在邮件分类上就需要如下步骤

  • 数据准备:
    为了使用KNN算法进行邮件分类,我们需要准备一个数据集作为训练样本。这个数据集可以由已标记为垃圾邮件和非垃圾邮件的邮件组成。每封邮件都应该被转化为特征向量表示,通常使用词袋模型来表示每个邮件中的单词频率。
  • 特征提取:
    对于每封邮件,我们可以提取出一组特征,例如:
  • 单词频率:统计邮件中每个单词的出现频率,构建一个向量表示邮件的特征。
    主题关键词:根据主题模型提取关键词,构建一个向量表示邮件的主题内容。
  • 数据预处理:
    在应用KNN算法之前,需要对数据进行预处理。常见的预处理步骤包括去除停用词、词干提取和编码转换等。
  • 模型训练:
    将预处理后的数据集划分为训练集和测试集。使用KNN算法对训练集进行训练,调整K值和距离度量方式来优化模型性能。可以通过交叉验证等技术来选择最优的K值。
  • 模型评估:
    使用训练好的模型对测试集进行预测,并与真实标签进行比较。常用的评估指标包括准确率、精确率、召回率和F1值等,通过这些指标可以评估模型在垃圾邮件过滤方面的性能。
  • 模型使用:
    将训练好的模型应用于新的邮件数据分类。通过计算待分类邮件与训练集样本的距离,并选取最近的K个邻居样本,根据这些邻居样本的标签进行投票,将待分类邮件划分为得票最多的类别,即确定该邮件是否为垃圾邮件。

🍀KNN算法优缺点

KNN算法有以下优点

  • 简单直观,易于实现和理解
  • 适用于多分类问题
  • 对于样本分布不规则的情况,表现良好

然而,KNN算法也存在一些缺点

  • 需要存储全部训练样本,计算复杂度较高
  • 对于高维数据,效果不佳
  • 对于样本不平衡的数据集,容易被少数类别影响

🍀KNN算法代码示例

首先需要导入numpy和matplotlib这两个库

import numpy as np
from matplotlib import pyplot as plt

接下来将我们准备好的一组数据描绘成散点图

raw_data_X = [[5.1935, 2.3312],
              [3.1201, 1.7815],
              [1.3438, 3.3684],
              [2.5323, 3.2762],
              [2.2804, 1.8670],
              [8.4234, 6.6565],
              [8.7451, 7.5340],
              [9.1522, 2.5141],
              [9.7428, 4.4241],
              [8.9398, 1.7916]]
raw_data_y =[0, 0, 0, 0, 0, 1, 1, 1, 1, 1]  #  0是良性,1是恶性
X_train = np.array(raw_data_X)
y_train = np.array(raw_data_y)
plt.scatter(X_train[y_train==0,0],X_train[y_train==0,1],color='r')
plt.scatter(X_train[y_train==1,0],X_train[y_train==1,1],color='b')
plt.show()

运行结果如下

接下来,我们需要给定待预测数据,来预测它的结果,首先我们将两个待遇测数据用绿点在图中展示

x = np.array([8.0936, 3.3657])
plt.scatter(X_train[y_train==0,0],X_train[y_train==0,1],color='r')
plt.scatter(X_train[y_train==1,0],X_train[y_train==1,1],color='b')
plt.scatter(x[0],x[1],color='g')
plt.show()

运行结果如下

根据KNN算法的原理,我们需要计算距离,所以这里我们需要导入math库

同时根据列表生成式计算distance

from math import sqrt
distance = []  # 保存和其他所有点的距离    
distance = [sqrt(np.sum((x_train-x)**2)) for x_train in X_train]

之后需要找出距离待预测点最近的k个点

k = 3
nearest = np.argsort(distance)
nearest[:k]

运行结果如下

之后将下标取出

nearest = [i for i in nearest[:k]]

运行结果如下

找出最近的k个点下标值以后,找出这些样本对应的目标值

top_K = [i for i in y_train[nearest]]

运行结果如下

下面我们需要导入一个库用来进行投票,显然0有0票,1有3票

from collections import Counter
votes = Counter(top_K)

运行结果如下

之后将预测结果输出即可

y_predict = votes.most_common(1)[0][0]

运行结果如下

🍀总结

以上代码仅仅的简单演示一遍KNN算法,但是真正的KNN算法并没有这么简单,下节我会通过上述代码的基础上进行简单的优化,并进行封装

挑战与创造都是很痛苦的,但是很充实。

相关文章
|
12天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
30 3
|
17天前
|
算法 索引
HashMap扩容时的rehash方法中(e.hash & oldCap) == 0算法推导
HashMap在扩容时,会创建一个新数组,并将旧数组中的数据迁移过去。通过(e.hash & oldCap)是否等于0,数据被巧妙地分为两类:一类保持原有索引位置,另一类索引位置增加旧数组长度。此过程确保了数据均匀分布,提高了查询效率。
34 2
|
27天前
|
搜索推荐 Shell
解析排序算法:十大排序方法的工作原理与性能比较
解析排序算法:十大排序方法的工作原理与性能比较
38 9
|
2月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
79 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
20天前
|
存储 算法 Java
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
前缀(波兰)表达式、中缀表达式和后缀(逆波兰)表达式的基本概念、计算机求值方法,以及如何将中缀表达式转换为后缀表达式,并提供了相应的Java代码实现和测试结果。
21 0
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
|
20天前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
26 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
14天前
|
移动开发 算法 前端开发
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
15 0
|
3月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
3月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
2月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
45 9