Преобразование вывода "центров" KMeans в фрейм данных PySpark - PullRequest
0 голосов
/ 01 июля 2019

Я использую модель кластеризации K-средних и хочу проанализировать центроиды кластеров, однако вывод центров представляет собой СПИСОК моих 20 центроидов с их координатами (по 8 каждый) в виде массива. Он мне нужен как информационный кадр, с кластерами 1:20 в виде строк и значениями их атрибутов (координаты центроида) в виде столбцов, например:

c1 | 0.85 | 0.03 | 0.01 | 0.00 | 0.12 | 0.01 | 0.00 | 0.12 
c2 | 0.25 | 0.80 | 0.10 | 0.00 | 0.12 | 0.01 | 0.00 | 0.77
c3 | 0.05 | 0.10 | 0.00 | 0.82 | 0.00 | 0.00 | 0.22 | 0.00

Формат данных очень важен, потому что я ХОЧУ сделать:

Для каждого центроида Определите 3 самых сильных атрибута Создайте «имя» для каждого из 20 центроидов, которое является объединением 3 наиболее доминирующих черт в этом центроиде

Например:

c1 | milk_eggs_cheese
c2 | meat_milk_bread
c3 | toiletries_bread_eggs

Этот код работает в Zeppelin, EMR версии 5.19, Spark2.4. Модель отлично работает, но это стандартный код из документации Spark (https://spark.apache.org/docs/latest/ml-clustering.html#k-means),, который выдает список вывода массивов, который я не могу реально использовать.

centers = model.clusterCenters()
print("Cluster Centers: ")
for center in centers:
    print(center)

Это отрывок из вывода, которое я получаю.

Cluster Centers: 
[0.12391775 0.04282062 0.00368751 0.27282358 0.00533401 0.03389095
 0.04220946 0.03213536 0.00895981 0.00990327 0.01007891]
[0.09018751 0.01354349 0.0130329  0.00772877 0.00371508 0.02288211
 0.032301   0.37979978 0.002487   0.00617438 0.00610262]
[7.37626746e-02 2.02469798e-03 4.00944473e-04 9.62304581e-04
 5.98964859e-03 2.95190585e-03 8.48736175e-01 1.36797882e-03
 2.57451073e-04 6.13320072e-04 5.70559278e-04]

На основе Как преобразовать список массива в фрейм данных Spark Я пробовал это:

df = sc.parallelize(centers).toDF(['fresh_items', 'wine_liquor', 'baby', 'cigarettes', 'fresh_meat', 'fruit_vegetables', 'bakery', 'toiletries', 'pets', 'coffee', 'cheese'])
df.show()

Но это выдает следующую ошибку:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

1 Ответ

0 голосов
/ 01 июля 2019

model.clusterCenters() дает вам список пустых массивов, а не список списков, как в ответе, который вы связали. Просто преобразуйте числовые массивы в списки перед созданием кадра данных:

bla = [e.tolist() for e in centers]
df = sc.parallelize(bla).toDF(['fresh_items', 'wine_liquor', 'baby', 'cigarettes', 'fresh_meat', 'fruit_vegetables', 'bakery', 'toiletries', 'pets', 'coffee', 'cheese'])
#or df = spark.createDataFrame(bla, ['fresh_items', 'wine_liquor', 'baby', 'cigarettes', 'fresh_meat', 'fruit_vegetables', 'bakery', 'toiletries', 'pets', 'coffee', 'cheese']
df.show()

...