如何基于gram-matrix在python中实现从距离矩阵中查找点的坐标?

M_L_Sing_Jump_Rap

我想研究公交车站优化问题。但是,我现在停留在如何将距离矩阵转换为点的真实坐标上。

我已经浏览了很多种源并使用公式已知:M(I,J)= 0.5(d(1,j)的^ 2 + d(I,1)^ 2 - d(I,J)^ 2)*以解决问题在此处输入链接描述我数学不好,我只想实现它。

首先,我尝试理解数学原理,这是我的解决方案。在此处输入链接说明

然后,对于以下示例,我想使用python实现该算法。这是我的矩阵,代表每个公交车站的不同距离。我想将其传输到点的坐标。

在此处输入图片说明

这是我实现的代码:

import csv
import numpy as np
import math

class csv_util():

    def generate_coordinate_point(self):
        '''transfer the distance matrix to the real coordinate points'''
        sqrt_result = 2*math.sqrt(2)

        matrix = np.array([[0,2,2,sqrt_result],[2,0,sqrt_result,2],[2,sqrt_result,0,2],[sqrt_result,2,2,0]])

        gram_matrix = self.calculate_gram_matrix(matrix)

        a, b = np.linalg.eig(gram_matrix)

        #b = b.astype(np.int16)
        a = a.astype(np.int16)


        eigen_vector = format(b)

        length = a.size
        tmp_matrix = np.zeros(length * length)
        random_point_matrix = tmp_matrix.reshape(length, length)

        for item1 in range(length):
            random_point_matrix[item1][item1] = a[item1]

        print("the eigen-value is: " + format(random_point_matrix))
        print("the eigen-vector is: " + eigen_vector)

        new_matrix = (np.sqrt(random_point_matrix))*b

        print("the coordinate points: "+format(new_matrix))



    def calculate_gram_matrix(self,matrix):
        '''get the gram matrix for transfer to the coordinate points'''

        length = matrix[0].size
        tmp_matrix = np.zeros(length*length)
        gram_matrix = tmp_matrix.reshape(length,length)

        for item1 in range(length):
            for item2 in range(length):
                gram_matrix[item1][item2] = (math.pow(matrix[0][item2],2)+math.pow(matrix[0][item1],2)-math.pow(matrix[item1][item2],2))/2
                if gram_matrix[item1][item2]<0.1 and gram_matrix[item1][item2]>-0.1:
                    gram_matrix[item1][item2] = 0

        return gram_matrix

但是,最终矩阵的结果不正确。结果如下:

the eigen-value is: [[12.  0.  0.  0.]
 [ 0.  0.  0.  0.]
 [ 0.  0.  4.  0.]
 [ 0.  0.  0.  0.]]
-------------
the eigen-vector is: [[ 0.00000000e+00  0.00000000e+00  0.00000000e+00  1.00000000e+00]
 [ 4.08248290e-01 -5.77350269e-01 -7.07106781e-01  0.00000000e+00]
 [ 4.08248290e-01 -5.77350269e-01  7.07106781e-01  0.00000000e+00]
 [ 8.16496581e-01  5.77350269e-01  1.57009246e-16  0.00000000e+00]]
-------------
the coordinate points: [[ 0.          0.          0.          0.        ]
 [ 0.         -0.         -0.          0.        ]
 [ 0.         -0.          1.41421356  0.        ]
 [ 0.          0.          0.          0.        ]]

最后一点是这样的:[0,0],[-0.0,-0.0],[-0.0、1.414421],[0.0,0.0]。在此示例中,他们对距离矩阵不满意。请帮助我如何获得正确的分数。谢谢!

未来学家

通常,构建与距离矩阵关联的点积的Gram矩阵及其进一步的因式分解是一种很好的方法,它还可以让您推断距离矩阵的坐标实现的维数。但是,如果在您的情况下,实现是平面的(二维),那么我认为(以某种方式)更简单地(更可能更快)地以几何方式接近它(同样,您应该确定距离矩阵是2D点):

import numpy as np
import math

def x_coord_of_point(D, j):
    return ( D[0,j]**2 + D[0,1]**2 - D[1,j]**2 ) / ( 2*D[0,1] )

def coords_of_point(D, j):
    x = x_coord_of_point(D, j)
    return np.array([x, math.sqrt( D[0,j]**2 - x**2 )])
    
def calculate_positions(D):
    (m, n) = D.shape
    P = np.zeros( (n, 2) )
    tr = ( min(min(D[2,0:2]), min(D[2,3:n])) / 2)**2
    P[1,0] = D[0,1]
    P[2,:] = coords_of_point(D, 2)
    for j in range(3,n):
        P[j,:] = coords_of_point(D, j) 
        if abs( np.dot(P[j,:] - P[2,:], P[j,:] - P[2,:]) - D[2,j]**2 ) > tr:
            P[j,1] = - P[j,1]
    return P 
    
sqrt_result = 2*math.sqrt(2)
D = np.array([[0, 2, 2, sqrt_result],
              [2, 0, sqrt_result, 2], 
              [2, sqrt_result, 0, 2], 
              [sqrt_result, 2, 2, 0]])

P = calculate_positions(D)
print(P)
     

您可能需要添加一些检查和改进,以确保向量P [1 ,:]和P [2 ,:]不对齐,这等效于检查

abs( P[1,0]*P[2,1] - P[1,1]*P[2,0] ) < 0.0001 (or some more appropriate threshold)

如果是,则只需执行while循环,直到找到与P[j0, :]不对齐的第一个向量P[1,0]该第一个向量的作用P[j0,:]与初始向量不符,P[1,:]您可以在中使用一个有用的if子句function vector(D)我没有包含它,以免混淆代码的思想。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

R-如何在特定轮廓中查找点

来自分类Dev

如何基于大文本提取字符n-gram

来自分类Dev

R如何提取基于n-gram的行

来自分类Dev

python如何从scipy压缩距离矩阵中获得适当的距离值

来自分类Dev

如何在Scipy Python稀疏矩阵中实现CSR_Matrix的循环排列(左右移位)?

来自分类Dev

基于Matlab / Octave中坐标值的点的分段矩阵

来自分类Dev

使用基本矩阵和基本矩阵从经过校准的立体摄像机中查找点的真实世界坐标

来自分类Dev

Python中基于令牌的编辑距离?

来自分类Dev

如何将基于“无”距离的 Dijsktra 算法的 Python 实现转换为“无限”距离

来自分类Dev

如何在python nltk中获取n-gram搭配和关联?

来自分类Dev

如何基于xy坐标在Javascript中以编程方式单击按钮

来自分类Dev

如何使用KDTree.query_ball_tree在x,y网格中查找点集

来自分类Dev

如何改进此算法以优化运行时间(分段中的查找点)

来自分类Dev

如何基于坐标获取元素

来自分类Dev

在Matlab中沿弧距离查找点的位置

来自分类Dev

如何使用Wikipedia API在坐标中包含距离?

来自分类Dev

如何使用循环从数组中检索多个坐标之间的距离?

来自分类Dev

如何在svg中查找文本的坐标?

来自分类Dev

如何从平移旋转中查找新坐标

来自分类Dev

如何实现基于树的QComboBox

来自分类Dev

如何实现基于树的QComboBox

来自分类Dev

如何在UITableView单元格中实现从左向右滑动,类似于iOS Mail

来自分类Dev

我如何在Lisp中创建一个函数来实现从右到左的lambda

来自分类Dev

如何在MVC4 Razor中实现从属下拉列表

来自分类Dev

如何在cython中实现从C结构到int的C ++映射?

来自分类Dev

如何在QProgressBar中实现从“忙”类模式到标准进度模式的转换?

来自分类Dev

如何在 Hybris 5.7 中实现从店面兑换优惠券?

来自分类Dev

如何实现从 Futures 0.2 中的另一个线程唤醒的 Future?

来自分类Dev

如何基于计算对矩阵中的值进行重新编码?

Related 相关文章

  1. 1

    R-如何在特定轮廓中查找点

  2. 2

    如何基于大文本提取字符n-gram

  3. 3

    R如何提取基于n-gram的行

  4. 4

    python如何从scipy压缩距离矩阵中获得适当的距离值

  5. 5

    如何在Scipy Python稀疏矩阵中实现CSR_Matrix的循环排列(左右移位)?

  6. 6

    基于Matlab / Octave中坐标值的点的分段矩阵

  7. 7

    使用基本矩阵和基本矩阵从经过校准的立体摄像机中查找点的真实世界坐标

  8. 8

    Python中基于令牌的编辑距离?

  9. 9

    如何将基于“无”距离的 Dijsktra 算法的 Python 实现转换为“无限”距离

  10. 10

    如何在python nltk中获取n-gram搭配和关联?

  11. 11

    如何基于xy坐标在Javascript中以编程方式单击按钮

  12. 12

    如何使用KDTree.query_ball_tree在x,y网格中查找点集

  13. 13

    如何改进此算法以优化运行时间(分段中的查找点)

  14. 14

    如何基于坐标获取元素

  15. 15

    在Matlab中沿弧距离查找点的位置

  16. 16

    如何使用Wikipedia API在坐标中包含距离?

  17. 17

    如何使用循环从数组中检索多个坐标之间的距离?

  18. 18

    如何在svg中查找文本的坐标?

  19. 19

    如何从平移旋转中查找新坐标

  20. 20

    如何实现基于树的QComboBox

  21. 21

    如何实现基于树的QComboBox

  22. 22

    如何在UITableView单元格中实现从左向右滑动,类似于iOS Mail

  23. 23

    我如何在Lisp中创建一个函数来实现从右到左的lambda

  24. 24

    如何在MVC4 Razor中实现从属下拉列表

  25. 25

    如何在cython中实现从C结构到int的C ++映射?

  26. 26

    如何在QProgressBar中实现从“忙”类模式到标准进度模式的转换?

  27. 27

    如何在 Hybris 5.7 中实现从店面兑换优惠券?

  28. 28

    如何实现从 Futures 0.2 中的另一个线程唤醒的 Future?

  29. 29

    如何基于计算对矩阵中的值进行重新编码?

热门标签

归档