给定五个现有矢量,如何找到一个新的等距矢量?

时间:2019-04-26 02:15:11

标签: python numpy vector vectorization linear-algebra

我有向量v1,v2,v3,v4,v5,具有100个暗角,我需要找到一个中心向量,每个向量之间的距离相等。

更新:从Mathmatics看this answer,有没有办法在Numpy / Python中实现该解决方案?

1 个答案:

答案 0 :(得分:3)

一切都取决于向量在Python中的呈现方式。

v1,v2,...,v5表示为值列表。每个列表的len = 100。

在这种情况下,我将执行以下操作:

np.vstack([v1, v2, v3, v4, v5]).mean(axis=1)

如果向量已经由5x100数组组成,例如arrarr.shape=(5, 100), 您可以按照以下方法获得解决方案:

arr.mean(axis=1)

编辑:[问题已更改/澄清]

要获得等距向量(x),请查看我刚刚编写的以下代码段:

import numpy as np
from scipy.optimize import least_squares

np.random.seed(10)
vector_as_rows = np.random.rand(5, 100)

def Q(x, vs=vector_as_rows):
    d = x[-1]
    result = list()
    for v in vs:
        result.append(np.linalg.norm(v-x[:-1])- d)
    result.append(0)
    return result

res = least_squares(Q, np.random.rand(101)).x

for v in vector_as_rows:
    print("Dist between x and v[k]: ", np.linalg.norm(v - res[:-1]))

因此,res[:-1](len = 100)与所有v[i]等距; res[-1]是距离值。

Dist between x and v[k]:  2.530871535402036
Dist between x and v[k]:  2.530871505069009
Dist between x and v[k]:  2.530871545163243
Dist between x and v[k]:  2.5308715299141045
Dist between x and v[k]:  2.5308715309178402

我怀疑该问题具有解决方案;我刚刚实施 解决不确定线性系统的一种可能方法是 您提供的链接。

A = (vector_as_rows[0] - vector_as_rows[1:]) * 2
res = np.dot(np.linalg.pinv(A), (vector_as_rows[0]**2 - vector_as_rows[1:]**2).sum(axis=1))
for v in vector_as_rows:
    print("Dist between x and v[k]: ", np.linalg.norm(v - res))

结果是:

Dist between x and v[k]:  5.569005123058085
Dist between x and v[k]:  5.569005123058085
Dist between x and v[k]:  5.569005123058084
Dist between x and v[k]:  5.569005123058084
Dist between x and v[k]:  5.569005123058085

我使用了np.linalg.pinv,即Moore-Penrose伪反转。使用它,我为不确定的线性系统得到了最小长度的解决方案。因此,获得的向量res具有针对该问题的所有可能解的最小范数。