Python异常检测-K最近邻算法(KNN)

系列文章目录

Python异常检测- Isolation Forest(孤立森林)
python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS)
python异常检测-局部异常因子(LOF)算法
Python异常检测- DBSCAN
Python异常检测- 单类支持向量机(One-Class SVM)
Python异常检测-3Sigma


文章目录


前言

kNN算法(k--NearestNeighbor算法),又称k-近邻算法。KNN是一种非参数学习算法,通过基于距离来度量异常的算法,简单来说就是近朱者赤近墨者黑。

一、KNN算法原理

KNN算法是一种基于统计的机器学习方法,用于异常值检测的核心原理是通过计算一个数据点与其K个最近邻居的距离,通过这些距离来判断该数据点是否为异常值。具体是依次计算每个样本点与它最近的K个样本的平均距离,再利用计算的距离与阈值进行比较,如果大于阈值,则认为是异常点。简单来说,就是异常点是指远离大部分正常点的样本点,再直白点说,异常点一定是跟大部分的样本点都隔得很远。

二、KNN的实现步骤

基于kNN的对数据进行分类的过程分为三步:

1.计算距离‌:对于数据集中的每一个点,计算它与所有其他点的距离。通常计算距离来衡量两点之间的相似度。

2.排序选择‌:将所有计算出的距离按照从小到大的顺序进行排序。

3‌.确定邻域:选择距离最小的K个点作为当前点的邻居。

4.计算异常值‌:根据这K个邻域的和预设值的阈值比较来判定当前点是否为异常值。如果这个值超过了阈值,则认为该点是异常值‌。

阈值的定义

KNN方法使用三种类型的距离度量之一作为异常分数的阈值:最大值、平均值和中位数。

"最大值"使用到k个邻居的最大距离作为异常分数。

"平均值"和"中位数"分别使用平均值和中位数作为异常分数。

距离计算一般有如下几种计算方法:

  • 欧氏距离公式
    计算在二维空间中两点之间的距离,公式如下:
powershell 复制代码
|AB| = √[(x1-x2)² + (y1-y2)²]
  • 曼哈顿距离‌
    适用于网格布局的城市距离计算,公式如下:
powershell 复制代码
|AB| = |x2-x1| + |y2-y1|

‌ - 切比雪夫距离‌

两个点之间各坐标数值差绝对值的最大值,公式如下:

powershell 复制代码
max(|x2-x1|, |y2-y1|)
  • 闵氏距离‌
    是欧氏距离的推广,公式如下:
powershell 复制代码
|AB| = [∑(ai-bi)q]^(1/q)

其中a和b是两点在空间中的坐标,i表示维度,q是一个变参数‌2

三、KNN算法的优缺点

KNN算法当前主要使用距离度量法,即根据距离的远近,对近邻的点进行判断,距离越近则权重越大(权重为距离平方的倒数)。

优点:易于实现,无需估计参数,无需训练,支持增量学习,能对超多边形的复杂决策空间建模;

缺点:就是计算量较大,分析速度慢;

四、Python实现

python代码如下:

powershell 复制代码
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split

# 生成模拟数据集
X, y = make_moons(n_samples=500, noise=0.1, random_state=42)
X = StandardScaler().fit_transform(X)  # 标准化数据

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

# 创建KNN模型,这里设置n_neighbors为5,意味着考虑每个点的5个最近邻居
knn = KNeighborsClassifier(n_neighbors=5)

# 训练模型
knn.fit(X_train, y_train)

# 使用训练好的模型预测测试集上的标签
y_pred = knn.predict(X_test)

# 计算异常得分,可以是到最近邻居的距离或其他度量方式
distances, indices = knn.kneighbors(X_test)
anomaly_scores = distances.mean(axis=1)  # 对每个样本取平均距离作为异常分数

# 打印前几个测试样本及其异常分数
for i in range(len(anomaly_scores)):
    print(f"Sample {i}: Anomaly Score: {anomaly_scores[i]}")

# 设置阈值以区分正常和异常数据点
threshold = np.percentile(anomaly_scores, 95)  # 取前95%的数据作为正常范围

# 标记异常数据点
anomalies = [score > threshold for score in anomaly_scores]

print("Anomalies:", anomalies)

参考
Python异常值检测------kNN算法
KNN算法如何实现异常值检测 knn算法报告

相关推荐
承渊政道5 小时前
【Python编程—从入门到实践】(Python条件判断完全入门:从布尔表达式到列表中的if实战)
开发语言·python·pycharm·条件判断·布尔表达式
小灰灰搞电子5 小时前
Rust 相关容器(集合)详解
开发语言·容器·rust
circuitsosk5 小时前
企业知识库 RAG 从 62% 到 91%:分块策略、混合检索与重排序的调优全记录
python·知识库问答·rag·面试项目·ai工程化·混合检索
烂蜻蜓6 小时前
Flask入门教程(二十六):Session API——用户会话状态管理
后端·python·flask
2603_965148118 小时前
家居百货蓝海:API挖掘高复购率生活小商品
大数据·服务器·人工智能·python·生活
萧瑟余晖8 小时前
Java深入解析篇三十三之密封类与接口(Sealed Classes)详解
java·开发语言
阿童木写作11 小时前
跨境电商图片翻译工具推荐:批量图片翻译+视频字幕翻译+智能抠图
python·macos·音视频·xcode
cui_ruicheng12 小时前
LangChain 应用开发(十四):Agent 上下文与记忆机制
服务器·人工智能·python·langchain
论迹复利12 小时前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
circuitsosk12 小时前
任务规划器的三种范式对比:ReAct、Plan-and-Execute 与 Tree-of-Thought 在真实业务中的取舍
前端·javascript·python·react.js·llm·ai agent