相关矩阵上的凝聚聚类

AgglomerativeClustering on a correlation matrix

我有一个典型结构的相关矩阵,其大小为 288x288,定义如下:

from sklearn.cluster import AgglomerativeClustering
df = read_returns()
correl_matrix = df.corr()

其中 read_returns 给我一个带有日期索引的数据框,以及 returns 资产的列。

现在 - 我想对这些相关性进行聚类以减少总体规模。

通过阅读和试验,我发现了 AgglomerativeClustering - 乍一看它似乎是解决我的问题的合适方法。

我将距离度量定义为 ((.5*(1-correl_matrix))**.5) 并且有:

cluster = AgglomerativeClustering(n_clusters=40, linkage='average')
cluster.fit(((.5*(1-correl_matrix))**.5).values)
label_groups = cluster.labels_

为了观察一些数据并交叉检查我的工作,我选择了集群 1 并观察成对相关性并找到数据集中该组的两个项目之间的最小相关性以找到:

single_cluster = []
for i in range(0,correl_matrix.shape[0]):
    if label_groups[i]==1:
        single_cluster.append(correl_matrix.index[i])

min_correl = 1.0
for x in single_cluster:
    for y in single_cluster:
        if x<>y:
            if correl_matrix[x][y]<min_correl:
                min_correl = correl_matrix[x][y]

print min_correl

并得到 .20 的最小成对相关性

对我来说,这似乎很低 - 但 "low based off what?" 是一个公平的问题,我无法回答。

我想 anticipate/enforce 集群的每个成对相关性 >=.7 或类似的值。

这在 AgglomerativeClustering 中可行吗?

我是不是不小心走错了路?

层次聚类支持不同的 "linkage" 策略。

  • single-link:这将最小距离上的点连接到集群中的其他点
  • complete-link:这基于到集群的最大距离进行连接
  • ...

如果你想要一个高的最小相关性=小的最大距离,这需要完整的link年龄。

您可能也想将负相关视为 "good"。 即使用 dist = 1 - abs(corr).

确保使用 ghe 树状图。如果你的数据中有异常值,你想分成 (n_clusters+n_outliers) 个分区。