K-means算法原理、代码实现,优缺点及改进

k-Means是一种无监督的聚类算法,实现起来比较简单,聚类效果也不错,因此被广泛应用。

原理

物以类聚,人以群分。
聚类是无监督学习(训练样本的标签信息未知,或者说难以拿到)。
简单地说,就是把相似的物体聚到一个簇。同一簇内相似度尽可能大,不同簇间相似度尽可能低。采用距离度量相似程度

算法

1、初始化k个中心点,有了k个簇
2、对所有样本,计算每个样本与k个中心点的距离,将各样本划分到距离最近的中心点所在的簇
3、重新计算各簇的中心:为各簇所有点的均值
4、不断迭代2、3,直到各簇不再发生变化或者达到迭代次数

优缺点

优点:
是解决聚类问题的一种经典算法,简单、快速;
对处理大数据集,该算法高效率;
当结果是密集的,它的效果较好。
缺点:
k值选取不好把握;
对初值敏感(初始聚类中心的选择:改进1:k-means++,改进2:二分k-means);
对噪声和异常点敏感(改进:离群点检测,去掉离群点后再聚类,减少它们对聚类效果的影响)(一个遥远的你影响了一群dog的中心);
只能收敛到局部最小,不适合于发现非凸形状的簇还有,不能处理大小、密度差别很大的簇(改进:基于密度的聚类:擅于解决不规则形状的聚类问题,能克服基于距离的算法只能发现“类圆形”的聚类的缺点。如,DBSCAN算法)

实现

import numpy as np

#文件解析,将值封装到矩阵(实质是list里每个元素list)里
#dataset文件每行数字以制表符分
def loadDataset(filename):
    data = []
    f = open(filename)
    for line in f:
        line = line.strip().split('\t')
        floatline = map(float
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值