我有一个典型结构的相关矩阵,大小为288x288,定义如下:
from sklearn.cluster import AgglomerativeClustering
df = read_returns()
correl_matrix = df.corr()
其中read_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
的最小成对相关性对我而言,这似乎相当低 - 但“基于什么低”?这是一个公平的问题,我没有答案。
我希望预测/强制群集的每个成对相关性为&gt; =。7或类似的东西。
这是否可以在AgglomerativeClustering中使用?
我是不是意外地走错了路?
答案 0 :(得分:0)
分层聚类支持不同的“链接”策略。
如果您想要一个较高的最小相关=较小的最大距离,则需要完全连接。
您可能也希望将负相关视为“好”。
即使用dist = 1 - abs(corr)
。
确保使用ghe树形图。如果您的数据中有异常值,则需要切入(n_clusters + n_outliers)分区。