【机器学习(2)】K-means算法原理分析及python实现(附代码和数据)

简介

K-means算法可以说是机器学习中最基础的算法之一了,大部分人入门机器学习都是从KNN和K-means开始的。

本算法的主要目的也是为了分类,但与KNN算法相比,本算法的不同之处在于:数据类型不同无监督学习
数据类型不同,指在上一篇文章中,我们使用KNN算法用于图像,而k-means算法适用范围一般不包括图像处理。它主要用来处理的数据类型类似于多维空间中的点,将这些点分类为k簇(类)是k-means的主要功能。当然,KNN也可以用于处理这种类型的数据。

无监督学习是相对于监督学习来说的。监督学习是指训练数据中,对每个训练数据都有相应的结果标注。如在KNN中,我们的所有图片实际上就构成了训练数据集,要分类出一张新图片,我们是找出“最近的”k张图片来查看他们的分类,自然这k张图片需要已经标注好正确的类别。而K-means不同,它不需要对训练集(实际上,k-means的数据集也不是传统意义的训练集)进行标注,就可以把数据分成k类,但无法告诉你这k类分别是什么。


原理

k-means的原理可以描述为

  1. 在数据范围内以均匀分布随机生成与数据相同维度的k个点,作为初始的质心
  2. 计算每一个样本数据与每一个质心的距离(可以是欧氏距离或曼哈顿距离等,但一般采用欧氏距离),并将其分组到距离最近的质心
  3. 分组结束后,对于每一个分组,计算他们的中心(对分组每一个维度求均值,这也是算法名称的来由:均值means)
  4. 更新质心的位置(移动到对应分组的中心)
  5. 以上 2,3,4步称为一个迭代,重复迭代,直到质心不移动或达到设定的最大的迭代次数。

k作为本算法的一个超参数,这里是由实际情况和具体问题确定的,没有完全标准的确定方法。

这样讲似乎不太直观,我们用例子来说明。
本例中程序和数据下载
本例中用正态分布生成了三组共五百个二维数据,每个数据用(x,y)的坐标形式来表示,即可在二维空间中表示,如下图
这里写图片描述
用我们人类的眼和思维去观察可以很轻易的将这三组数据分类,但对于机器来说就稍微有点麻烦了。
第一步,随机生成质心
在整张图的范围内随机生成k个质心,这里k取3,图中红点表示随机生成的质心。
这里写图片描述

第二和第三步,计算分别计算每一个样本与三个质心的距离,使每个样本分组于距离最近质心。
这里属于不同分组的点使用了不同颜色作为标注。
这里写图片描述

第四步,更新质心位置,也就是将质心移动到分组的中心处。
这里写图片描述

此时再重新计算分组,可以看出这次分类结果已经算是比较明显了
这里写图片描述

重复二三四步,直到质心位置不发生或只发生微小的变化,算法结束
这里写图片描述
结合图示我们不难看出,某个质心最后属于哪个簇,实际上是和随机出来的初始位置一一对应的。每一次求均值,对于某个质心来说有两种情况。

  1. 如果有分组于它的数据属于不同的簇,那么它移动的趋势趋于这些簇的中心位置;
  2. 如果分组于它的数据来源于同一个的簇,那么它就会向着该簇的中心移动。

如上图中,右下角两个质心(根据分组颜色不同我们称之为绿质心和黄质心)

可以看到绿质心一开始占据的簇分属于右上和右下,所以它会向着两个簇的中心移动,而黄质心则属于第二种情况,于是它会向右下簇的中心靠拢。

随后进行第二次迭代时,由于绿质心在两簇中间,它实际上是远离了右下簇,此时,右下簇原本属于绿质心的点现在距离黄质心比较近了。

于是,属于绿质心的点现在大部分是右上簇中的,它就转换为了第二种情况,于是它会朝着右上簇的中心移动,而黄质心也同样是朝着右下簇的中心移动。

所以,质心的初始位置和数据的分布很大程度影响了算法的精准度和收敛时间。更严重的是,在某些情况下,质心会被一小簇数据“欺骗”,从而陷入到局部最优解,无法达到全局最优。


代码实现与分析

首先从数据的读入开始。

import numpy as np

data = np.loadtxt("d:/data.csv", delimiter=
  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值