Я пытаюсь вычислить расстояние Жакара между некоторыми продуктами, используя MinHashL SH pyspark.
Используемые мной данные игрушек
sdf = spark.read.csv('dt.csv',header=True, sep=',', inferSchema=True)
sdf = sdf.withColumn("ticket", sdf["ticket"].cast(StringType()))
sdf.show(60)
ticket| Brand|value|
+------+--------+-----+
| 0| YL | 1|
| 1| YL | 1|
| 2| YL | 1|
| 3| YL | 1|
| 7| YL | 1|
| 3| Paco | 1|
| 7| Paco | 1|
| 0|Lacoste | 1|
| 1|Lacoste | 1|
| 2|Lacoste | 1|
| 4|Lacoste | 1|
| 5|Lacoste | 1|
| 6|Lacoste | 1|
| 0| Dior | 1|
| 4| Dior | 1|
| 4| Boss | 1|
| 5| Boss | 1|
| 6| Boss | 1|
| 0|Channel | 1|
| 1|Channel | 1|
| 4|Channel | 1|
| 8| Boss | 1|
| 8|Channel | 1|
+------+--------+-----+
Поэтому я хочу вычислить расстояние Жакара между этими брендами, поэтому я следую примеру в документации:
order_matrix_jaccard_sdf = sdf.groupby('Brand').agg(F.collect_set('ticket'))
order_matrix_jaccard_sdf = order_matrix_jaccard_sdf.withColumnRenamed('collect_set(ticket)', 'ticket')
order_matrix_jaccard_sdf.show()
Out put:
+--------+------------------+
| Brand| ticket|
+--------+------------------+
|Channel | [1, 8, 4, 0]|
| Paco | [3, 7]|
|Lacoste |[1, 2, 5, 4, 6, 0]|
| YL | [3, 1, 2, 7, 0]|
| Boss | [5, 8, 4, 6]|
| Dior | [4, 0]|
+--------+------------------+
Затем примените модель:
cv = CountVectorizer(inputCol='ticket', outputCol="features")
model = cv.fit(order_matrix_jaccard_sdf)
result = model.transform(order_matrix_jaccard_sdf)
mh = MinHashLSH(inputCol="features", outputCol="hashes")
model_mh = mh.fit(result)
model_mh.transform(result)
Затем рассчитайте расстояние Жакара:
jaccard_dist = model_mh.approxSimilarityJoin(result.select(['Brand','features']), result.select(['Brand','features']), 2)
jaccard_dist.show(20)
+--------------------+--------------------+------------------+
| datasetA| datasetB| distCol|
+--------------------+--------------------+------------------+
|[Lacoste , (9,[0,...|[Dior , (9,[0,1],...|0.6666666666666667|
|[Dior , (9,[0,1],...|[Lacoste , (9,[0,...|0.6666666666666667|
|[Lacoste , (9,[0,...|[Lacoste , (9,[0,...| 0.0|
|[Dior , (9,[0,1],...|[Channel , (9,[0,...| 0.5|
|[YL , (9,[0,2,3,4...|[YL , (9,[0,2,3,4...| 0.0|
|[YL , (9,[0,2,3,4...|[Channel , (9,[0,...|0.7142857142857143|
|[Boss , (9,[1,5,6...|[Boss , (9,[1,5,6...| 0.0|
|[YL , (9,[0,2,3,4...|[Lacoste , (9,[0,...| 0.625|
|[Lacoste , (9,[0,...|[YL , (9,[0,2,3,4...| 0.625|
|[Channel , (9,[0,...|[Channel , (9,[0,...| 0.0|
|[Dior , (9,[0,1],...|[Dior , (9,[0,1],...| 0.0|
|[Dior , (9,[0,1],...|[YL , (9,[0,2,3,4...|0.8333333333333334|
|[Lacoste , (9,[0,...|[Channel , (9,[0,...|0.5714285714285714|
|[Channel , (9,[0,...|[Dior , (9,[0,1],...| 0.5|
|[Channel , (9,[0,...|[YL , (9,[0,2,3,4...|0.7142857142857143|
|[YL , (9,[0,2,3,4...|[Dior , (9,[0,1],...|0.8333333333333334|
|[Channel , (9,[0,...|[Lacoste , (9,[0,...|0.5714285714285714|
|[Paco , (9,[3,4],...|[Paco , (9,[3,4],...| 0.0|
+--------------------+--------------------+------------------+
В нем отсутствуют пары с 'Paco', я рассчитал расстояние, используя pandas, и получил те же результаты, кроме пар Пако, которые пропускают:
введите описание изображения здесь
Как получить также пары Пако? и почему я их не получил?
Спасибо