#分群 K-means
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')
import pandas as pd
df = pd.read_csv("StudentJob.csv",encoding = "big5")
df.head()

from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')
df.salary = df.salary.astype(float) #traform into float type
df.working = df.working.astype(float) #traform into float type
X = df[['salary','working']].values #tranform DataFrame to ndarray Matrix 為了predict輸入的方式
#如何選擇 k
實務上我們讓程式幫忙選擇一個適合的 k,使得群間差異最大、群內差異最小
from sklearn import cluster, datasets, metrics
import matplotlib.pyplot as plt
# 迴圈
silhouette_avgs = []
ks = range(2, 11)
for k in ks:
kmeans_fit = cluster.KMeans(n_clusters = k).fit(X)
cluster_labels = kmeans_fit.labels_
silhouette_avg = metrics.silhouette_score(X, cluster_labels)
silhouette_avgs.append(silhouette_avg)
# 作圖並印出 k = 2 到 10 的績效
plt.bar(ks, silhouette_avgs)
plt.show()
print(silhouette_avgs)

由績效圖我們發現 在2群、3群的績效比較好,因此我們可以將K設定為2 OR 3
km = KMeans(n_clusters=2) #K=2群
y_pred = km.fit_predict(X)
plt.figure(figsize=(10, 6))
plt.xlabel('Salary')
plt.ylabel('Rate of working')
plt.scatter(X[:, 0], X[:, 1], c=y_pred) #C是第三維度 已顏色做維度
plt.show()
km.cluster_centers_ #各群中心點(X,Y)的位置

請先 登入 以發表留言。