计算高斯核,并通过查看核的等级检查其是否可分离。
spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=false
现在,我认为分隔是不正确的。我以以下方式进行操作:
kernel = gaussian_kernel(kernel_size,sigma)
print(kernel)
[[ 0.01054991 0.02267864 0.0292689 0.02267864 0.01054991]
[ 0.02267864 0.04875119 0.06291796 0.04875119 0.02267864]
[ 0.0292689 0.06291796 0.0812015 0.06291796 0.0292689 ]
[ 0.02267864 0.04875119 0.06291796 0.04875119 0.02267864]
[ 0.01054991 0.02267864 0.0292689 0.02267864 0.01054991]]
rank = np.linalg.matrix_rank(kernel)
if rank == 1:
print('The Kernel is separable')
else:
print('The kernel is not separable')
然后,我将以上两个内核相乘以得到原始内核。但是我没有明白。
u,s,v = np.linalg.svd(kernel)
k1 = (u[:,0] * np.sqrt(s[0]))[np.newaxis].T
k2 = v[:,0] * np.sqrt(s[0])
我认为我尝试使用svd进行进一步的分离是不正确的。一些解释会有所帮助。
答案 0 :(得分:0)
矩阵等级1表示所有行都是零,或者直到缩放为止都是相同的,并且对于列也是如此。它们还可以扩展到等于这两个因素。 因此,您可以使用类似
的方法恢复它们[XamlCompilation(XamlCompilationOptions.Compile)]
[DesignTimeVisible(true)]
[Category("Appearance")]
请注意,大多数复杂性来自于我尝试对尽可能多的数据求平均。一个简单的方法,但我认为从数值上讲,它不是稳定的方法
I,J = np.unravel_index(np.abs(kernel).argmax(), kernel.shape)
f1 = np.nansum(kernel / (kernel[None,:,J]@kernel),1,keepdims=True)
f2 = np.nansum(kernel / (kernel@kernel[I,:,None]),0,keepdims=True)
scaling = np.sqrt(np.abs(kernel).sum()/np.abs(f1*f2).sum())
f1 *= scaling * np.sign(f1[I,0]) * np.sign(kernel[I,J])
f2 *= scaling * np.sign(f2[0,J])
当然,一旦正确建立索引,您的方法也将起作用:
I,J = np.unravel_index(np.abs(kernel).argmax(), kernel.shape)
f1 = kernel[:,J,None]
f2 = kernel[None,I,:] / kernel[I,J]