K-Means
算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本划分为 K K K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
假设簇划分为 ( C 1 , C 2 , . . . , C K ) (C_1,C_2,...,C_K) (C1,C2,...,CK),则我们的目标是最小化平方误差:
E = ∑ i = 1 K ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 2 E=\sum_{i=1}^K\sum_{x \in C_i}||x-\mu_i||_2^2 E=i=1∑Kx∈Ci∑∣∣x−μi∣∣22
其中 μ i \mu_i μi是簇 C i C_i Ci的均值向量,有时也称为质心,表达式为:
μ i = 1 ∣ C i ∣ ∑ x ∈ C i x \mu_i=\frac {1} {|C_i|}\sum_{x \in C_i}x μi=∣Ci∣1x∈Ci∑x
输 入 : 样 本 集 D = { x 1 , x 2 , . . . , x M } , 聚 类 的 簇 树 K , 最 大 迭 代 次 数 N 输入:样本集D=\{x_1,x_2,...,x_M\},聚类的簇树K,最大迭代次数N 输入:样本集D={ x1,x2,...,xM},聚类的簇树K,最大迭代次数N
输 出 : 簇 划 分 C = { C 1 , C 2 , . . . , C K } 输出:簇划分C=\{C_1,C_2,...,C_K\} 输出:簇划分C={ C1,C2,...,CK}
对于K-means
算法, K K K个初始化的质心的位置选择对最后的聚类结果和运行时间都有较大影响,因此需要合适的选择 K K K个质心。K-means++
算法就是对 K − m e a n s K-means K−means随机初始化质心的方法的优化。
K-means++
初始化质心的优化策略:
K-Means
算法import numpy as np
import matplotlib.pyplot as plt
from sklearn import cluster, datasets
from sklearn.preprocessing import StandardScaler
np.random.seed(0)
# 构建数据
n_samples = 1500
noisy_circles = datasets.make_circles(n_samples=n_samples, factor=0.5, noise=0.05)
noisy_moons = datasets.make_moons(n_samples=n_samples, noise=0.05)
blobs = datasets.make_blobs(n_samples=n_samples, random_state=8)
data_sets = [
(
noisy_circles,
{
"n_clusters": 2
}
),
(
noisy_moons,
{
"n_clusters": 2
}
),
(
blobs,
{
"n_clusters": 3
}
)
]
colors = ["#377eb8", "#ff7f00", "#4daf4a"]
plt.figure(figsize=(15, 5))
for i_dataset, (dataset, algo_params) in enumerate(data_sets):
# 模型参数
params = algo_params
# 数据
X, y = dataset
X = StandardScaler().fit_transform(X)
# 创建K-means
k_means = cluster.KMeans(n_clusters=params["n_clusters"])
# 训练
k_means.fit(X)
# 预测
y_pred = k_means.predict(X)
y_pred_colors = []
for i in y_pred:
y_pred_colors.append(colors[i])
plt.subplot(1, 3, i_dataset+1)
plt.scatter(X[:, 0], X[:, 1], color=y_pred_colors)
plt.show()
优点:
缺点: