首页 > 编程语言 >【近邻算法】近邻算法详解——深入理解K-近邻(KNN)

【近邻算法】近邻算法详解——深入理解K-近邻(KNN)

时间:2024-06-12 11:04:25浏览次数:24  
标签:KNN df 近邻 距离 算法 train

目录

1 引言

2 算法基础

2.1 核心原理

2.2 算法步骤

3 关键参数与优化

3.1 K值选择

3.2 距离度量

4 优缺点分析

4.1 优点

4.2 缺点

5 改进策略

6 应用案例深度解析:K-近邻算法在客户细分中的应用

6.1 引言

6.2 数据准备与预处理

6.3 特征选择与编码

6.4 K-近邻算法应用

6.5 模型评估

6.6 参数调优

6.7 实际应用中的挑战与对策

7 结语


1 引言

     在机器学习领域,K-近邻算法(K-Nearest Neighbors, KNN)以其直观性和易于实现的特点,成为了一种广泛应用于分类和回归任务的基础算法。

    KNN算法的核心思想基于这样一个假设:在一个特征空间中,相似的样本倾向于具有相似的输出(类别或数值)。对于一个新的未知样本,可以通过测量其与已知样本集中的每个样本的距离,找出距离最近的K个邻居,然后根据这些邻居的已知标签来预测新样本的标签。

2 算法基础
2.1 核心原理

      KNN算法的基本假设是“相似的数据具有相似的属性”。给定一个未标记的数据点,KNN通过计算该点与已知数据集中的所有点之间的距离,找到距离最近的K个邻居。这些邻居的标签(在分类任务中)或数值(在回归任务中)决定新数据点的预测结果。对于分类,采用多数表决原则;对于回归,则取邻居标签的平均值或加权平均值。

2.2 算法步骤
  1. 数据准备:收集并整理包含特征和标签的数据集。
  2. 距离度量:选择合适的距离度量方法,如欧氏距离、曼哈顿距离等。
  3. 选择K值:确定用于决策的邻居数量K,K值的选择对模型性能至关重要。
  4. 预测:对新的数据点,计算其与训练集中每个点的距离,找出最近的K个邻居。
  5. 决策规则:根据K个邻居的标签,执行多数表决(分类)或平均值计算(回归)。
3 关键参数与优化
3.1 K值选择

K值是KNN算法中的核心参数,较小的K值可能导致过拟合,较大的K值则可能因纳入过多噪声导致欠拟合。实践中常通过交叉验证来确定最优K值。

3.2 距离度量

选择合适的距离度量方法对算法性能有重要影响。不同问题可能适合不同的度量方式,需根据具体情况选择。

4 优缺点分析
4.1 优点
  • 简单直观:无需训练过程,直接基于实例进行预测。
  • 无需参数估计:除了K值,算法本身无需其他参数的训练。
  • 适用范围广:既可用于分类也可用于回归问题。
4.2 缺点
  • 计算成本高:尤其在大规模数据集上,每次预测都需要计算与所有训练样本的距离。
  • 对内存要求高:需要存储整个训练数据集。
  • 对异常值敏感:距离计算中,异常值可能会对预测结果产生较大影响。
  • 特征选择和缩放敏感:特征的重要性、量纲差异会影响距离计算。
5 改进策略

为克服上述挑战,可采取以下策略提升KNN性能:

  • 特征选择与降维:通过PCA、LDA等方法减少特征维度,提高计算效率。
  • 近似最近邻算法:如使用kd树、球树等数据结构加速最近邻搜索。
  • 加权KNN:根据邻居距离的远近赋予不同的权重,近邻的影响更大。
  • 批量预测:在处理大量查询时,一次性计算多个点的近邻,利用数据局部性减少重复计算。
6 应用案例深度解析:K-近邻算法在客户细分中的应用
6.1 引言

      在商业智能和市场营销中,客户细分是一项至关重要的任务,它帮助企业更好地理解客户群体,制定精准的营销策略。K-近邻算法凭借其在分类问题上的优势,可以有效地应用于客户细分场景中,通过对客户的购买行为、偏好、消费能力等多维度特征进行分析,将客户划分为不同的细分群体。本节将详细介绍如何使用KNN进行客户细分,并通过Python代码演示实际操作过程。

6.2 数据准备与预处理

假设有一个简化版的客户数据集,包含客户的年龄、性别、年收入和购买频率等特征。首先,需要加载数据并进行预处理,包括缺失值处理、数据标准化等。

import pandas as pd
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler

# 假设数据集已保存为CSV文件
data_path = 'customer_data.csv'
df = pd.read_csv(data_path)

# 处理缺失值,这里以均值填充为例
imputer = SimpleImputer(strategy='mean')
df[['Age', 'AnnualIncome', 'PurchaseFrequency']] = imputer.fit_transform(df[['Age', 'AnnualIncome', 'PurchaseFrequency']])

# 特征标准化
scaler = StandardScaler()
df_scaled = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
6.3 特征选择与编码

在本例中,将直接使用年龄、年收入和购买频率作为特征,性别需要进行编码转换。假设性别为“男”为0,“女”为1。

df_scaled['Gender'] = df['Gender'].map({'Male': 0, 'Female': 1})
6.4 K-近邻算法应用

接下来,将使用KNN算法对客户进行分类。需要定义一个目标变量,假设有已知的客户群体标签(例如,'Segment1', 'Segment2', ...),然后使用KNN对未知标签的客户进行分类。

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

# 假设df_scaled的最后一列是目标变量
X = df_scaled.drop(columns=['Segment'])
y = df_scaled['Segment']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 使用KNN分类器,这里K值设定为5
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)

# 预测测试集的结果
predictions = knn.predict(X_test)
6.5 模型评估

评估KNN模型的性能是关键步骤,可以通过查看分类报告和准确率来了解模型的表现。

from sklearn.metrics import classification_report, accuracy_score

# 打印分类报告
print("Classification Report:\n", classification_report(y_test, predictions))

# 计算准确率
accuracy = accuracy_score(y_test, predictions)
print(f"Accuracy: {accuracy}")
6.6 参数调优

K值的选择对KNN模型的性能有很大影响。可以通过交叉验证来寻找最优的K值。

from sklearn.model_selection import cross_val_score

# 尝试不同的K值
k_values = list(range(1, 9))
scores = []

for k in k_values:
    knn = KNeighborsClassifier(n_neighbors=k)
    scores.append(cross_val_score(knn, X_train, y_train, cv=5).mean())

# 绘制K值与交叉验证得分的关系图
import matplotlib.pyplot as plt

plt.plot(k_values, scores)
plt.xlabel('Value of K')
plt.ylabel('Cross-validated score')
plt.show()

# 选择最优K值
best_k = k_values[scores.index(max(scores))]
print(f"Best K value: {best_k}")
6.7 实际应用中的挑战与对策

在实际应用中,KNN客户细分面临几个挑战:

  1. 维度灾难:随着特征数量增加,计算距离的成本急剧上升。可以采用特征选择或降维技术(如PCA)来缓解。
  2. 大规模数据处理:对于大数据集,可以考虑使用近似最近邻搜索算法(如Annoy、HNSW)。
  3. 类别不平衡:在某些细分市场中,某一类别的客户数量远少于其他类别,可能需要调整权重或采用重采样策略。
7 结语

     K-近邻算法以其简单有效著称,尽管存在计算效率和内存占用等问题,但通过合理的参数选择和算法优化,仍然能在众多实际问题中发挥重要作用。理解其背后的原理及其局限性,是进一步探索高级机器学习技术的基础。

标签:KNN,df,近邻,距离,算法,train
From: https://blog.csdn.net/weixin_43298211/article/details/139586853

相关文章

  • 一种改进盲解卷积算法在旋转机械故障诊断中的应用(MATLAB)
    滚动轴承故障形成后,故障区与其他零部件表面接触将产生循环平稳的瞬态脉冲。由于受到系统传递函数、轴转频和环境噪声的干扰,故障脉冲特征受到大幅衰减,在测得信号中表现十分微弱甚至完全不可见。盲解卷积算法通过搜索一个最优的有限脉冲响应滤波器来降低信号传输路径、轴转频和环......
  • 实现EM算法的单次迭代过程
    编程要求根据提示,在右侧编辑器补充Begin-End段中的代码,完成em_single(priors,observations)函数。该函数需要完成的功能是模拟抛掷硬币实验并估计在一次迭代中,硬币A与硬币B正面朝上的概率。其中:init_values:硬币A与硬币B正面朝上的概率的初始值,类型为list,如[......
  • 如何评估pcdn调度算法的优化效果(贰)
    PCDN(PersonalizedContentDeliveryNetwork)调度算法的优化可以通过以下几个方面来进行:1、性能指标:首先确定要评估的关键性能指标(KPIs),如平均响应时间、内容分发速度、缓存命中率、用户满意度等。这些指标应直接反映算法优化后的效果。2、基准测试:在优化之前,进行基准测试以......
  • 第6篇:Milvus检索算法详解:从原理到应用
    欢迎来到Milvus检索算法的世界!在本文,我将带你深入了解Milvus的向量相似度计算和常用的检索算法。通过这篇博客,你将了解Milvus是如何高效计算向量相似度并进行向量检索的。准备好了吗?让我们开始这段知识之旅吧!文章目录Milvus的向量相似度计算向量相似度计算的原理......
  • 代码随想录算法训练营第第35天 | 977.有序数组的平方1005.K次取反后最大化的数组和 、
    1005.K次取反后最大化的数组和本题简单一些,估计大家不用想着贪心,用自己直觉也会有思路。https://programmercarl.com/1005.K次取反后最大化的数组和.html自己写的时间复杂度太高,看答案优化/***@param{number[]}nums*@param{number}k*@return{number}*/varl......
  • 力控算法每日一练:209. 长度最小的子数组(java)
    给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl,numsl+1,...,numsr-1,numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。classSolution{publicintminSubArrayL......
  • 代码随想录 算法训练营 d6 哈希表 Leetcode242 有效的字母异位词 Leetcode349 两个数
    哈希表很重要哈希表哈希表场景一般哈希表都是用来快速判断一个元素是否出现集合里一般来说数组模拟哈希set 哈希map不同的场景 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,se......
  • 请简述逻辑位移与算法位移的区别
    请简述逻辑位移与算法位移的区别逻辑位移(LogicalShift)逻辑位移通常用于无符号整数。在逻辑位移中,所有的位都向左或向右移动指定的位数,空出的位置用0填充。逻辑位移通常用于快速乘以或除以2的幂次方。左逻辑位移:将二进制数的所有位向左移动指定的位数,最右边的位被丢弃,最左边空......
  • 文心一言 VS 讯飞星火 VS chatgpt (279)-- 算法导论20.3 6题
    六、创建一个全域大小为u的vEB树,需要O(u)的运行时间。假设我们想得到确切时间。如果vEB树中每个操作的摊还时间为〇(lglgu),那么最小的操作数n是多少?如果要写代码,请用go语言。文心一言:首先,让我们澄清一下vEB(vanEmdeBoas)树的基本概念。vEB树是一种特殊的搜索......
  • 「杂文」身为 ACMer 的我算法分析与设计居然挂了,我为什么会做这样的梦(雾)
    目录写在前面判断简答影响时间复杂度的因素排序Prim和Kruskal的异同贪心和DP的区别DP与分治的区别贪心,DP与分治分支界限法和回溯法的异同计算与算法应用题复杂度计算分支界限法分支界限法背包分支界限法求单源最短路径算法设计题写在最后写在前面臭打ACM的懂个屁的算法......