「AIGC算法」近邻算法原理详解

本文主要介绍近邻算法原理及实践demo。

一、原理

K近邻算法(K-Nearest Neighbors,简称KNN)是一种基于距离的分类算法,其核心思想是距离越近的样本点,其类别越有可能相似。以下是KNN算法的原理详解:

1. 算法原理

KNN算法的工作原理是利用训练数据对特征向量空间进行划分,并将划分结果作为最终算法模型。当输入一个新的没有标签的数据后,将这个数据的每个特征与训练集中的数据对应的特征进行比较,找出训练集中与这个新数据特征最相近的K个样本点(即K个最近邻居),然后根据这K个邻居的类别加权或投票,来预测新数据的类别。

2. K值的选择

K的选择对算法的精度有较大影响。K值较小时,模型对噪声更敏感,容易过拟合;K值较大时,模型对异常值的鲁棒性更强,但可能会引入噪声,导致欠拟合。在实际应用中,K值的选择通常通过交叉验证等方法来确定最优的K值。

3. 距离度量

KNN算法中常用的距离度量是欧氏距离,但也可以采用曼哈顿距离、切比雪夫距离等其他距离度量方法。在进行距离度量之前,通常需要对每个属性的值进行规范化,以保证不同特征具有相同的权重。

4. 特征归一化

由于不同特征的量纲可能不同,如果不进行归一化,那么在计算距离时,数值范围大的特征会对距离计算产生较大的影响。因此,为了使每个特征具有同等的重要性,通常需要对特征进行归一化处理。

5. 算法实现

KNN算法的实现通常包括以下几个步骤:

  • 导入数据并进行预处理。
  • 确定K值和距离度量方法。
  • 对于每一个测试数据点,计算其与训练集中每个点的距离。
  • 找出距离最近的K个训练数据点。
  • 根据这K个邻居的类别,通过投票或加权的方式来预测测试点的类别。

6. 算法优势与劣势

KNN算法的优势在于它简单、直观,对数据的分布没有假设,因此可以用于非线性数据的分类。同时,KNN算法也可以用于回归问题。不过,KNN算法的计算复杂度较高,尤其是在大数据集上,计算每个待分类点与所有训练点之间的距离会非常耗时。

7. 应用场景

KNN算法适用于那些样本容量较大的类域的自动分类问题,但在样本容量较小的类域上使用时,容易产生误分。此外,KNN对不平衡的数据集比较敏感,需要通过权重调整或其他方法来改进。

KNN算法是一种“懒惰学习”算法,它不会从训练数据中学习到模型,而是直接存储训练数据,在预测时才进行计算,因此训练时间复杂度为0,但分类时间复杂度为O(n)。

KNN算法是一种简单、易于实现的分类算法,但在使用时需要注意K值的选择、距离度量、特征归一化等关键因素,以提高算法的准确性和效率。

二、举个栗子

使用scikit-learn库中的KNN分类器,并用一个合成的数据集来展示如何训练模型和进行预测。

预期效果

请添加图片描述

设计思路

  • 使用make_classification函数创建了一个二分类的数据集。-
  • 初始化了一个KNN分类器,并设置了邻居数k。
  • 使用训练数据训练了KNN模型。-
  • 使用predict方法预测了网格上每个点的类别。
  • 使用contourf函数绘制了决策边界,并且绘制了训练数据点。

核心代码

# 导入必要的库
import numpy as np  # 导入numpy,并将其别名设置为np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt# 创建一个合成的分类数据集
X, y = make_classification(n_samples=1000, n_features=2, n_redundant=0,n_clusters_per_class=1, weights=[0.99],random_state=42)# 选择K的值,这里我们选择K=5
k = 5# 初始化KNN分类器
knn = KNeighborsClassifier(n_neighbors=k)# 训练KNN模型
knn.fit(X, y)# 为了可视化,我们创建一个网格来绘制决策边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),np.arange(y_min, y_max, .02))# 预测网格点所属的类别
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])# 将预测结果绘制为彩色图像
plt.figure(figsize=(10, 8))
plt.contourf(xx, yy, Z.reshape(xx.shape), alpha=0.8)# 绘制训练点
plt.scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor='k')
plt.title('Decision Boundary of K-NN Classifier')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

三、自定义实例

预期效果

在这里插入图片描述

核心代码

# 导入必要的库
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import matplotlib.pyplot as plt# 读取CSV数据集
data = pd.read_csv('knnDemoDB.csv')# 假设CSV文件的最后一列是标签
X = data.iloc[:, :-1].values  # 所有行,除了最后一列的所有列
y = data.iloc[:, -1].values   # 所有行,最后一列# 如果标签是非数值型的,则进行编码转换
label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(y)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42)# 初始化KNN分类器
knn = KNeighborsClassifier(n_neighbors=5)# 训练KNN模型
knn.fit(X_train, y_train)# 为了可视化,我们创建一个网格来绘制决策边界
x_min, x_max = X_train[:, 0].min() - 1, X_train[:, 0].max() + 1
y_min, y_max = X_train[:, 1].min() - 1, X_train[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),np.arange(y_min, y_max, .02))# 预测网格点所属的类别
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])# 将预测结果绘制为彩色图像
plt.figure(figsize=(10, 8))
plt.contourf(xx, yy, Z.reshape(xx.shape), alpha=0.8)# 绘制训练点和测试点
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, s=20, edgecolor='k', label='Training data')
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, s=20, edgecolor='k', label='Test data')
plt.title('Decision Boundary of K-NN Classifier')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()

数据源

knnDemoDB.csv

Feature1,Feature2,Label
1.5,3.6,Class_A
2.3,4.5,Class_A
3.6,2.3,Class_B
4.8,3.1,Class_B
5.1,5.8,Class_A
6.2,3.4,Class_B
7.4,4.1,Class_A
8.6,5.3,Class_B
2.1,6.9,Class_A
3.8,7.2,Class_B
4.9,8.5,Class_A
5.7,7.1,Class_B
6.3,8.8,Class_A
7.1,9.2,Class_B
1.9,2.5,Class_A
3.2,3.8,Class_B
4.7,1.8,Class_A
5.5,2.9,Class_B
7.0,4.6,Class_A
8.2,5.7,Class_B

四、解决方案

KNN算法可以应用于生活中的许多实际问题,因为它是一种简单、直观的分类算法。以下是一些解决方案例子,展示了如何使用KNN算法解决实际问题:

1. 推荐系统

在推荐系统中,KNN可以用来根据用户的历史行为(如购买、评分或浏览历史)推荐商品或服务。通过将用户的特征(如年龄、性别、兴趣等)和他们之前的喜好作为输入,KNN可以找出相似用户群,并推荐那些用户喜欢的产品。

2. 医疗诊断

在医疗领域,KNN可以用于辅助诊断。利用病人的一系列症状、体检结果和病史作为特征,KNN可以预测可能的疾病。例如,基于病人的血糖水平、血压和胆固醇水平,KNN可以预测心脏病的风险。

3. 图像识别

KNN算法可以用于图像识别任务,如手写数字识别。每个图像可以被转换成一个特征向量,其中包含了图像的纹理、边缘和形状信息。KNN根据这些特征向量将新的图像分类到相应的类别。

4. 金融市场分析

在金融市场,KNN可以用于预测股票价格的变动或信用风险评估。通过分析历史价格、交易量和市场趋势,KNN可以帮助投资者做出更明智的投资决策。

5. 房地产市场

在房地产市场,KNN可以用来估算房屋价格。利用房屋的特征(如面积、位置、房间数量等)和近期售出的类似房屋价格作为训练数据,KNN可以预测新房屋的市场价格。

6. 垃圾邮件检测

KNN可以用于文本分类,如垃圾邮件检测。通过分析邮件内容中的关键词和短语,KNN可以将邮件分类为垃圾邮件或非垃圾邮件。

7. 交通流量预测

在智能交通系统(ITS)中,KNN可以用于预测交通流量和拥堵情况。利用历史交通数据和实时传感器数据,KNN可以预测特定路段的交通状况。

应用实例:房屋价格预测

假设我们想要使用KNN算法预测房屋价格。以下是基于前面提供的代码模板,针对房屋价格预测问题的示例:

# 导入必要的库
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestRegressor
import numpy as np
import matplotlib.pyplot as plt# 读取CSV数据集,这里假设CSV文件包含了房屋的特征和价格
data = pd.read_csv('house_prices.csv')# 假设CSV文件中包含了多个特征列和一个价格标签列
features = data.drop('Price', axis=1).values  # 所有行,除了价格列的所有列
price = data['Price'].values  # 所有行,价格列# 如果特征中包含非数值型数据,则进行编码转换
# 这里假设所有数据已经是数值型的# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(features, price, test_size=0.2, random_state=42)# 初始化KNN回归器
knn = KNeighborsClassifier(n_neighbors=5)# 训练KNN模型
knn.fit(X_train, y_train)# 预测测试集的价格
y_pred = knn.predict(X_test)# 评估模型性能
print('Predictions:', y_pred)
print('Actual prices:', y_test)# 如果需要可视化,可以绘制预测价格与实际价格的关系
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, color='blue', label='Predicted prices')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2)
plt.xlabel('Actual Price')
plt.ylabel('Predicted Price')
plt.title('KNN Predicted vs Actual Prices')
plt.legend()
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/13208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vmvare—windows中打不开摄像头

1、检查本地摄像头是否能正常打开 设备管理器—查看—显示隐藏设备—选中照相机—启动 USB2.0 HD UVC—打开相机查看 2、检查虚拟机的设置 虚拟机—虚拟机—可移动设备—USB2.0 HD UVC—勾选在状态栏中显示 虚拟机—打开windows主机—右小角选中圆圈图标—勾选连接主机 此时…

Java | Leetcode Java题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; class Solution {public int numDecodings(String s) {int n s.length();// a f[i-2], b f[i-1], cf[i]int a 0, b 1, c 0;for (int i 1; i < n; i) {c 0;if (s.charAt(i - 1) ! 0) {c b;}if (i > 1 && s.charAt(i …

小红书笔记怎么发浏览量高?

小红书笔记发布是有技巧和策略的&#xff0c;为什么有的小红书笔记浏览量那么高&#xff0c;是因为下足了功夫&#xff0c;小红书笔记怎么发浏览量高&#xff1f;今天伯乐网络传媒就来给大家揭秘一下。 一、选题与定位 1. 热门话题选择 要想提高小红书笔记的浏览量&#xff0…

虚拟化技术 使用vSphere Web Client管理ESXi主机

一、实验内容 通过vSphere Web Client将ESXi主机连接到iSCSI共享存储通过vSphere Web Client&#xff0c;使用共享存储创建虚拟机并安装windows 2008 R2操作系统通过vSphere Web Client&#xff0c;为虚拟机创建快照 二、、实验主要仪器设备及材料 安装有64位Windows操作系统…

Redis如何避免数据丢失?——AOF

目录 AOF日志 1. 持久化——命令写入到AOF文件 写到用户缓冲区 AOF的触发入口函数——propagate 具体的实现逻辑——feedAppendOnlyFile 从用户缓冲区写入到AOF文件(磁盘&#xff09; 函数write、fsync、fdatasync Redis的线程池 AOF文件的同步策略 触发的入口函数——…

JavaScript函数声明

JS函数声明 JS中的方法,多称为函数,函数的声明语法和JAVA中有较大区别 语法1&#xff1a;function 函数名 (参数列表){函数体} 语法2&#xff1a;var 函数名 function (参数列表){函数体} 函数说明 函数没有权限控制符不用声明函数的返回值类型,需要返回在函数体中直接return即…

Python | Leetcode Python题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; class Solution:def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:# 设置 dummyNode 是这一类问题的一般做法dummy_node ListNode(-1)dummy_node.next headpre dummy_nodefor _ in range(left - 1):pre…

关于FIFO Generator IP和XPM_FIFO在涉及位宽转换上的区别

在Xilinx FPGA中&#xff0c;要实现FIFO的功能时&#xff0c;大部分时候会使用两种方法&#xff1a; FIFO Generator IP核XPM_FIFO原语 FIFO Generator IP核的优点是有图形化界面&#xff0c;配置参数非常直观&#xff1b;缺点是参数一旦固定&#xff0c;想要更改的化就只能重…

一次tomcat闪退处理

双击tomcat目录下bin目录中startup.bat 在我的电脑上是一闪而过&#xff0c;不能正常地启动tomcat软件 以记事本打开startup.bat文件&#xff0c;在文件的结尾处加上pause 然后再双击该bat执行&#xff0c;此时窗口就不会关闭&#xff0c;并会将错误信息打印在提示框中 可能是…

英伟达发布 VILA 视觉语言模型,实现多图像推理、增强型上下文学习,性能超越 LLaVA-1.5

前言 近年来&#xff0c;大型语言模型 (LLM) 的发展取得了显著的成果&#xff0c;并逐渐应用于多模态领域&#xff0c;例如视觉语言模型 (VLM)。VLM 旨在将 LLM 的强大能力扩展到视觉领域&#xff0c;使其能够理解和处理图像和文本信息&#xff0c;并完成诸如视觉问答、图像描…

一看就会的AOP事务

文章目录 AOPAOP简介AOP简介和作用AOP的应用场景为什么要学习AOP AOP入门案例思路分析代码实现AOP中的核心概念 AOP工作流程AOP工作流程AOP核心概念在测试类中验证代理对象 AOP切入点表达式语法格式通配符书写技巧 AOP通知类型AOP通知分类AOP通知详解 AOP案例案例-测量业务层接…

Linux bc命令(bc指令)(基本计算器)(任意精度计算语言:支持浮点数运算、变量赋值和自定义函数等)

文章目录 bc命令文档英文中文 Linux bc 命令详解bc 命令的基本用法启动 bc 环境进行基本计算退出 bc bc 中的数学功能执行高级数学计算平方根和指数函数对数函数 处理精度问题 变量和数组变量赋值和使用数组的使用 创建和使用自定义函数 bc 命令的高级用法在脚本中使用 bc基本脚…

Google I/O 大会 | 精彩看点一览

作者 / 开发者关系和开源总监 Timothy Jordan 2024 年 Google I/O 大会于北京时间 5 月 15 日 1:00am 在加利福尼亚的山景城以 Google 主题演讲直播拉开序幕。随后&#xff0c;在北京时间 4:30am 举行开发者主题演讲。大家可前往回看 "Google 主题演讲" 以及 "开…

AIGC时代已至,你准备好抓住机遇了吗?

一、行业前景 AIGC&#xff0c;即人工智能生成内容&#xff0c;是近年来人工智能领域中发展迅猛的一个分支。随着大数据、云计算、机器学习等技术的不断进步&#xff0c;AIGC已经取得了显著的成果&#xff0c;并且在广告、游戏、自媒体、教育、电商等多个领域实现了广泛应用。…

DolphinScheduler(海豚调度)- docker部署实战

1.官方文档 https://dolphinscheduler.apache.org/zh-cn/docs/3.2.1/guide/start/docker 2.docker环境安装 版本情况&#xff08;这个地方踩了不少坑&#xff09;&#xff1a;docker-26.1.2&#xff0c;docker-compose-v2.11.0。 具体可使用我上传的安装包&#xff0c;一键安…

MT3037 新月轩就餐

思路&#xff1a; 此题每道菜的价钱相同&#xff0c;想最小化付的钱即求最小区间长度可以满足“品尝到所有名厨手艺”。 使用双端队列存储元素&#xff0c;队尾不断向后遍历&#xff1a;头->尾 如果队头队尾&#xff0c;则队头往右移一格&#xff0c;直到区间不同元素数m…

Docker部署MaxKB详细步骤(window系统)

上面章节已经实现了ollama李现部署llama3&#xff0c;并实现了一些简单的问答&#xff0c;但是问答的界面是在命令提示符中&#xff0c;交互很不友好&#xff0c;也不方便局域网其他用户访问&#xff0c;所以这节用docker部署MaxKB实现网页访问llama3&#xff0c;首先电脑上需要…

分布式系统的一致性与共识算法(四)

Etcd与Raft算法 Raft保证读请求Linearizability的方法: 1.Leader把每次读请求作为一条日志记录&#xff0c;以日志复制的形式提交&#xff0c;并应用到状态机后&#xff0c;读取状态机中的数据返回(一次RTT、一次磁盘写)2.使用Leader Lease&#xff0c;保证整个集群只有一个L…

使用Flask-RESTful构建RESTful API

文章目录 安装Flask-RESTful导入模块和类创建一个资源类运行应用测试API总结 Flask是一个轻量级的Python web开发框架&#xff0c;而Flask-RESTful是一个基于Flask的扩展&#xff0c;专门用于构建RESTful API。它提供了一些帮助类和方法&#xff0c;使构建API变得更加简单和高效…

详细分析Vue3中的reactive(附Demo)

目录 1. 基本知识2. 用法3. Demo 1. 基本知识 reactive 是一个函数&#xff0c;用于将一个普通的 JavaScript 对象转换为响应式对象 当对象的属性发生变化时&#xff0c;Vue 会自动追踪这些变化&#xff0c;并触发相应的更新 Vue2没有&#xff0c;而Vue3中有&#xff0c;为啥…