Кросс-корреляционная матрица и иерархическая кластеризация Python - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь сделать следующее, а именно использовать 'scipy.cluster.hierarchy', чтобы разместить дендограммы сверху и слева от матрицы взаимной корреляции.Моя матрица взаимной корреляции имеет размер 10х10 и состоит из значений в диапазоне от -1 до +1 и единиц по ее диагонали.Это выглядит следующим образом:

array([[ 0.   ,  0.94 ,  0.909,  0.857,  0.736,  0.485,  0.163, -0.079,
    -0.142, -0.265],
   [ 0.94 ,  0.   ,  0.977,  0.943,  0.832,  0.591,  0.251, -0.018,
    -0.074, -0.233],
   [ 0.909,  0.977,  0.   ,  0.97 ,  0.887,  0.665,  0.331,  0.053,
    -0.013, -0.18 ],
   [ 0.857,  0.943,  0.97 ,  0.   ,  0.956,  0.777,  0.461,  0.178,
     0.103, -0.08 ],
   [ 0.736,  0.832,  0.887,  0.956,  0.   ,  0.909,  0.659,  0.392,
     0.306,  0.119],
   [ 0.485,  0.591,  0.665,  0.777,  0.909,  0.   ,  0.896,  0.7  ,
     0.62 ,  0.448],
   [ 0.163,  0.251,  0.331,  0.461,  0.659,  0.896,  0.   ,  0.933,
     0.869,  0.766],
   [-0.079, -0.018,  0.053,  0.178,  0.392,  0.7  ,  0.933,  0.   ,
     0.959,  0.935],
   [-0.142, -0.074, -0.013,  0.103,  0.306,  0.62 ,  0.869,  0.959,
     0.   ,  0.925],
   [-0.265, -0.233, -0.18 , -0.08 ,  0.119,  0.448,  0.766,  0.935,
     0.925,  0.   ]])

Я использую следующий код, где переменная Av_Matrix является вышеупомянутой матрицей:

import matplotlib.pyplot as plt
import numpy as np
import scipy
import pylab
import scipy.cluster.hierarchy as sch
from scipy.spatial.distance import squareform

#Replace the ones on the diagonal with zeros
for b in range(10):
    Av_Matrix[b,b]=0

#Rounded to 3 decimal places to better see if atrix is symmetric
Av_Matrix = np.matrix.round(Av_Matrix,3)

condensedD = squareform(Av_Matrix)

# Compute and plot first dendrogram.
fig = pylab.figure(figsize=(8,8))
ax1 = fig.add_axes([0.09,0.1,0.2,0.6])
Y = sch.linkage(condensedD, method='single')
Z1 = sch.dendrogram(Y, orientation='left')
ax1.set_xticks([])
ax1.set_yticks([])

# Compute and plot second dendrogram.
ax2 = fig.add_axes([0.3,0.71,0.6,0.2])
Y = sch.linkage(condensedD, method='single')
Z2 = sch.dendrogram(Y)
ax2.set_xticks([])
ax2.set_yticks([])

# Plot distance matrix.
axmatrix = fig.add_axes([0.3,0.1,0.6,0.6])
idx1 = Z1['leaves']
idx2 = Z2['leaves']
D = Av_Matrix[idx1,:]
D = Av_Matrix[:,idx2]
im = axmatrix.matshow(Av_Matrix, aspect='auto', origin='lower', cmap=pylab.cm.YlGnBu)
axmatrix.set_xticks([])
axmatrix.set_yticks([])

# Plot colorbar.
axcolor = fig.add_axes([0.91,0.1,0.02,0.6])
pylab.colorbar(im, cax=axcolor)
fig.show()

Я понимаю, что допустимость матрицы расстоянийа также сжатая матрица расстояний проверяются в файле distance.py, и именно здесь происходит моя ошибка.Сначала моя матрица расстояний была не симметричной, и я проверил это с помощью np.allclose, но, несмотря на то, что это вернуло True, оно все равно упоминало несимметрию.Затем я заменил их по диагонали нулями и, кроме того, округлил до 3 знаков после запятой.Казалось, это работает, но следующая ошибка была следующей:

File "C:/Users/Dymphie/PycharmProjects/iCSD\Matrix_dendogram.py", line 31, in Matrix_dendogram Z1 = sch.dendrogram(Y, orientation='left') File "C:\Users\Dymphie\AppData\Local\Enthought\Canopy32\User\lib\site-packages\scipy\cluster\hierarchy.py", line 2118, in dendrogram is_valid_linkage(Z, throw=True, name='Z') File "C:\Users\Dymphie\AppData\Local\Enthought\Canopy32\User\lib\site-packages\scipy\cluster\hierarchy.py", line 1324, in is_valid_linkage 'distances.') % name) ValueError: Linkage 'Z' contains negative distances.

Массив связей 'Z' выглядит следующим образом:

array([[  0.   ,   9.   ,  -0.265,   2.   ],
   [  1.   ,  10.   ,  -0.233,   3.   ],
   [  2.   ,  11.   ,  -0.18 ,   4.   ],
   [  8.   ,  12.   ,  -0.142,   5.   ],
   [  3.   ,  13.   ,  -0.08 ,   6.   ],
   [  7.   ,  14.   ,  -0.079,   7.   ],
   [  4.   ,  15.   ,   0.119,   8.   ],
   [  6.   ,  16.   ,   0.163,   9.   ],
   [  5.   ,  17.   ,   0.448,  10.   ]])

Мои мысли по этому поводуесли бы это могло быть вызвано отрицательными корреляциями в исходном Av_Matrix и простым пробованием абсолютного значения матрицы и последующим запуском кода, это привело к результату без ошибок.Итак, мой вопрос, как я могу построить эти дендограммы с моей матрицей взаимной корреляции, которая состоит из отрицательных значений?

(очень жаль, что это такая длинная запись!)

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