Как найти новый эквидистантный вектор, учитывая пять существующих векторов? - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть векторы v1, v2, v3, v4, v5, со значением 100 dim, мне нужно найти центральный вектор, который будет иметь равное расстояние с каждым.

Uptdate: Глядя на этот ответ от Mathmatics, есть ли способ реализовать решение в Numpy / Python?

1 Ответ

3 голосов
/ 26 апреля 2019

Все зависит от того, как векторы представлены в Python.

Позволяет v1, v2, ..., v5 представляются в виде списков значений. Каждый список имеет len = 100.

В этом случае я бы сделал следующее:

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

Если векторы уже составлены как массив 5x100, например, arr, arr.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, то есть псевдообращение Мура-Пенроуза. Используя его, я получил решение с минимальной длиной для неопределенной линейной системы. Итак, полученный вектор res имеет наименьшую норму из всех возможных решений этой задачи.

...