Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matrix 给定距离矩阵求中心点_Matrix_Computer Vision_Distance_Mathematical Optimization_Numerical Methods - Fatal编程技术网

Matrix 给定距离矩阵求中心点

Matrix 给定距离矩阵求中心点,matrix,computer-vision,distance,mathematical-optimization,numerical-methods,Matrix,Computer Vision,Distance,Mathematical Optimization,Numerical Methods,我有一个矩阵(实际上是一个加载的图像),其中每个元素都是距离某个未知中心点的L2距离 这里有一个简单的例子 A = [1.4142 1.0000 1.4142 2.2361] [1.0000 0.0000 1.0000 2.0000] [1.4142 1.0000 1.4142 2.2361] 在这种情况下,中心显然位于坐标(1,1)(0索引矩阵或2D数组中的索引A[1,1]) 然而,在我的中心不被限制为整数索引的情况下,它就不再那么明显了。例如,给定此矩阵B

我有一个矩阵(实际上是一个加载的图像),其中每个元素都是距离某个未知中心点的L2距离

这里有一个简单的例子

A = [1.4142  1.0000  1.4142  2.2361]
    [1.0000  0.0000  1.0000  2.0000]
    [1.4142  1.0000  1.4142  2.2361]
在这种情况下,中心显然位于坐标(1,1)(0索引矩阵或2D数组中的索引A[1,1])

然而,在我的中心不被限制为整数索引的情况下,它就不再那么明显了。例如,给定此矩阵
B
,我的中心坐标在哪里

B = [3.0292  1.9612  2.8932  5.8252]
    [1.2292  0.1612  1.0932  4.0252]
    [1.4292  0.3612  1.2932  4.2252]
您如何发现本例中的答案位于第1.034行和第1.4列

我知道解决方案(有),但有没有更有效的方法(例如,没有矩阵求逆的方法)


这个问题有点像语言不可知论,因为我正在寻找更多的算法帮助。如果你能坚持MATLAB,Python,或者C++,在一个解决方案中,那将是非常好的;-)p> 虽然没有类似任务的经验,但我读了一些东西,也尝试了一些东西

当我不熟悉这个主题时,似乎很难理解,而且我找到的所有资源都有点混乱

对我来说,理论上还不清楚:

-----
PROBLEM
-------
real x:  [ 1.25106601  2.16097348]
dist mat:  [[ 2.444  1.599  1.348  1.276  2.399  3.026  4.07   4.973  6.118  6.746
   2.143  1.149  0.412  0.766  1.839  2.762  3.851  4.904  5.734  6.958
   2.377  1.432  0.856  1.056  1.973  2.843  3.885  4.95   5.818  6.84
   2.711  2.015  1.689  1.939  2.426  3.358  4.385  5.22   6.076  6.97
   3.422  3.153  2.759  2.81   3.326  4.162  4.734  5.627  6.484  7.336]]
cost with real_x (check vs. noisy):  0.665125233772
-----
SOLVE
-----
SOCP RELAX SOL:  [[ 1.95749275  2.00607253]]
NLP SOL:  [ 1.23560791  2.16756168]
  • 如上所述的问题是一个凸优化问题(局部最小值=全局最小值;意味着可以使用强大的解算器!)
    • 关于更一般的问题(传感器网络)有更多的资源 本地化),这是非凸的,并且已经开发出非常复杂的方法
  • 您的三边测量方法是否能够利用>3个点(三边测量与多边测量;至少这段代码看起来不可能,这意味着:噪声性能差!)
这里有两种方法的示例代码:

-----
PROBLEM
-------
real x:  [ 1.25106601  2.16097348]
dist mat:  [[ 2.444  1.599  1.348  1.276  2.399  3.026  4.07   4.973  6.118  6.746
   2.143  1.149  0.412  0.766  1.839  2.762  3.851  4.904  5.734  6.958
   2.377  1.432  0.856  1.056  1.973  2.843  3.885  4.95   5.818  6.84
   2.711  2.015  1.689  1.939  2.426  3.358  4.385  5.22   6.076  6.97
   3.422  3.153  2.759  2.81   3.326  4.162  4.734  5.627  6.484  7.336]]
cost with real_x (check vs. noisy):  0.665125233772
-----
SOLVE
-----
SOCP RELAX SOL:  [[ 1.95749275  2.00607253]]
NLP SOL:  [ 1.23560791  2.16756168]
  • A:凸优化:SOCP松弛
    • 跟随
    • 性能不令人印象深刻,但作为大数据的近似值,应该是强大的
    • 保证这种放松的全局最优
    • 实施
  • B:非线性规划优化
    • 使用scipy.optimize实现
    • 我的合成实验非常完美;即使在嘈杂的情况下效果也很好;尽管我们使用的是数值微分(这里很难使用自动微分)
一些补充说明:

-----
PROBLEM
-------
real x:  [ 1.25106601  2.16097348]
dist mat:  [[ 2.444  1.599  1.348  1.276  2.399  3.026  4.07   4.973  6.118  6.746
   2.143  1.149  0.412  0.766  1.839  2.762  3.851  4.904  5.734  6.958
   2.377  1.432  0.856  1.056  1.973  2.843  3.885  4.95   5.818  6.84
   2.711  2.015  1.689  1.939  2.426  3.358  4.385  5.22   6.076  6.97
   3.422  3.153  2.759  2.81   3.326  4.162  4.734  5.627  6.484  7.336]]
cost with real_x (check vs. noisy):  0.665125233772
-----
SOLVE
-----
SOCP RELAX SOL:  [[ 1.95749275  2.00607253]]
NLP SOL:  [ 1.23560791  2.16756168]
  • 在我看来,你的例子B肯定有一些(相当糟糕的)噪音或其他一些问题,因为我的方法是完全错误的;而方法B特别适合我的合成数据(至少这是我的印象)
代码:

-----
PROBLEM
-------
real x:  [ 1.25106601  2.16097348]
dist mat:  [[ 2.444  1.599  1.348  1.276  2.399  3.026  4.07   4.973  6.118  6.746
   2.143  1.149  0.412  0.766  1.839  2.762  3.851  4.904  5.734  6.958
   2.377  1.432  0.856  1.056  1.973  2.843  3.885  4.95   5.818  6.84
   2.711  2.015  1.689  1.939  2.426  3.358  4.385  5.22   6.076  6.97
   3.422  3.153  2.759  2.81   3.326  4.162  4.734  5.627  6.484  7.336]]
cost with real_x (check vs. noisy):  0.665125233772
-----
SOLVE
-----
SOCP RELAX SOL:  [[ 1.95749275  2.00607253]]
NLP SOL:  [ 1.23560791  2.16756168]
将numpy导入为np
将cvxpy作为cvx导入
从scipy.spatial.distance导入cdist
从scipy.optimize导入最小化
np.随机种子(1)
“”“创建无噪音(不再是!)假问题”“”
实x=np.random.random(大小=2)*3
M、 N=5,10
噪声距离=0.1
pos=np.数组([(i,j)表示范围内的i(M)表示范围内的j(N)])#丑陋->平铺/重复/堆叠
real_x_stacked=np.vstack([real_x表示范围内的i(位置形状[0]))
Y=cdist(位置,实坐标x[np.newaxis])
Y+=np.random.normal(大小=Y.shape)*噪波距离#让我们添加一些噪波!
打印('----')
打印('问题')
打印('----')
打印('real x:',real_x)
打印('dist mat:',np.圆形(Y,3.T)
“助手”
def成本(x、Y、pos):
res=np.linalg.norm(pos-x,ord=2,axis=1)-Y.ravel()
返回np.linalg.norm(第2条)
打印(‘实际成本(支票与噪音):’,成本(实际成本,Y,pos))
“”“解算器SOCP”“”
def solve_socp_relax(位置Y):
x=cvx.变量(2)
y=cvx.变量(位置形状[0])
伪_堆栈=[x代表范围内的i(位置形状[0])]#hacky
目标=cvx.sum_条目(cvx.norm(y-y))
x_堆叠=cvx.重塑(cvx.vstack(*假_堆叠),位置形状[0],2)#粗糙

约束=[cvx.norm(pos-x_,2,axis=1)如果我理解正确,你有一个矩阵a,其中a[I,j]表示从(I,j)到某个未知点(y,x)的距离。你可以这样找到(y,x):

将A的每个元素平方,形成矩阵B。 然后我们想找到(y,x)so

从0,0方程中减去每个方程并重新排列:

2*i*y + 2*j*x = B[0,0] + i*i + j*j - B[i,j]

这可以通过线性最小二乘法来解决。注意,由于有2个未知数,matix反演(更好,因子分解)所涉及的将是2x2矩阵,因此不需要花费时间。事实上,只要给定a的维数,你就可以通过分析计算出所需的矩阵及其逆矩阵。

a或B中的值是精确值还是有噪声?它们可以被视为相当精确,因为正如sascha也提到的那样,B似乎是“错误的”。而a是ob非常正确,给定中心点的B应该是[[1.74044707 1.10867308 1.19547313 1.90503438][1.4004128 0.4014424 0.60096256 1.60036121][1.70092798 1.04554101.13717017 1.86899866]@JulianS.:B绝对正确——我计算了这些距离,给出了(1.034,1.4)的真实值我想混淆的可能是你假设的是同一个中心?编辑:好吧,该死。我有一个打字错误——我把它改成了正确的公式“我的中心不受约束…”我想我知道怎么回事:B中的值是平方的,所以你忘了取sqrt()。它在a中是正确的,但在B中不是。