You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中实现类似MATLAB的、以皮尔逊相关为距离的kmeans?

Python中实现MATLAB kmeans的correlation距离聚类

1. 内置函数支持情况

Python主流聚类库(如sklearn.cluster.KMeans)没有直接支持correlation作为距离度量的内置参数。因为sklearn的KMeans底层基于欧氏距离做了优化,原生不支持自定义距离度量(仅能通过预计算距离矩阵实现,但效率极低)。

2. 现成自定义方案

有两种成熟的现成思路:

  • 特征转换法:利用correlation距离的数学特性,将其转化为欧氏距离的等价形式,直接复用标准KMeans实现;
  • 手动迭代法:基于scipy的correlation距离计算函数,手动实现KMeans的迭代逻辑。

3. 具体实现代码

方案一:特征转换后用sklearn KMeans

correlation距离的定义为1 - 皮尔逊相关系数,而皮尔逊相关系数可通过Z-score标准化+L2归一化转换为余弦相似度,余弦相似度又与欧氏距离存在对应关系(向量归一化后,欧氏距离平方=2*(1-余弦相似度))。通过该转换,可直接用sklearn的KMeans实现等价聚类:

import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler, Normalizer

# 示例数据:100个样本,10个特征
X = np.random.rand(100, 10)

# 步骤1:Z-score标准化(每个特征均值为0,方差为1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 步骤2:L2归一化(每个样本向量模长为1)
normalizer = Normalizer(norm='l2')
X_normalized = normalizer.fit_transform(X_scaled)

# 步骤3:用欧氏距离KMeans,等价于correlation距离聚类
kmeans = KMeans(n_clusters=3, random_state=42)
labels = kmeans.fit_predict(X_normalized)

该方案效率极高,复用了sklearn优化后的KMeans实现,适合大数据集。

方案二:手动实现基于correlation距离的KMeans

如果需要直接使用correlation距离计算,可手动实现KMeans迭代逻辑,用scipy的距离函数计算样本与中心的距离:

import numpy as np
from sklearn.metrics.pairwise import pairwise_distances

def kmeans_correlation(X, n_clusters, max_iter=100, tol=1e-4):
    # 随机初始化聚类中心
    n_samples, _ = X.shape
    centroids_idx = np.random.choice(n_samples, n_clusters, replace=False)
    centroids = X[centroids_idx].copy()
    
    for _ in range(max_iter):
        # 计算每个样本到各中心的correlation距离
        distances = pairwise_distances(X, centroids, metric='correlation')
        # 分配聚类标签
        labels = np.argmin(distances, axis=1)
        
        # 更新聚类中心:簇内样本均值(与MATLAB逻辑一致)
        new_centroids = np.array([X[labels == k].mean(axis=0) for k in range(n_clusters)])
        
        # 检查收敛:中心变化小于阈值则停止
        if np.linalg.norm(new_centroids - centroids) < tol:
            break
        centroids = new_centroids
    
    return labels, centroids

# 示例使用
X = np.random.rand(100, 10)
labels, centroids = kmeans_correlation(X, n_clusters=3)

该方案逻辑直观,完全对应MATLAB的correlation距离聚类逻辑,适合小数据集或需要自定义迭代细节的场景。

内容的提问来源于stack exchange,提问作者dhj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:13:19