k-means聚類
非監督學習
把資料劃分為k個類别
-知道類别個數
-不知道類别個數 超參數
k = 3
步驟:
1、随機在資料中抽取3個樣本,當做3個類别的中心點(k1, k2, k3)
2、計算其餘的點分别到這三個中心點的距離,
每一個樣本有3個距離(a, b, c)
從中選出舉例最近的一個點作為自己的标記,行成3個族群
3、分别計算這3個族群的平均值,把3個平均值與之前的3個舊中心點進行比較
4、如果相同結束聚類,如果不同,把這3個平均值當做新的中心點重複第2步
聚類評估标準
輪廓系數
計算公式

對于每個點i 為已聚類資料中的樣本,
bi為i 到其他族群的所有樣本的距離最小值
ai為i 到本身族群的距離平均值
最終計算出所有樣本點的輪廓系數平均值
極端:
bi>>ai ,sci=1 完美
ai>>bi ,sci=−1 最差
輪廓系數取值[-1, 1]
總結
采用疊代算法,直覺易懂并且非常實用
缺點:容易收斂到局部最優解(多次聚類)
聚類,用在分類之前
代碼示例
# -*- coding: utf-8 -*-
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
# 生成資料
X, y = make_blobs(n_samples=200, centers=3, n_features=5, random_state=0)
# k-means聚類
km = KMeans(n_clusters=3)
km.fit(X)
y_predict = km.predict(X)
# 評估聚類效果
print(silhouette_score(X, y_predict))
# 0.72
# 繪制聚類結果圖
color = ["red", "green", "blue"]
colors = [color[i] for i in y_predict]
plt.figure()
plt.scatter(X[:, 1], X[:, 2], color=colors)
plt.savefig("a.png")