【问题标题】:How can display differences of two matrices by subtraction via heatmap in python?python - 如何通过python中的热图减法显示两个矩阵的差异?
【发布时间】:2019-09-02 11:44:30
【问题描述】:

我有两个矩阵 [A](Expected_matrice) ,[B](Predicted_matrice) 我需要通过减去它们 [C]=[A]-[B] 创建第三个 [C](Error_matrice) 并将其传递给 Pandas 数据框并保存在 csv 中文件。

由于上述矩阵的大小为 24*20,我尝试:

首先:绘图 [C] 通过sns.heatmap(C, cbar=True, cmap="gray_gist")

第二:评估 [C] 通过应用sum(abs(abs([A])-abs([B])))/24*20 来检查它有多好。事实上,我以此来计算 Error 的数量。我也知道可以通过申请使用另一种方法,例如 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()

预期结果:

注意白色显示 Error=0,纯黑色显示 Error=maximum。 大部分应该是错误,但我不想得到黑色的结果,我主要期望灰色。

数据(矩阵 A,B): Matrix A , Matrix B

【问题讨论】:

  • 嗨马里奥,问题是什么? ...为什么要放置高斯滤波器?
  • 如果我猜对了,黑色是error = 0。此外,如果您将vminvmax 缩放到数组的极值,它的范围自然会从黑色到白色。最后,我不认为abs( abs(A) - abs(B) ) 是一个好的错误指示器; abs( A - B ) 可能更好。
  • @mikuszefski 我用来消除冗余的高斯滤波器,它可以更好地突出显示结果。我不确定我们是否有其他选择。关于您在 MAPE 中使用 MSE(Mean Square Error)MAPE(Mean Absolute Percentage Error) 的公式,最好使用 ( deltax) / A 而不是 ( deltax) / Box_ = 100 * np.sum(( 1 - np.abs( ( deltax) / A ) )) / ( len( A ) * len( B[0] ) ) 中只剩下一些问题,例如在colormap 中的数字描述中保持颜色的和谐,并将% 添加到colormap 中的数字中,就像帖子中的预期图片一样。我喜欢图片。
  • @mikuszefski 我想知道您是否喜欢 DNN,您可以通过查看 this question 来帮助我并检查我对数据集的重塑。我觉得有问题或者没有科学实施。我想从你那里得到反馈,至少请检查我的方法和数据集。
  • 嗨马里奥,虽然这是一个有趣的话题,但我不喜欢神经网络。如果我有空闲时间,无论如何我可能会研究一下,但是由于您的问题看起来很有趣,我相信您会吸引合适的人来回答它。干杯。

标签: python dataframe matrix seaborn heatmap


【解决方案1】:

我会这样做:

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

我不得不说,我不喜欢丢失有关偏差符号的信息。因此,左下图将是我的实际偏好。它可以像最后一个一样缩放和移动,使零变为 100%,数据范围从 80% 到 120% 或有点类似。

【讨论】:

  • 其实我喜欢代表 MAPE 的最后一个。深色显示不好的预测,黄色显示更好的预测。我不确定我们怎样才能让它反之亦然,就像你提到的“它可以像最后一个一样缩放和移动,使零变为 100%”,以及我们如何将数据从 80% 范围转移到 120%?
  • @Mario 以及最后一个从零开始,您只需删除 ox = 100 * ( 1 - np.abs( ( deltax) / mx ) ) 中的 1- 留下 ox = 100 * np.abs( ( deltax ) / mx ) 始终可以反转颜色图。这里viridis 将更改为viridis_r
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2016-12-08
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 2018-08-22
  • 2018-01-16
相关资源
最近更新 更多