K-Means聚类算法中可能出现的问题 python

本文探讨了K-Means聚类算法在实际应用中可能遇到的问题,包括初始化选择、类别的预设数量、非球型聚类、类间方差差异以及强行聚类,并提供了相应的解决方案,如k-means++初始化策略和调整类别数量等。
摘要由CSDN通过智能技术生成

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>