Matlab中两个矩阵之间的相关性

5

enter image description here

您好,

  1. 我想在上述两个数据集之间创建一个相关矩阵,该矩阵将忽略任何零的出现(在上图中为绿色),有没有人知道最有效的方法,可以产生平滑的结果?

  2. 是否有任何相关方法可以逐点识别相似性点,从而结果将具有原始矩阵的“形状”?

谢谢!

注:我没有matlab统计工具箱。


我不确定我听懂了你的意思。你说“_忽略任何零的外观_”是什么意思? - Eitan T
如果您看一下上面的图片,除了图片左上角的“零”之外,还有散布在周围的零,我不想将它们从用于相关性的数据中排除。 - jarhead
  1. 结果的维度应该是多少?我问这个问题是因为相关性通常需要两个向量,并从中计算出一个标量。
- Mehrwolf
@Mehrwolf,结果将是一个 m * m 的矩阵,其对角线上的系数最高。m 是列数。 - jarhead
2个回答

6
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?

让我们从你的第二个观点开始,因为你想要的更加清晰。你想要逐点比较两个图像,比如说AB。这归结为测量两个标量ab的相似性。假设这些标量来自区间[0, Q],其中Q取决于你的图像格式(在Matlab中,Q == 1Q == 255很常见)。
现在,最简单的距离度量是差异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之间的不匹配程度一样糟糕。在这种情况下,您可以根据总和(称为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 的相关系数。
然而,我不知道如何从两个大小为 m x m 的输入计算出一个对角线上的值最大的 m x m 相关矩阵。

0

如果只是想得到一个一般的相关系数,我会使用 corr2文档:

r = corr2(A,B)

返回 A 和 B 之间的相关系数 r,其中 A 和 B 是相同大小的矩阵或向量。r 是标量 double。

大致上,我相信它只是计算了 corr(A(:), B(:))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接