当距离实际上为零时,浮点表示近似问题会导致负距离。负数的平方根是未定义的(假设您对复杂的解决方案不感兴趣)。
Imagine MAT
有价值
[[ 1.62434536 -0.61175641 -0.52817175 -1.07296862 0.86540763]
[-2.3015387 1.74481176 -0.7612069 0.3190391 -0.24937038]
[ 1.46210794 -2.06014071 -0.3224172 -0.38405435 1.13376944]
[-1.09989127 -0.17242821 -0.87785842 0.04221375 0.58281521]]
现在,如果我们分解计算,我们会看到(MAT ** 2).sum(1).reshape((MAT.shape[0], 1)) + (MAT ** 2).sum(1).reshape((1, MAT.shape[0]))
有价值
[[ 10.3838024 -9.92394296 10.39763039 -1.51676099]
[ -9.92394296 18.16971188 -14.23897281 5.53390084]
[ 10.39763039 -14.23897281 15.83764622 -0.65066204]
[ -1.51676099 5.53390084 -0.65066204 4.70316652]]
and 2 * MAT.dot(MAT.T)
有价值
[[ 10.3838024 14.27675714 13.11072431 7.54348446]
[ 14.27675714 18.16971188 17.00367905 11.4364392 ]
[ 13.11072431 17.00367905 15.83764622 10.27040637]
[ 7.54348446 11.4364392 10.27040637 4.70316652]]
这两个值的对角线应该相等(向量与其自身之间的距离为零),从这个文本表示来看,这似乎是正确的,但实际上它们略有不同——差异太小而无法在以下情况下显示出来:我们像这样打印浮点值
当我们打印完整表达式的值时(从第一个矩阵中减去上面的第二个矩阵),这一点变得显而易见
[[ 0.00000000e+00 2.42007001e+01 2.71309392e+00 9.06024545e+00]
[ 2.42007001e+01 -7.10542736e-15 3.12426519e+01 5.90253836e+00]
[ 2.71309392e+00 3.12426519e+01 0.00000000e+00 1.09210684e+01]
[ 9.06024545e+00 5.90253836e+00 1.09210684e+01 0.00000000e+00]]
对角线几乎由零组成,但第二行第二列中的项目现在是一个非常小的负值。然后,当您计算所有这些值的平方根时,您会得到NaN
处于该位置,因为负数的平方根未定义(对于实数)。
[[ 0. 4.91942071 1.64714721 3.01002416]
[ 4.91942071 nan 5.58951267 2.42951402]
[ 1.64714721 5.58951267 0. 3.30470398]
[ 3.01002416 2.42951402 3.30470398 0. ]]