K-means聚类算法(Python)

一,介绍
  K-Means是一种经典的无监督的聚类算法。它比较简单,易于实现并且应用很广泛。

二,原理
  K-Means算法的思想很简单,对于给定的数据集:
  1)将各个聚类内的所有样本的均值作为该聚类的代表点,
  2)计算每个样本到各个均值的距离,
  3)取最小距离的均值所在类别作为样本类别,从而数据集划分为K个类,
  4)再重新计算每个聚类的均值,继续2)3),依次迭代,直到均值不再变化。
  这样就让类内的点尽量紧密的连在一起,而让类间的距离尽量的大,即:类内紧凑,类间独立。

  如果用数学表达式表示,假设划分类为(C1,C2,…Ck),则我们的目标是最小化误差平方和准则函数E:
在这里插入图片描述
  其中 是类Ci的均值向量,有时也称为质心,表达式为:
在这里插入图片描述

三,K-means聚类示例
在这里插入图片描述
  图a表达了初始的数据集,假设k=2。

  图b,我们随机选择了两个类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为与该样本距离最小的质心的类别。

  图c,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心。

  图d,新的红色质心和蓝色质心的位置已经发生了变动。

  图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到两个类别如图f。

三,K-means算法2个核心问题
  1.度量样本之间的距离——欧式距离。
  2.更新类内质心的方法——平均值法,即means。
  输入: 类的数目k 和包含n 个样本的数据集。
  输出: k 个类, 使误差平方和准则函数最小。
  方法:基于类中样本的平均值。
    (1) 任意选择k 个样本作为初始的类质心,
    (2) 计算k个类中样本的质心,
    (3) 根据类中样本的质心, 将每个样本(重新) 赋予类别,
    (4) 更新簇的均值, 即计算每个簇中对象的质心,
    (5) 直到质心不再发生变化。

四,优缺点
  主要优点:
    (1)是解决聚类问题的一种经典算法,原理简单,收敛速度快。
    (2)对处理大数据集,该算法是相对可伸缩和高效率的。因为它的复杂度是O(nkt ) , 其中, n 是所有样本的数目, k 是要划分类的数目, t 是迭代的次数。通常k<<n且t<<n 。
    (3)当样本是密集的,而类与类之间区别明显时, 它的效果较好。
  主要缺点
    (1)数据集样本需要距离计算,这对于处理符号属性的数据不适用。
    (2)必须事先给出k(要生成的类的数目),而且对初值敏感,对于不同的初始值,可能会导致不同结果。
    (3)对“噪声”和孤立点数据敏感,少量的该类数据能够对质心产生极大的影响。

五,Python代码

import numpy as np
import matplotlib.pyplot as plt

# 加载数据
def loadDataSet(fileName):
    data = np.loadtxt(fileName,delimiter='\t')
    return data

# 欧氏距离计算
def distEclud(x,y):
    return np.sqrt(np.sum((x-y)
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值