Python: Как перебрать каждую комбинацию из двух столбцов из фрейма данных, имеющего несколько столбцов для кластеризации? - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть оригинальный фрейм данных (объем, купленный каждым покупателем для разных продуктов), имеющий несколько столбцов, как показано ниже:

Пожалуйста, нажмите здесь, чтобы посмотреть пример кадра данных

Моя цель - сделать кластеризацию для каждых двух продуктов из исходного кадра данных. для простоты я попытался взять один случай для кластеризации, выбрав customer, product1 и product 2. мой фрейм данных выглядит следующим образом (столбец клиента игнорируется, и принимаются данные только двух продуктов) дф = Пожалуйста, нажмите здесь, чтобы посмотреть пример кадра данных

рассмотрите коды ниже, которые я использовал для кластеризации и визуализации.

from sklearn.cluster import KMeans
wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters = i, init = 'k-means++')
    kmeans.fit(df)
    wcss.append(kmeans.inertia_)
plt.plot(range(1, 11), wcss)
plt.title('The Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

# 4 clusters
# Fitting K-Means to the dataset
kmeans = KMeans(n_clusters = 4, init = 'k-means++')
y_kmeans = kmeans.fit_predict(df)

# Visualising the clusters
plt.scatter(df[y_kmeans == 0, 0], df[y_kmeans == 0, 1], s = 20, c = 'red', label = 'Cluster 1')
plt.scatter(df[y_kmeans == 1, 0], df[y_kmeans == 1, 1], s = 20, c = 'blue', label = 'Cluster 2')
plt.scatter(df[y_kmeans == 2, 0], df[y_kmeans == 2, 1], s = 20, c = 'green', label = 'Cluster 3')
plt.scatter(df[y_kmeans == 3, 0], df[y_kmeans == 3, 1], s = 20, c = 'yellow', label = 'Cluster 4')
plt.title('Clusters of customers')
plt.xlabel('Product1 (000 TO)')
plt.ylabel('Product2 (000 TO)')
plt.legend()
plt.show()

это прекрасно работает для одной пары, но моя цель - сделать для каждой из двух комбинаций продуктов из моего исходного кадра данных.

Я пытался найти это и использовал цикл и итерацию, но не смог достичь своей конечной цели. Я не так уж много разбираюсь в циклах и начал использовать Python с нескольких месяцев. Ваша помощь будет высоко оценена.

Вы можете исправить нет. кластеров как 4 в вашем ответе. Позвольте мне также вставить ниже то, что я до сих пор пытался для этого и все еще выясняю, что дальше.

Пожалуйста, дайте мне знать, если я не совсем уверен в своих вопросах ... или мне нужно добавить больше деталей. Заранее большое спасибо

from  itertools import combinations


from sklearn.cluster import KMeans

[править] .. ниже мой последний код .. чтобы упростить задачу .. Я пытаюсь повторить код ниже, используемый для одной пары для всех комбинаций пар

# kmeans for one pair

kmeans = KMeans(n_clusters = 4, init = 'k-means++')
X=df.iloc[:, [0,1]].values
kmeans.fit(X)
y_kmeans = kmeans.fit_predict(X)

петля kmeans

kmeans = KMeans(n_clusters = 4, init = 'k-means++')
combos = list(combinations(df.columns,2))
for combo in combos:
    for i in range(0,len(combos)):
        X=df.loc[:,combos[i]].values
        kmeans.fit(X)
        y_kmeans=kmeans.fit_predict(X)
Цикл

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

1 Ответ

0 голосов
/ 01 ноября 2018

Вы можете использовать itertools.combinations для создания всех парных комбинаций, а затем fit все модели в for loop, добавляя их в list как:

from itertools import combinations
from sklearn.cluster import KMeans

combos = list(combinations(df.columns,2))
models = []
for combo in combos:
    model =  kmeans.fit(df[list(combo)]
    models.append(model)
...