数据离散化及其KMeans算法实现的理解

2020-08-14 10:03:20 浏览数 (1)

这篇文章尝试借用数据离散化这个事给大家讲明白K-Means算法的含义。

01

数据离散化

数据离散化是数据预处理的一个非常重要的步骤,就是将连续的数据分成几个段。

举个简单例子,好比我们一个班上的学生成绩是从0-·100分之间的,但是我们在进行数据分析的时候呢我们把这些分数分成不及格、及格、良好、优秀四大类,实际上就是将比较连续的分数给离散化成了4种可能取值。

那这样做有什么好处呢?

02

数据离散化的意义

一些数据挖掘算法中(比如Apriori算法),要求数据是分类属性形式。因此,就需要在数据预处理阶段将连续属性的数给它离散化,除此之外离散化还具有以下好处:

  • 提高计算效率
  • 分类模型计算需要
  • 距离计算模型(k均值、协同过滤)中降低异常数据对模型的影响
  • 图像处理中的二值化处理

当然,一切都还是看业务需要。

03

常用的数据离散化方法

离散化的工作很容易理解,就是依照一定规律把写数据给分成少数的几类。那这个规律是什么呢?

常用的离散化方法有:

  • 分位数法:使用四分位、五分位、十分位等进行离散
  • 距离区间法:等距区间或自定义区间进行离散
  • 频率区间法:根据数据的频率分布进行排序,然后按照频率进行离散,好处是数据变为均匀分布,但是会更改原有的数据结构
  • 聚类法:使用k-means将样本进行离散处理
  • 卡方:通过使用基于卡方的离散方法,找出数据的最佳临近区间并合并,形成较大的区间
  • 二值化:数据跟阈值比较,大于阈值设置为某一固定值(例如1),小于设置为另一值(例如0),然后得到一个只拥有两个值域的二值化数据集。

我们重点研究一下K-Means算法。

04

K-Means算法

聚类分析是在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好。

为什么这么说呢?就像最前面那个成绩聚类的例子,我们以60分为界限划分及格和不及格,那60分的同学真的就比59分的同学优秀么?其实他们可能根本就是一类人。

所以,我们希望能有算法将这些数据更科学的离散化,就是让类和类之间的区分更大,不再残忍地把59.5和60给分割成不同的两个世界。

05

算法理解

K-Means 算法简单说,就是一个do-while循环。

伪代码如下:

代码语言:javascript复制
选择K个点作为初始质心 
repeat   
将每个点指派到最近的质心,形成K个簇
重新计算每个簇的质心
until 簇不发生变化或达到最大迭代次数

上面伪代码几句话虽然少,但是对K-Means算法对描述已经很透了。

我们通过一个具体的例子来理解一下。大家想象一下,假设操场上有20个学生随机地站在那不动,我们想把他们分成5组,用K-Means算法该怎么分呢?

  • 第1步,我们在这20个同学里面抽出5个同学作为小组长;
  • 第2步,剩下的15个同学,每个同学都量量他(她)自己和第1步中选定的小组长的距离,把自己归到离他(她)最近的那个小组长那一组,经过第2步我们就初步的把20个同学分成5组了(每一组的同学个数不一定是4个);
  • 第3步,在第2步中得到的5个组,我们再按一定办法给每个组指定一个新的小组长;
  • 第4步,在第3步中没有被选中为小组长的剩下的15个同学重新计算自己与新的小组长的距离,把自己归到离自己最近的那个新的小组长那组;
  • 第5步,重复上面的工作,一直到我们对分组的效果满意了或者重复的次数达到我们设置的上限了。

从上面两个小结的描述可以看出来,K-Means算法的关键有三点:(1)我们怎么知道要分几类?也就是说这个K是怎么确定的?(2)K确定了后,怎样确定K个初始的中心点呢?(3)各个点到中心点的距离是怎么算的呢?

  • 这个K值,很多时候都是根据实际需求直接指定的。如果不能指定,可以根据数据可视化的效果再来指定K值;还可以将K从2开始累加,看看分类的效果来确定一个K值。
  • K个初始中心点,当然可以随机指定。实际中,随机指定可能效果不好。那我们还有两个办法:(1)选择彼此距离尽可能远的K个点;(2)先对数据用层次聚类算法或其它一些聚类算法聚类,得到K个簇之后,从每个类簇中选择一个点,该点可以是该类簇的中心点,或者是距离类簇中心点最近的那个点。
  • 关于距离计算。点是由几个数来描述的(比如身高、体重来代表一个人),这几个数做分量可以构成一个向量。向量出来了,就好办啦,什么欧式距离、切比雪夫距离、曼哈顿距离、闵可夫斯基距离等等等等都可以往上整,甚至你可以根据需要自己定义一种距离计算方案。

06

小结

本文概要讲了数据离散化和K-Means算法的理论基础。

数据离散化其实是将很紧密的、取值可能性很多的数给分组,让每个点的可能取值变少,就像0-100分的可能的成绩取值给离散化成:不及格、及格、良好、优秀这四种可能取值。比如模数转换。

K-Means聚类关键就是3条:K值、中心点、距离。

具体的Python实现方法,请期待下一篇文章。

0 人点赞