1. 共享最近邻(SNN)距离度量概述
共享最近邻(Shared Nearest Neighbors,简称SNN)是一种基于邻居重叠度的距离度量方法,它通过计算数据点之间共享的最近邻数量来评估相似性。与传统欧几里得距离或曼哈顿距离不同,SNN不直接依赖原始特征空间中的绝对距离,而是关注数据点局部邻域结构的相似性。
1.1 为什么需要SNN?
在高维数据场景下,传统距离度量面临两个主要挑战:
-
维度灾难:随着维度增加,所有数据点间的距离趋于相同,导致距离差异失去判别力。研究表明,在数百维的空间中,最近邻和最远邻的距离比值会趋近于1。
-
密度差异:当数据不同区域具有显著不同的密度分布时,全局距离阈值难以适用。例如金融交易数据中,小额交易可能密集聚集而大额交易稀疏分布。
SNN通过以下方式应对这些挑战:
- 使用邻居排名而非绝对距离,缓解高维影响
- 通过共享邻居确认相似性,适应局部密度变化
- 构建基于拓扑的连接关系,增强鲁棒性
提示:SNN特别适合处理具有以下特征的数据集:(1)维度超过50维 (2)包含多个密度差异明显的簇 (3)存在大量无关特征
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SNN算法原理与实现
2.1 核心计算步骤
SNN距离计算分为两个阶段:
-
基础距离计算(稀疏化阶段):
- 对每个点p,找到其k个最近邻NN(p)
- 仅当q∈NN(p)且p∈NN(q)时,保留p-q连接
- 形成稀疏化的邻接图
-
共享邻居计算:
- 对保留的每对连接(p,q),计算:
code复制SNN(p,q) = |NN(p) ∩ NN(q)| - 可选地考虑邻居排序权重(Jarvis-Patrick方法)
- 对保留的每对连接(p,q),计算:
2.2 Python实现详解
以下是带详细注释的SNN距离计算实现:
python复制import numpy as np
import pandas as pd
from sklearn.neighbors import BallTree
class SNN_Calculator:
def __init__(self, base_metric='euclidean'):
"""初始化基础距离度量
