1.什么是K-Means?

K均值算法聚类

关键词:K个种子,均值
聚类的概念:一种无监督的学习,事先不知道类别,自动将相似的对象归到同一个簇中

K-Means算法是一种聚类分析(cluster analysis)的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法.

K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大.

2.k-Means原理

每次计算距离采用的是欧式距离

步骤图:

步骤总结:

  • 从数据中选择k个对象作为初始聚类中心;
  • 计算每个聚类对象到聚类中心的距离来划分;
  • 再次计算每个聚类中心
  • 2~3步for循环,直到达到最大迭代次数,则停止,否则,继续操作。
  • 确定最优的聚类中心

主要优点:

  • 原理比较简单,实现也是很容易,收敛速度快。
  • 聚类效果较优。
  • 算法的可解释度比较强。
  • 主要需要调参的参数仅仅是簇数k。
  • 当簇近似为高斯分布时,效果是最高的.
  • 对处理大数据集该算法保持可伸缩性和高效率

主要缺点:

  • K-Means算法需要用初始随机种子点来搞,这个随机种子点太重要,不同的随机种子点会有得到完全不同的结果。(K-Means++算法可以用来解决这个问题,其可以有效地选择初始点)

  • 必须事先给出k(要生成的簇的数目),而且对初值敏感,对于不同的初值,可能会导致不同的结果.
  • 对于不是凸的数据集比较难收敛
  • 如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。
  • 采用迭代方法,得到的结果只是局部最优。
  • 对噪音和异常点比较的敏感。

3.K-Means算法应用:

  • 对于多维数据的分类,效果很好
  • 二维坐标点的X,Y 坐标,其实是一种向量,是一种数学抽象。现实世界中很多属性是可以抽象成向量的,比如,我们的年龄,我们的喜好,我们的商品,等等,能抽象成向量的目的就是可以让计算机知道某两个属性间的距离。如:我们认为,18岁的人离24岁的人的距离要比离12岁的距离要近,鞋子这个商品离衣服这个商品的距离要比电脑要近,等等。解决实际问题比较好

4.K-Means实例-亚洲国家队足球水平分类

 import numpy as np

 import pandas as pd

 # cluster :簇,一堆
# 只有分类
from sklearn.cluster import KMeans import matplotlib.pyplot as plt
%matplotlib inline from mpl_toolkits.mplot3d.axes3d import Axes3D
import warnings
warnings.filterwarnings('ignore') # 2006年世界杯,2010年世界杯,2007亚洲杯,比赛数据
football = pd.read_csv('./AsiaFootball.txt') X = football.iloc[:,1:] kmeans = KMeans(n_clusters=5) # 无监督学习 PCA也是无监督 NMF无监督
kmeans.fit(X)
y_ = kmeans.predict(X) # 分成3类
for i in range(3):
index = np.argwhere(y_ == i).reshape(-1)
print('类别是%d国家队有:'%(i),football['国家'].loc[index].get_values()) # 分成5类
for i in range(5):
index = np.argwhere(y_ == i).reshape(-1)
print('类别是%d国家队有:'%(i),football['国家'].loc[index].get_values())

加载的数据结构:

分成3类打印输出:

分成5类打印输出:

分类好了,但是我们不知道分成4类好还是分成5类好,现在选取一些指标来评判一下:

(1)轮廓系数 Silhouette Coefficient

 # 轮廓系数
from sklearn.metrics import silhouette_score for i in range(2,16):
kmeans = KMeans(n_clusters=i)
kmeans.fit(X)
y_ = kmeans.predict(X)
s = silhouette_score(X,y_)
print('聚类个数是:%d。轮廓系数是:%0.2f'%(i,s))

由轮廓系数分析可知,当分为6类的时候,效果最好

(2)calinski_harabasz_score CH分数(值越大,效果越好)

 for i in range(2,16):
kmeans = KMeans(n_clusters=i)
kmeans.fit(X)
y_ = kmeans.predict(X)
s = metrics.calinski_harabasz_score(X,y_)
print('聚类个数是:%d。calinski_harabasz_score:%0.2f'%(i,s))

(3)davies_bouldin_score 戴维森堡丁指数DBI(度量是每个聚类最大相似度的均值)

 for i in range(2,16):
kmeans = KMeans(n_clusters=i)
kmeans.fit(X)
y_ = kmeans.predict(X)
s = metrics.davies_bouldin_score(X,y_)
print('聚类个数是:%d。davies_bouldin_score:%0.2f'%(i,s))

以上三种方式得到的最优分类均不同,这是因为数据的原因,数据不太好.

5.Kmeans评价指标,这个就是聚类的衡量指标,之后再具体详细的解释一下

(1)轮廓系数 metrics.silhouette_score

(2)兰德系数 metrics.adjusted_rand_score

(3)互信息指标 metrics.adjusted_mutual_info_score

(4)同质性 homogeneity_completeness_v_measure

(5)Calinski-Harabasz索引 metrics.calinski_harabasz_score

(6)Davies-Bouldin索引 metrics.davies_bouldin_score

补充:

1.k-Means算法,初值的选择,对聚类结果有影响吗?

k-Means是初值敏感的,举个例子:

对于左图来说,使用k-means分类,我们肉眼可见,选择初值会在四个区域选择四个样本,

但是如图所示,在第二部分选择了两个样本作为初始值,而第一部分没有选择,

这种情况下,最终的分类结果可能是右图所示,这样的话结果就不太好,分类效果明显不好,

所以,由此可见,初值的选择对分类有很大的影响.

我觉得有一种解决方法是:

k-means++算法:

先随机选择一个样本点为初始值,然后计算其他所有样本到该该本点的距离,然后计算加权平均,相当于给每个样本点一个权值,也就是被选中的概率,然后按照概率选择其他的初始值,并不是概率高的一定会被选中,概率低的也可能会被选中,这是一个概率问题,一般来说选中都是距离第一个初始值比较远的,这样我们就有下一个聚类中心了,再然后找第三个聚类中心的话,更新一下之前的距离权值,根据样本到两个聚类中心的距离,哪个距离大选择哪个,这样再根据概率挑选出第三个聚类中心,之后的步骤是一样的,这就是k-means++算法

2.k-means使用场景

k-means其实对样本的分布是有要求的,我们认为k个样本其实是服从高斯混合分布的,并且每个高斯分布的方差是一样的,其实也就是每个簇的方差是一样的.

3.k-means的公式化解释:

我们上边所说的原理其实就是两个公式的重复循环

4.如果样本量巨大的话,可以考虑使用mini-batch k-means算法

5.k-means算法可能会振荡

采用迭代的方法,多做几次,每次结果可能都不一样,具体哪个效果好,可能需要人为去判断.

聚类-K-Means的更多相关文章

  1. 软件——机器学习与Python,聚类,K——means

    K-means是一种聚类算法: 这里运用k-means进行31个城市的分类 城市的数据保存在city.txt文件中,内容如下: BJ,2959.19,730.79,749.41,513.34,467. ...

  2. KMeans聚类 K值以及初始类簇中心点的选取 转

    本文主要基于Anand Rajaraman和Jeffrey David Ullman合著,王斌翻译的<大数据-互联网大规模数据挖掘与分布式处理>一书. KMeans算法是最常用的聚类算法, ...

  3. 聚类-K均值

    数据来源:http://archive.ics.uci.edu/ml/datasets/seeds 15.26 14.84 0.871 5.763 3.312 2.221 5.22 Kama 14.8 ...

  4. 【机器学习笔记五】聚类 - k均值聚类

    参考资料: [1]Spark Mlib 机器学习实践 [2]机器学习 [3]深入浅出K-means算法  http://www.csdn.net/article/2012-07-03/2807073- ...

  5. 聚类--K均值算法

    import numpy as np from sklearn.datasets import load_iris iris = load_iris() x = iris.data[:,1] y = ...

  6. 第八次作业:聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

    import numpy as np x = np.random.randint(1,100,[20,1]) y = np.zeros(20) k = 3 def initcenter(x,k): r ...

  7. 聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

    1.用python实现K均值算法 import numpy as np x = np.random.randint(1,100,20)#产生的20个一到一百的随机整数 y = np.zeros(20) ...

  8. KNN 与 K - Means 算法比较

    KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...

  9. 机器学习方法(七):Kmeans聚类K值如何选,以及数据重抽样方法Bootstrapping

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入.我的博客写一些自己用得到东西,并分享给 ...

  10. kmeans 聚类 k 值优化

    kmeans 中k值一直是个令人头疼的问题,这里提出几种优化策略. 手肘法 核心思想 1. 肉眼评价聚类好坏是看每类样本是否紧凑,称之为聚合程度: 2. 类别数越大,样本划分越精细,聚合程度越高,当类 ...

随机推荐

  1. MarkDown时序图

    时序图 语法 ```sequence ``` 标题 title: 我是标题 对象 participant A participant B as b-alias 交互 sequence A->B: ...

  2. 如何获取比 dism.log 更详细的日志

    正文 在工作中,曾经遇到过一个问题. 有一个 component,名字叫做 Oxford Adaptive Learning Dictionary,是一款牛津词典的应用.这个 component,需要 ...

  3. 微信授权就是这个原理,Spring Cloud OAuth2 授权码模式

    上一篇文章Spring Cloud OAuth2 实现单点登录介绍了使用 password 模式进行身份认证和单点登录.本篇介绍 Spring Cloud OAuth2 的另外一种授权模式-授权码模式 ...

  4. vue2.0 与 vue3.0 配置的区别

    提示:要了解vue2.0与vue3.0区别,首先你要熟悉vue2.0 从最明显最简单的开始 项目目录结构 可以明显的看出来,vue2.0与3.0在目录结构方面,有明显的不同(vue3.0我是安装了cs ...

  5. (大模拟紫题) Luogu P1953 易语言

    原题链接:P1953 易语言 (我最近怎么总在做大模拟大搜索题) 分别处理两种情况. 如果只有一个1或0 直接设一个cnt为这个值,每次输入一个新名字之后把数字替换成cnt,最后cnt++即可. 注意 ...

  6. Java迭代Map方法

    Map map=new HashMap(); map.put("1", "one"); map.put("2","two" ...

  7. 等距结点下的Newton插值多项式系数计算(向前差分)

    插值多项式的牛顿法 1.为何需要牛顿法? ​ 使用Lagrange插值法不具备继承性.当求好经过\(({x_0},{y_0})-({x_n},{y_n})\)共n+1个点的插值曲线时候,如果再增加一个 ...

  8. net core WebApi——April.Util更新之权限

    目录 前言 权限 中间层 小结 前言 在之前已经提到过,公用类库Util已经开源,目的一是为了简化开发的工作量,毕竟有些常规的功能类库重复率还是挺高的,二是为了一起探讨学习软件开发,用的人越多问题也就 ...

  9. 深入理解计算机系统 第八章 异常控制流 Part1 第二遍

    第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了第 500~507 页,共 8 页) 第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/101651 ...

  10. tomcat的catalina.out日志切割

    目前我们的日志文件catalina.out累积后非常大,部分应用的catalina.out达到几十G并且还在持续增长. 日志文件太大不便于阅读和排查问题.业务增长不断增长,日志也在不断增加,为了以后便 ...