1.原理简介

k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律。k 均值聚类是一种无监督学习方法。聚类技术很多,例如层次法、贝叶斯法和划分法。k 均值聚类属于划分聚类方法,将数据分成 k 个簇,每个簇有一个中心,称为质心,k 值需要给定。k 均值聚类算法的工作原理如下:

  1. 随机选择 k 个数据点作为初始质心(聚类中心)。
  2. 将每个数据点划分给距离最近的质心,衡量两个样本数据点的距离有多种不同的方法,最常用的是欧氏距离。
  3. 重新计算每个簇的质心作为新的聚类中心,使其总的平方距离达到最小。
  4. 重复第 2 步和第 3 步,直到收敛。

2.代码实现

准备工作:

根据 TensorFlow 文档,KmeansClustering 类对象可以使用以下__init__方法进行实例化:

TensorFlow 文档对这些参数的定义如下:

  • num_clusters:要训练的簇数。
  • model_dir:保存模型结果和日志文件的目录。
  • initial_clusters:指定如何对簇初始化,取值请参阅 clustering_ops.kmeans。
  • distance_metric:聚类的距离度量方式,取值请参阅 clustering_ops.kmeans。
  • random_seed:Python 中的整数类型,用于初始化质心的伪随机序列发生器的种子。
  • use_mini_batch:如果为 true,运行算法时分批处理数据,否则一次使用全部数据集。
  • mini_batch_steps_per_iteration:经过指定步数后将计算的簇中心更新回原数据。更多详细信息参见 clustering_ops.py。
  • kmeans_plus_plus_num_retries:对于在 kmeans++ 方法初始化过程中采样的每个点,该参数指定在选择最优值之前从当前分布中提取的附加点数。如果指定了负值,则使用试探法对 O(log(num_to_sample)) 个附加点进行抽样。
  • relative_tolerance:相对误差,在每一轮迭代之间若损失函数的变化小于这个值则停止计算。有一点要注意就是,如果将 use_mini_batch 设置为 True,程序可能无法正常工作。

TensorFlow 支持将欧氏距离和余弦距离作为质心的度量,KmeansClustering 类提供了多种交互方法。在这里使用 fit()、clusters() 和 predict_clusters_idx() 方法:

根据 TensorFlow 文档描述,需要给 fit() 提供 input_fn() 函数,cluster 方法返回簇质心,predict_cluster_idx 方法返回得到簇的索引。

具体做法

这里使用鸢尾花卉数据集,该数据集分为三类,每类都是指一种鸢尾花卉,每类有 50 个实例。可以从https://archive.ics.uci.edu/ml/datasets/iris上下载 .csv 文件,也可以使用 sklearn 库的数据集模块(scikit-learn)来加载数据:

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import datasetsiris=datasets.load_iris()
x=iris.data[:,:2]  #only take the first teo features
y=iris.target

定义 input_fn 来给 fit() 方法输入数据,函数返回一个 TensorFlow 常量,用来指定x的值和维度,类型为 float:

def input_fn():return tf.constant(np.array(x),tf.float32,x.shape),None

开始使用 KmeansClustering 类,分为 3 类,设置 num_clusters=3。通常情况下事先并不知道最优的聚类数量,在这种情况下,常用的方法是采用肘部法则(elbow method)来估计聚类数量:

kmeans=tf.contrib.learn.KmeansClustering(num_clusters=3,relative_tolernence=0.0001,random_seed=2)
kmeans.fit(input_fn=input_fn)

使用 clusters() 方法找到这些簇,使用 predict_cluster_idx() 方法为每个输入点计算分配的簇索引:

cluster=kmeans.cluster()
assignments=list(kmeans.predict_cluster_idx(input_fn=input_fn))

对创建的簇进行可视化操作,创建一个包装函数 ScatterPlot,它将每个点的 X 和 Y 值与每个数据点的簇和簇索引对应起来:

def ScatterPlot(X,Y,assignments=None,centers=None):if assignments is None:assignments=[0]*len(X)fig=plt.figure(figsize=(14,8))cmap=ListedColormap(['red','green','blue'])plt.scatter(X,Y,c=assignments,cmap=cmap)if centers is not None:plt.scatter(centers[:,0],centers[:,1],c=range(len(centers)),marker='+',s=400,cmap=cmap)plt.xlabel('Sepia Length')plt.ylabel('Sepia Width')    ScatterPlot(X[:,0],x[:,1],assignments,clusters)

上面的案例中使用 TensorFlow Estimator 的 k 均值聚类进行了聚类,这里是提前知道簇的数目,因此设置 num_clusters=3。但是在大多数情况下,数据没有标签,我们也不知道有多少簇存在,这时候可以使用肘部法则确定簇的最佳数量,肘部法则选择簇数量的原则是减少距离的平方误差和(SSE),随着簇数量 k 的增加,SSE 是逐渐减小的,想要的是一个较小的 k 值,而且 SSE 也较小。在 TensorFlow 中,可以使用 KmeansClustering 类中定义的 score() 方法计算 SSE,该方法返回所有样本点距最近簇的距离之和:

sum_distances=kmeans.score(input_fn=input_fn,steps=100)

对于鸢尾花卉数据,如果针对不同的 k 值绘制 SSE,能够看到 k=3 时,SSE 的变化是最大的;之后变化趋势减小,因此肘部 k 值可设置为 3:

k 均值聚类因其简单、快速、强大而被广泛应用,当然它也有不足之处,最大的不足就是用户必须指定簇的数量;其次,算法不保证全局最优;再次,对异常值非常敏感。

k均值聚类算法原理和TensorFlow实现相关推荐

  1. k均值聚类算法原理和(TensorFlow)实现

    顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...

  2. 【模式识别】K均值聚类算法应用实验报告及MATLAB仿真

    一. 实验目的 1.掌握K均值聚类算法的原理和实现过程: 2.掌握K均值聚类算法的应用方法. 二. 实验内容 1.彩色图像分割 选择一幅图像,分别按三种颜色数进行彩色图像分割的结果(原图和分割图).步 ...

  3. k均值聚类算法优缺点_Grasshopper实现K均值聚类算法

    本文很长很长,有很多很多图,包含以下部分: 1.算法简介 2.如何分类平面点 3.如何分类空间点 4.如何分类多维数据 5.后记 提醒:以下内容包括:智障操作,无中生友,重复造轮子 等 1.算法简介 ...

  4. K-Means(K均值聚类算法)

    K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...

  5. K均值聚类算法(HCM,K-Means)

    K均值聚类核心思想如下: 算法把n个向量分为个组,并求每组的聚类中心,使得非相似性(或距离)指标的价值函数(或目标函数)达到最小.当选择欧几里德距离为组j中向量与相应聚类中心间的非相似性指标时,价值函 ...

  6. K均值聚类算法(Kmeans)讲解及源码实现

    K均值聚类算法(Kmeans)讲解及源码实现 算法核心 K均值聚类的核心目标是将给定的数据集划分成K个簇,并给出每个数据对应的簇中心点.算法的具体步骤描述如下. 数据预处理,如归一化.离群点处理等. ...

  7. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

  8. python(scikit-learn)实现k均值聚类算法

    k均值聚类算法原理详解 示例为链接中的例题 直接调用python机器学习的库scikit-learn中k均值算法的相关方法 from sklearn.cluster import KMeans imp ...

  9. 机器学习之无监督学习-K均值聚类算法

    机器学习之无监督学习-K均值聚类算法 对于无监督学习,有两类重要的应用,一个是聚类,一个是降维.我们今天主要学习聚类中的K均值聚类. 我们先看看下图,图a为原始的数据点,我们想要对图a的数据点进行分类 ...

  10. Thinking in SQL系列之五:数据挖掘K均值聚类算法与城市分级

    原创: 牛超   2017-02-21   Mail:10867910@qq.com 引言:前一篇文章开始不再介绍简单算法,而是转到数据挖掘之旅.感谢CSDN将我前一篇机器学习C4.5决策树算法的博文 ...

最新文章

  1. 分布式 RPC 框架
  2. InitializeComponent()有什么作用?
  3. Please verify you invoked Maven from the correct directory
  4. 春节您“抢票”到手了吗,如果没,请进来看看!
  5. 拓扑排序两种实现方式
  6. mysql快速删除大表数据部分数据_mysql删除大表的部分数据
  7. 使用MONO使.net程序脱离.net框架运行
  8. 2013年5月16日星期四初始sqlserver附加数据库权限及maven和selenium
  9. 【免费毕设】ASP.NET基于.NET的城市公交查询系统的实现与设计(源代码+lunwen)
  10. 【转】socket提交http表单 [C++]
  11. linux---动静态库编译及使用
  12. 智慧通用大屏看板+智慧旅游/政府服务大屏看板+常用图表组件折线图+圆柱图+散点图+热力图+漏斗图+雷达图+航线图+中国动态地图+智慧电商实时动态数据大屏看板+智慧web端高保真大数据动态可视化大屏看板
  13. 2014_hitcon_stkof学习
  14. RSA的APT峰会会议纪要
  15. IDEA中suppress warnings
  16. 【开发】后端框架——Mybatis
  17. JAVA流浪猫狗救助平台
  18. 通过CrossTalk在Delphi中使用ADO.Net(1)
  19. python关于函数作用的描述_Python函数的概念和使用
  20. 数据库--sql文件

热门文章

  1. Java转Ruby【快速入门】
  2. VS2019 MFC在静态库运行时出现的LNK2005和LNK1169问题
  3. 华三数据中心SDN技术发展应用
  4. 省团团小程序被微信封禁
  5. 06-输出100以内的素数
  6. 抑郁自评量表SDS问卷HTML版
  7. 反向题在测试问卷信效度_问卷的信度与效度
  8. 移动领先100笔试面试经验
  9. Python编程基础
  10. python哪些模板引擎比较_3 个 Python 模板库比较