K-Means聚类尝试将样本数据集分成具有相同方差的n个类。
详解K-Means:
https://zhuanlan.zhihu.com/p/78798251
1.sklearn建立K-Means聚类算法
首先看一个简单且典型的的K-Means聚类算法的所得到的效果。


可以看到数据集被正确的分成了三类。
接下来开始分析K-Means聚类方法随着迭代次数的分步演变过程。
2.分步演变过程
伪代码如下
获取数据 n 个 m 维的数据
随机生成 K 个 m 维的点
while(t)
for(int i=0;i < n;i++)
for(int j=0;j < k;j++)
计算点 i 到类 j 的距离
for(int i=0;i < k;i++)
1. 找出所有属于自己这一类的所有数据点
2. 把自己的坐标修改为这些数据点的中心点坐标
end

3. 可能出现的问题
1. 初始化 init
K-Means算法由初始的聚类中心开始,有不同的初始化策略:
- 有根据的猜测:init 传递一个数组或者一个callable,即开发人员对于中心的位置有了估计。
- 随机:init = ‘random’ 即在可行的范围内随机生成中心
- k-means++:init = ‘k-means++’ 以智能方式为 k-mean 聚类选择初始聚类中心以加速收敛。
随机的初始化可能会产生不同的聚类结果,因为K-Means只能实现局部最优。为了避免这个问题,通常使用不同的初始化重复执行K-Means算法,然后基于最小化目标函数(例如训练集中所有观测值到最近中心的平方距离之和)的标准来选择最终的聚类方案。
2. 不正确的类的数目
对于K-Means算法来说,提前知道类的数目是必要的。错误的数目会导致错误的结果。


3. 非球型聚类
K-Means另一个问题是,由于目标是最小化数据点和最近聚类之间的平方距离,因此只能找到球形聚类,如下两个数据集KMeans就不合适。

4. 类之间方差差异较大
当类的方差具有明显差异时,KMeans也不合适。因为KMeans使用的假设就是所有的类有相似的方差。

5. 强行聚类
需要记住一件事是,K-Means总会找到k个类,无论数据怎么样,类的数目大于还是小于k,甚至根本没有类的分别。

#!/usr/bin/env python
# coding: utf-8
# ## Referenzen
# https://scikit-learn.org/stable/modules/clustering.html#k-means
# https://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_assumptions.html#sphx-glr-auto-examples-cluster-plot-kmeans-assumptions-py
# https://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_digits.html#sphx-glr-auto-examples-cluster-plot-kmeans-digits-py
import seaborn as sns
from matplotlib import pyplot as plt
from sklearn.datasets import make_blobs
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import make_circles, make_moons
sns.set(
context="notebook",
style="whitegrid",
rc={
"figure.dpi": 100, "scatter.edgecolors": "k"},
)
def plot_cluster_data(X):
"""Creates a scatter plot for the given data."""
plt.figure()
plt.scatter(X[:,0],X[:,1])
plt.axis("off")
plt.show()
def fit_kmeans(X, k, init="k-means++", n_init=10, random_state=0) -> [np.ndarray, np.ndarray]:
"""Runs K-Means clustering and returns the label assignments and cluster centroids."""
model = KMeans(n_clusters=k, n_init=n_init,init=init,random_state=random_state)
model.fit(X

本文探讨了K-Means聚类算法在实际应用中可能遇到的问题,包括初始化选择、类别的预设数量、非球型聚类、类间方差差异以及强行聚类,并提供了相应的解决方案,如k-means++初始化策略和调整类别数量等。
最低0.47元/天 解锁文章
4753

被折叠的 条评论
为什么被折叠?



