pyspark MinHashL SH Расстояние Jaccard: не рассчитывается расстояние для некоторых пар - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь вычислить расстояние Жакара между некоторыми продуктами, используя 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, и получил те же результаты, кроме пар Пако, которые пропускают:

введите описание изображения здесь

Как получить также пары Пако? и почему я их не получил?

Спасибо

1 Ответ

0 голосов
/ 15 января 2020

Извините, это был я, который показывает только первые 20, когда я собираю все, я получаю результат, я подниму этот пример игрушки здесь, так как не было

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...