Je suis ce tutoriel en ligne de kaggle et je peux Je ne sais pas pourquoi .T change la forme de la matrice. Voici la partie où je suis coincé:

#saleprice correlation matrix
k = 10 #number of variables for heatmap
cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index
cm = np.corrcoef(df_train[cols].values.T)
sns.set(font_scale=1.25)
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10}, yticklabels=cols.values, xticklabels=cols.values)
plt.show()

enter image description here

J'ai essentiellement du mal à résoudre le code et j'ai essayé ceci:

 cm = np.corrcoef(df_train[cols].values)
 cm.shape

Renvoie une matrice de forme 1460x1460. Mais quand je saisis:

 cm = np.corrcoef(df_train[cols].values.T)
 cm.shape

Il renvoie une matrice de forme 10x10. Est-ce que quelqu'un sait pourquoi il fait cela? Je ne peux pas comprendre.

0
apang 12 avril 2020 à 21:26

2 réponses

Meilleure réponse

La corrélation vous donne une représentation normalisée de la matrice de covariance entre toutes les "colonnes" du dataframe. Par exemple, dans le cas où vous n'aviez que deux variables, vous vous retrouveriez avec une matrice de la forme:

Rx =  [[   1,    r_xy],
       [r_yx,       1]]

C'est un calcul assez coûteux, car il implique de prendre le produit scalaire de chaque colonne avec le reste, ce qui donne un coefficient de corrélation pour chaque combinaison.

Donc, en notation matricielle, puisque vous voulez vous retrouver avec une matrice 10x10, vous voulez que les formes soient correctement alignées. Dans ce cas, vous voulez (10,1460)x(1460,10) donc vous obtenez une matrice 10,10. Par conséquent, vous devez transposer le tableau 2D pour qu'il ait la forme (10,1460) lorsque vous le transmettez à np.corrcoef.

Cependant, vous pourriez trouver cela un peu plus facile en jouant avec vous-même et en voyant comment la corrélation de Pearson est calculé:

X = np.random.randint(0,10,(500,2))
print(np.corrcoef(X.T))

array([[1.        , 0.04400245],
       [0.04400245, 1.        ]])

Ce qui fait la même chose que:

mean_X = X.mean(axis=0)
std_X = X.std(axis=0)
n, _ = X.shape

print((X.T-mean_X[:,None]).dot(X-mean_X)/(n*std_X**2))

array([[1.        , 0.04416552],
       [0.04383998, 1.        ]])

Notez que comme mentionné, cela donne comme résultat un normalisé produit scalaire de X avec lui-même, donc pour chaque (1,1460)x(1460,1) produit, vous obtenez un numéro unique. Donc X ici, tout comme dans votre exemple, doit être transposé pour que les dimensions soient correctement alignées.

2
yatu 12 avril 2020 à 22:10

Depuis numpy documentation de corrcoef:

x : array_like
A 1-D or 2-D array containing multiple variables and observations. 
Each row of x represents a variable, and 
each column a single observation of all those variables. Also see rowvar below.

Notez que chaque ligne représente une variable, dans le premier cas vous avez 1460 lignes et 10 colonnes et dans le second vous avez 10 lignes avec 1460 colonnes.

Ainsi, lorsque vous transposez votre tableau NumPy, vous passez essentiellement de 1460 variables avec 10 valeurs pour chacune à 10 variables avec 1460 valeurs pour chacune.

Si vous avez affaire à des pandas, vous pouvez simplement utiliser le . corr () qui calcule la corrélation entre les colonnes .

1
Bruno Mello 12 avril 2020 à 18:33