Как можно отобразить различия двух матриц путем вычитания через тепловую карту в python? - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть две матрицы [A] (Expected_matrice), [B] (Predicted_matrice) Мне нужно создать третью [C] (Error_matrice) путем их вычитания [C]=[A]-[B] и передать ее в фрейм данных Pandas и сохранить в csv файл.

Поскольку размер вышеуказанных матриц равен 24 * 20, и я пытаюсь:

Первый: Участок [C] через sns.heatmap(C, cbar=True, cmap="gray_gist")

Второй: Оцените [C], применив sum(abs(abs([A])-abs([B])))/24*20, чтобы проверить, насколько он хорош. На самом деле я вычислил сумму Ошибка . Я также знаю, что можно использовать другой метод, такой как MSE from Sklearn import metrics, применив:

from Sklearn import metrics
print(metrics.mean_squared_error(A,B))

Поскольку элементами матриц являются списки Я использовал: [i - j for (i, j) in zip(A,B)]

Мои коды следующие:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.ndimage.filters import gaussian_filter

#A,B can be read from .csv files
A = pd.read_csv('D:\A.csv', header=None)
B = pd.read_csv('D:\B.csv', header=None)

#A,B can be assumed as lists
df_A = pd.DataFrame(A)
df_B = pd.DataFrame(B)

#calculate error matrix via subtraction 
C = [i - j for (i, j) in zip(A,B)]

#Pass error matrix to Pandas dataframe
df_C = pd.DataFrame(C)
df_C.to_csv('Error_Matrix.csv', header=None, index=None)

#Evaluation
Eval= sum(abs(abs([A])-abs([B])))/24*20
Eval_ =  '{:04}'.format(Eval)
print(Eval_)

#Plotting C
fig, ax = plt.subplots(nrows=1, ncols=2 , figsize=(20,15))

plt.subplot(1,2,1)
ax = sns.heatmap(C, cbar=True, cmap="gist_gray")
plt.title(f'Error Matrix  Error={Eval_}', fontsize=14 , fontweight='bold', color='black', loc='center', style='italic')
plt.axis('off')

plt.subplot(1,2,2)
C_smooth = gaussian_filter(dfr_b, sigma=1)
ax = sns.heatmap(C_smooth, vmin=np.min(C_smooth), vmax=np.max(C_smooth), cmap ="gray" , cbar=True , cbar_kws={"ticks":[0,33,67,100]})
plt.title(f'Error Matrix Smooth  Error={Eval_}', fontsize=14 , fontweight='bold', color='black', loc='center', style='italic')
plt.axis('off')
plt.savefig('Error_Matrix.png') 
plt.show()

Ожидаемые результаты:

img

Примечание белым цветом показана ошибка = 0, а сплошным черным цветом показана ошибка = максимум. В основном это ошибка, но я не хочу, чтобы результат был черным. Я ожидал, что в основном серый цвет.

Данные (матрица A, B): Матрица A , Матрица B

1 Ответ

0 голосов
/ 17 апреля 2019

Я бы сделал что-то вроде этого:

import matplotlib.pyplot as plt
import numpy as np


mx = 10 + 3 * np.random.random( 20 * 10 )
mx = mx.reshape( 20, 10 )
nx = 10 + 3 * np.random.random( 20 * 10 )
nx = nx.reshape( 20, 10 )
deltax = mx - nx
ox = 100 * ( 1 - np.abs( ( deltax) / mx ) )

scale = max( [ abs(min( np.concatenate( deltax ) ) ), abs( max( np.concatenate( deltax ) ) ) ] )

chi2 = np.sum( mx - nx )**2
chi2Red = chi2/( len( mx ) * len( mx[0] ) )
print chi2, chi2Red

fig = plt.figure()
ax = fig.add_subplot( 2, 2, 1 )
bx = fig.add_subplot( 2, 2, 2 )
cx = fig.add_subplot( 2, 2, 3 )
dx = fig.add_subplot( 2, 2, 4 )

MX1 = ax.matshow( mx, vmin=0, vmax=30 )
MX2 = bx.matshow( nx, vmin=0, vmax=30 )
diffMX = cx.matshow( deltax, cmap='seismic', vmin=-scale, vmax=scale )
errMX = dx.matshow( ox, vmin=0, vmax=100  )
plt.colorbar( MX1, ax=ax )
plt.colorbar( MX2, ax=bx )
plt.colorbar( diffMX, ax=cx )
plt.colorbar( errMX, ax=dx )
plt.show()

давая:

>> 219.40945851846487 1.0970472925923245

test

Я должен сказать,хотя я не люблю терять информацию о признаке отклонения.Следовательно, нижний левый график будет моим реальным предпочтением.Он может масштабироваться и сдвигаться, как последний, так что ноль становится 100%, а данные будут варьироваться от 80% до 120% или что-то в этом роде.

...