Интуиция за корреляцией - PullRequest
       0

Интуиция за корреляцией

0 голосов
/ 12 апреля 2020

Я следую этому онлайн-уроку от kaggle , и я не могу понять, почему .T меняет форму матрицы. Вот часть, в которой я застрял:

#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

В основном мне не удается снимать код и пробовал это:

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

возвращает матрицу с формой 1460x1460. Но когда я ввожу:

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

, он возвращает матрицу с формой 10x10. Кто-нибудь знает, почему это происходит? Я не могу понять.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Корреляция дает вам нормализованное представление ковариационной матрицы между всеми "столбцами" кадра данных. Например, в случае наличия только двух переменных у вас получится матрица формы:

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

Это довольно дорогое вычисление, так как оно включает в себя скалярное произведение каждого столбца с остальными, что приводит к коэффициенту корреляции для каждой комбинации.

Таким образом, в матричной записи, поскольку вы хотите получить матрицу 10x10, вы хотите, чтобы фигуры были правильно выровнены. В этом случае вы хотите (10,1460)x(1460,10), поэтому вы получите матрицу 10,10. Следовательно, вам нужно транспонировать 2D-массив таким образом, чтобы он имел форму (10,1460), когда вы подаете его на np.corrcoef.

Хотя вы можете найти его немного проще, поиграв с ним самостоятельно и увидев, как фактическая вычисляется корреляция Пирсона :

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

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

, которая делает то же, что и:

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.        ]])

Обратите внимание, что, как уже упоминалось, это дает в результате нормализованный точечный продукт из X с самим собой, поэтому для каждого (1,1460)x(1460,1) продукта вы получаете один номер. Поэтому X здесь, как и в вашем примере, необходимо транспонировать, чтобы размеры были правильно выровнены.

1 голос
/ 12 апреля 2020

Из numpy документации 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.

Обратите внимание, что каждая строка представляет переменную, в первом случае у вас есть 1460 строк и 10 столбцов, а во втором у вас есть 10 строк с 1460 столбцами.

Так что, когда вы перемещаете свой массив NumPy, вы в основном меняете 1460 переменных с 10 значениями для каждого, до 10 переменных с 1460 значениями для каждого. .

Если вы имеете дело с pandas, вы можете просто использовать встроенный метод .corr () , который вычисляет корреляцию между столбцами .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...