你好,
我想在上面显示的两个数据集之间创建一个相关矩阵,它将忽略任何出现的零(在上图中,绿色),任何人都知道产生平滑结果的最有效方法是什么?
是否有任何相关方法可以逐点识别相似性,从而结果将具有原始矩阵的“形状”?
感谢你
注意:我没有 matlab 统计工具箱
你好,
我想在上面显示的两个数据集之间创建一个相关矩阵,它将忽略任何出现的零(在上图中,绿色),任何人都知道产生平滑结果的最有效方法是什么?
是否有任何相关方法可以逐点识别相似性,从而结果将具有原始矩阵的“形状”?
感谢你
注意:我没有 matlab 统计工具箱
2. Is there any correlation method that can identify the similarity point by
point and by thus the results will have the "shape" of the original matrix?
让我们从你的第二点开始,因为它更清楚,你想要什么。您想要对两个图像进行逐点比较,例如A
和B
。这归结为测量两个标量a
和的相似性b
。让我们假设这些标量来自区间[0, Q]
,这Q
取决于您的图像格式(Q == 1
或者Q == 255
在 Matlab 中很常见)。
现在,最简单的距离度量就是差值d = |a - b|
。您可能希望将其标准化[0, 1]
并反转值以测量相似性而不是距离。在 Matlab 中:
S = 1 - abs(A - B) / Q;
您提到了忽略图像中的零点。好吧,您需要定义您期望为零的相似性度量。一种可能性是将相似度设置为零,只要一个像素为零:
S(A == 0 | B == 0) = 0;
您也可以说那里的相似性未定义并将相似性设置为NaN
:
S(A == 0 | B == 0) = nan;
当然,您也可以说 10 和 11 之间的不匹配与 100 和 110 之间的不匹配一样糟糕。在这种情况下,您可以取相对于总和的距离a + b
(称为 Bray Curtis 归一化或归一化欧几里得度量)
D = abs(A - B) ./ (A + B)
S = 1 - D / max(D(:));
如果两个矩阵在同一位置都有一个零值像素,则会遇到问题。同样,有几种可能性: 您可以用一个小的正值alpha
(例如alpha = 1e-6
)来增加总和,以防止除以零:D = abs(A - B) ./ (alpha + A + B)
。
另一种选择是忽略其中的无限值D
并在此处添加您的“零处理”,即
D = abs(A - B) ./ (A + B)
D(A == 0 | B == 0) = nan;
S = 1 - D / max(D(:));
你看,有很多可能性。
1. I would like to create a correlation matrix [...]
您绝对应该更多地考虑这一点,并更好地描述要计算的内容。如果您的矩阵大小为m x m
,则您有m^2
变量。由此你可以计算出一个相关矩阵m^2 x m^2
,它测量每个像素与其他每个像素的相关性。该矩阵还将在对角线上具有最大值(这些是方差)。但是,如果您只有两个实现,我不建议计算相关矩阵。
另一种选择是测量两个图像中行或列的相似性。然后你最终得到一个1 x m
相关系数向量。
但是,我不知道如何从 sizem x m
的两个输入计算 size 的相关矩阵m x m
,这两个输入在对角线上具有最大值。
为了得到一个一般的相关系数,我会使用corr2
. 从文档:
r = corr2(A,B)
返回 A 和 B 之间的相关系数 r,其中 A 和 B 是相同大小的矩阵或向量。r 是双标量。
粗略地说,我相信这只是计算corr(A(:), B(:))
。