【问题标题】:Euclidian Distance of Two (Non-traditional) Vectors in PythonPython中两个(非传统)向量的欧几里得距离
【发布时间】:2015-02-20 14:18:44
【问题描述】:

我有两个非传统向量,我想计算它们之间的欧几里得距离。向量设置如下:

line1 = '2:20 3:20 5:10 6:10 10:20'
line2 = '1:18 2:20 4:10 6:10 8:20 9:10 10:10'

对于每个元素,第一个数字是向量中的位置,第二个数字是值(例如,2:20 表示向量中的第 2 个元素,值为 20)。所以 line1 的向量是 (0,20,20,0,10,10,0,0,0,20) 而 line2 的向量是 (18,20,0,10,0,10,0,20, 10,10)。

我编写了以下程序,效果很好。问题是我有巨大的向量,我想将它们与数千个其他向量进行比较。当我尝试像这样运行它时,我的计算机开始出现内存错误。有没有办法计算以这种方式设置的两个向量之间的欧几里得距离,而无需实际创建长向量(有许多 0 条目)?

def vec_line(line):
    vector = [0]*10
    datapoints = line.split(' ')
    for d,datapoint in enumerate(datapoints):
        element = int(datapoint.split(':')[0])
        value = float(datapoint.split(':')[1])
        vector[element-1]=value

    npvec = np.array(vector)
    return npvec

vector1 = vec_line(line1)
vector2 = vec_line(line2)

dist = np.linalg.norm(vector1-vector2)
print dist
--> [39.0384425919]

【问题讨论】:

    标签: python out-of-memory distance


    【解决方案1】:

    您的“非传统”向量通常称为“稀疏向量”(或通常称为“稀疏矩阵”)。 Scipy 有 a package 来创建它们并对它们执行代数运算。

    这里或多或少是你想要的:

    import numpy as np
    from scipy.sparse import csr_matrix
    
    
    def parse_sparse_vector(line):
        tokens = line.split()
        indexes = []
        values = []
        for token in tokens:
            index, value = token.split(':')
            index = int(index)
            value = int(value)
            indexes.append(index)
            values.append(value)
        return csr_matrix((values, ([0] * len(indexes), indexes)))
    
    v = parse_sparse_vector(line1)
    w = parse_sparse_vector(line2)
    dist = v - w
    # avoiding a cast to dense matrix:
    np.sqrt(dist.dot(dist.T).sum())
    ## result is 39.038442591886273
    

    【讨论】:

    • 非常感谢您帮助我。我不知道这些被称为稀疏向量,所以这很有帮助。我的代码得到了不同的欧几里得距离。我得到 39.0384425919。我会看看我是否能弄清楚差异在哪里。再次感谢!
    • @myname 不客气 :) 检查 sn-p 的最新版本,我刚刚想出了如何避免在任何地方转换为密集矩阵。另外,我真的不能说这是否能解决你所有的效率需求:做很多成对距离是,嗯,O(n^2)
    • 刚刚发现了不同。我认为您的意思是写 value = int(value),而不是 value = int(index)。再次感谢!
    • 我刚刚发现了同样的错误并更正了sn-p,结果。现在只存在精度上的差异。
    猜你喜欢
    • 2014-05-31
    • 2018-09-09
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多