Я использую модель кластеризации 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()