Я пытаюсь сгруппировать набор продуктов по тому, насколько они различаются , а не по тому, насколько они похожи.
То есть, если Product1 продается на неделе 1, а не продается на неделе 2, я хочу связать его с продуктом, который не продается на неделе 1, но продается на неделе 2.
В качестве конечного продукта я хотел бы представить кластерную карту seaborn, которая иллюстрирует обратную связь между продуктами.
Я пытался использовать обратное евклидово расстояние в качестве метрики кластеризации, а не евклидово расстояние. для достижения этой задачи.
Пример кода ниже:
import numpy as np
import seaborn as sns
import pandas as pd
np.random.seed(0)
a = np.random.randint(2,size=(5,10))
Примерный фрейм данных. Пять продуктов с 10-недельными данными. 1 = продажа, 0 = нет продажи
df = pd.DataFrame(a,
index='Product1 Product2 Product3 Product4 Product5'.split(),
columns=np.arange(1,11))
Определение метрики расстояния, обратного евклидовому расстоянию:
invEucl = lambda u, v: 1 / np.sqrt(((u-v)**2).sum())
Сравнить кластерные карты, евклидово и обратное:
sns.clustermap(df,col_cluster=False)
sns.clustermap(df,
col_cluster=False,
metric=invEucl)
Результаты, похоже, работают графически, с кластерной картой, объединяющей разнородные элементы, но я хочу подтвердить, что использование чего-то вроде обратного евклидова расстояния целесообразно.
Если это так, знаете ли вы какую-либо литературу, в которой используется подобный подход?
Если нет, существуют ли какие-либо метрики, подходящие для этого типа анализа?
По сути, я ищу показатель, который назначит меньшее расстояние для векторов, которые наименее похожи.