Как применить разные веса к разным размерам для расстояния метри c в python? - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь изменить расстояние Минковского, которое может быть либо евклидовым, либо манхэттенским, в котором каждое измерение может быть взвешено по-разному. Я видел сообщения, которые дают ответ, используя scipy, который, кажется, отвечает на немного другой вопрос. В моем случае мое расстояние metri c будет иметь только 2 измерения, и я хочу иметь возможность контролировать веса для каждого измерения.

Он - то, что я имею сейчас. Я хотел бы найти более грубый / грубый способ сделать это:

t1 = np.array([2,4])
t2 = np.array([1,2])

def weighted_minkowski(t1,t2,w = .3, p = 2):
    return np.sqrt(w*((t1[0]-t2[0])**p)+(1-w)*((t1[1]-t2[1])**p))

1 Ответ

0 голосов
/ 02 марта 2020

Вы можете сделать:

def weighted_minkowski(t1, t2, w=.3, p=2):
    return np.sqrt([w, 1-w] @ (t1 - t2)**p)

Объяснение: сформируйте весовой вектор [w, 1-w] и возьмите его произведение на точечное с разностью двух векторов, увеличенной до p-й степени.

Я предполагаю Python 3.5 или новее, у которого есть оператор умножения матриц @. Применительно к векторам это дает скалярное произведение. В более ранних Python версиях вы можете использовать np.dot.

...