J'ai une matrice de corrélation de la structure typique est de taille 288x288 qui est définie par:AgglomerativeClustering sur une matrice de corrélation
from sklearn.cluster import AgglomerativeClustering
df = read_returns()
correl_matrix = df.corr()
où read_returns me donne une trame de données avec un indice de ce jour, et les colonnes des retours de les atouts. Maintenant, je veux regrouper ces corrélations pour réduire la taille de la population. En faisant un peu de lecture et d'expérimentation, j'ai découvert le AgglomerativeClustering - et il semble au premier passage être une solution appropriée à mon problème.
Je définir une distance métrique ((.5*(1-correl_matrix))**.5)
et ont:
cluster = AgglomerativeClustering(n_clusters=40, linkage='average')
cluster.fit(((.5*(1-correl_matrix))**.5).values)
label_groups = cluster.labels_
Pour observer quelques-unes des données et recouper mon travail, je choisirai groupe 1
et observer les corrélations par paires et trouver la min corrélation entre deux éléments avec ce groupe dans mon jeu de données pour trouver:
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
et obtenir une corrélation min de .20 par paires
Pour moi, cela semble assez faible - mais "bas basé sur quoi?" est une question juste à laquelle je n'ai pas de réponse.
Je voudrais anticiper/appliquer chaque corrélation par paire d'un cluster à> = 7 ou quelque chose comme ça.
Est-ce possible dans AgglomerativeClustering?
Suis-je accidentellement dans le mauvais sens?