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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
大数据开发治理平台 DataWorks,不限时长
简介: **K近邻(KNN)算法概述:**KNN是一种基于实例的分类算法,依赖于训练数据的相似性。算法选择最近的K个邻居来决定新样本的类别,K值、距离度量和特征归一化影响性能。适用于非线性数据,但计算复杂度高,适合小数据集。应用广泛,如推荐系统、医疗诊断和图像识别。通过scikit-learn库可实现分类,代码示例展示了数据生成、模型训练和决策边界的可视化。

本文主要介绍近邻算法原理及实践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()
相关文章
|
2天前
|
机器学习/深度学习 算法 搜索推荐
【机器学习】机器学习的基本概念、算法的工作原理、实际应用案例
机器学习是人工智能的一个分支,它使计算机能够在没有明确编程的情况下从数据中学习并改进其性能。机器学习的目标是让计算机自动学习模式和规律,从而能够对未知数据做出预测或决策。
7 2
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
|
3天前
|
机器学习/深度学习 算法 数据可视化
决策树算法介绍:原理与案例实现
决策树算法介绍:原理与案例实现
|
10天前
|
算法
PID算法原理分析及优化
今天为大家介绍一下经典控制算法之一的PID控制方法。PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。 在大学期间,参加的智能汽车竞赛中就使用到了PID经典控制算法,对于智能小车的调试更加的方便。 一、PID原理 PID控制方法将偏差的比例(proportional)、积分(integral)、微分(derivative)通过线性组合构成控制量,对被控对象进行控制。 常规的PID控制系统如图所示: 系统的输入r(t)为控制量的目标输出值,输出y(t)为控制量的实际输出值,e(t)为输出量目标值与实际值
24 1
|
13天前
|
机器学习/深度学习 运维 算法
深入探索机器学习中的支持向量机(SVM)算法:原理、应用与Python代码示例全面解析
【8月更文挑战第6天】在机器学习领域,支持向量机(SVM)犹如璀璨明珠。它是一种强大的监督学习算法,在分类、回归及异常检测中表现出色。SVM通过在高维空间寻找最大间隔超平面来分隔不同类别的数据,提升模型泛化能力。为处理非线性问题,引入了核函数将数据映射到高维空间。SVM在文本分类、图像识别等多个领域有广泛应用,展现出高度灵活性和适应性。
67 2
|
23天前
|
机器学习/深度学习 自然语言处理 算法
AIGC技术的核心算法与发展趋势
【7月更文第27天】随着人工智能技术的迅速发展,AIGC技术已经逐渐成为内容创造领域的一个重要组成部分。这些技术不仅能够帮助人们提高工作效率,还能创造出以往难以想象的新颖内容。本文将重点介绍几种核心算法,并通过一个简单的代码示例来展示如何使用这些算法。
34 7
|
14天前
|
机器学习/深度学习 算法 数据挖掘
【数据挖掘】PCA 主成分分析算法过程及原理讲解
主成分分析(PCA)的原理和算法过程。
28 0
|
1月前
|
算法 Java
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
33 1
|
1月前
|
存储 监控 算法
「AIGC算法」大数据架构Lambda和Kappa
**Lambda与Kappa架构对比:** Lambda提供批处理和实时处理,保证数据最终一致性,但维护复杂。Kappa简化为单一流处理,易于维护,适合实时场景,但可能增加实时处理压力,影响稳定性。选择时考虑数据一致性、系统维护、成本和实时性需求。
56 0
「AIGC算法」大数据架构Lambda和Kappa
|
29天前
|
算法 Java 调度
高并发架构设计三大利器:缓存、限流和降级问题之使用Java代码实现令牌桶算法问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之使用Java代码实现令牌桶算法问题如何解决