Sklearn谱聚类中K近邻亲和矩阵出现0.5值的原因探究
Sklearn谱聚类K近邻亲和矩阵中0.5数值的成因
核心逻辑:有向近邻图的对称化方式
当你在SpectralClustering中设置affinity='nearest_neighbors'时,底层会先生成有向的K近邻连接图:
- 对每个样本点,找到包含自身在内的
n_neighbors个最近邻(默认include_self=True),将有向边i→j的权重设为1(如果j是i的近邻),否则为0。 - 这个初始图是有向的:
i属于j的近邻,不代表j一定属于i的近邻。
Sklearn会对这个有向图做对称化处理,规则很直接:
- 若
i和j互为近邻(双向有边),对称化后权重保持1.0; - 若只有单向连接(比如
j是i的近邻,但i不是j的近邻),则对称化后A[i,j]和A[j,i]都设为(1+0)/2=0.5——这就是你看到的0.5数值的来源。
关于你手动对称化后与原矩阵的差异
你提到手动将亲和矩阵与转置相加取平均后结果不符,大概率是这两个原因:
- 处理对象或细节偏差:如果你是手动构建原始有向近邻图再对称化,要注意Sklearn的
kneighbors_graph在处理距离相等的样本时,会通过random_state参数决定近邻的选择(比如你的例子中多个点距离相同),这会导致你手动构建的有向图和Sklearn内部生成的有差异,最终对称化结果不同。 - 自环的处理:Sklearn默认会给每个样本添加自环(权重1.0),如果你手动构建时忽略了这一点,也会导致结果偏差。
举你例子里的点1和点4:
假设Sklearn内部生成的有向图中,点1的3近邻包含点4,但点4的3近邻不包含点1(因距离相等时的随机选择),那么对称化后两者之间的权重就会变成0.5,和你给出的亲和矩阵结果一致。
内容的提问来源于stack exchange,提问作者Francis Baffour-Awuah Junior
相关产品推荐
相关产品推荐

