Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >数据分析|透彻地聊聊k-means聚类的原理和应用

数据分析|透彻地聊聊k-means聚类的原理和应用

作者头像
1480
发布于 2020-02-19 05:30:29
发布于 2020-02-19 05:30:29
1.6K00
代码可运行
举报
文章被收录于专栏:数据分析1480数据分析1480
运行总次数:0
代码可运行

K-Means 是一种非监督学习,解决的是聚类问题。K 代表的是 K 类,Means 代表的是中心,你可以理解这个算法的本质是确定 K 类的中心点。当你找到了中心点,也就完成了聚类!

可以从以下三个角度来梳理k-means:

如何确定 K 类的中心点? 如何将其他点划分到k类中? 如何区分k-means与k-近邻算法?

为了对k-means有个感性的认识,我们从熟悉的场景亚洲足球队的水平开始谈起:

熟悉足球的朋友可能心理已经有了预期?你可能会说,”伊朗,韩国“一流水平,中国”二流水平“,越南”三流水平“。这样的猜测是基于我们的经验。

那么,伊朗,中国,越南就是三个等级的代表---中心。

那么如何确定k类的中心了?一开始我们是随机指认的,当确定了中心点后,我们就可以按照距离将其它足球队划分到不同的类别中。

在这里我们默认k=3,在工业界k的选择是个难事!但我们可以通过其它方式来确定k,后文会讲到。

从上面的描述中,我们可以抽象出聚类方法的步骤:

1. 随机从数据集中选择k个点作为我们聚类的中心点; 2. 讲每个点分配到离它最近的类中心点,就形成了k类。然后重新计算每个类的中心点(比如取各类的均值作为新的中心点) 3. 重复第2步,直到类不再发生变化,或者设置最大迭代次数,让算法收敛。

下面举例说明,上述过程:

其中 2019 年国际足联的世界排名,2015 年亚洲杯排名均为实际排名,2018年,很多球队没有入围决赛,进入决赛圈的有自己的排名,没有进入决赛圈我们按照以下原则来给其一个排名:

如果是亚洲区域入选赛12强的队伍,设置为40名 如果没有进入亚洲区域预选赛,设置为50名

数据太过于分散,量级相差过大,通过特征工程中的最大最小归一化来对数据进行处理(也可以是z-评分归一化),得到如下的数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#最大最小归一化处理
# coding:utf-8
from sklearn import preprocessing
import numpy as np
# 初始化数据,每一行表示一个样本,每一列表示一个特征
x = np.array([[ 0., -3.,  1.],
              [ 3.,  1.,  2.],
              [ 0.,  1., -1.]])
# 将数据进行 [0,1] 规范化
min_max_scaler = preprocessing.MinMaxScaler()
minmax_x = min_max_scaler.fit_transform(x)
print minmax_x

#z-评分归一化处理
from sklearn import preprocessing
import numpy as np
# 初始化数据
x = np.array([[ 0., -3.,  1.],
              [ 3.,  1.,  2.],
              [ 0.,  1., -1.]])
# 将数据进行 Z-Score 规范化
scaled_x = preprocessing.scale(x)

接下来,开始计算各个足球队举例k类中心点的距离,距离的距离方式有很多,这里我们选择欧式距离。

那么你是如何计算中国与日本的距离? 采用欧式距离,默认19年,18年,15年的数据权重是一样的,比如中国与日本的距离:

根据初始随机选择的k类中心点:中国,韩国,日本,我们计算各俱乐部与三类中心点的距离,各俱乐部就近选择中心点(就有了划分这一列)。划分这一列是我们迭代一次后的聚类结果,显然不是最优。

那么如何更新中心点了?

选择同一类别下各个俱乐部三个指标下各自的平均值作为新的聚类中心(聚类中心是三个特征值哦)。

为什么会使用均值作为中心点的选择呢?这主要是由于我们目标函数的设置有关。我们使用误差平方和作为聚类的目标函数,就要求我们最终选择均值为聚类中心点迭代的原则。

这样不端迭代,直到达到迭代次数或是类别不再发生变化,结束。

最终的聚类结果,如下图:

如何使用 sklearn 中的 K-Means 算法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding: utf-8
from sklearn.cluster import KMeans
from sklearn import preprocessing
import pandas as pd
import numpy as np
# 输入数据
#np.random.seed(1234) #不加随机数种子,每次聚类结果都不一样
data = pd.read_csv('data.csv', encoding='gbk')
train_x = data[["2019 年国际排名 ","2018 世界杯 ","2015 亚洲杯 "]]
df = pd.DataFrame(train_x)
kmeans = KMeans(n_clusters=3)
# 规范化到 [0,1] 空间
min_max_scaler=preprocessing.MinMaxScaler()
train_x=min_max_scaler.fit_transform(train_x)
# kmeans 算法
kmeans.fit(train_x)
predict_y = kmeans.predict(train_x)
# 合并聚类结果,插入到原数据中
result = pd.concat((data,pd.DataFrame(predict_y)),axis=1)
result.rename({0:u'聚类'},axis=1,inplace=True)
print(result)


国家  2019年国际排名  2018世界杯  2015亚洲杯  聚类
0     中国       73     40       7   2
1     日本       60     15       5   0
2     韩国       61     19       2   0
3     伊朗       34     18       6   0
4     沙特       67     26       10   0
5    伊拉克      91     40       4   2
6    卡塔尔      101    40       13   1
7    阿联酋      81     40       6   2
8  乌兹别克斯坦   88     40       8   2
9     泰国      122     40       17   1
10    越南      102     50       17   1
11    阿曼      87      50       12   1
12    巴林      116     50       11   1
13    朝鲜      110     50       14   1
14    印尼      164     50       17   1
15    澳洲      40      30       1   0
16   叙利亚     76      40       17   1
17    约旦      118     50       9   1
18   科威特     160      50      15   1
19  巴勒斯坦     96      50      16   1

因为初始中心点是随机选择的,所以每次的聚类结果都不一样,这就要求我们加上随机数种子!加入随机数种子只是保证我们的结果稳定不变,并不代表当前的聚类结果就是最好的。也就是说,聚类结果依赖于初始中心点的选择!

参数设置:

当然 K-Means 只是 sklearn.cluster 一共提供了 9 种聚类方法,比如 Mean-shift,DBSCAN,Spectral clustering(谱聚类)等

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm='auto')

总结:

如何区分k-means与knn:

k-means是聚类算法,knn是有监督的分类算法;聚类没有标签,分类有标签

聚类算法中的k是k类,knn中的k是k个最近的邻居。

k-means优点:

计算简单,可解释性强。

k-means缺点:

需要确定分类数

,一般根据经验或者已经有预判,其次是根据R语言提供的暴力试错k值选择最合适的分类数k。

初始值的选取会影响最终聚类效果,并且目标函数

可能会达到局部最优解。这个有相应的改进方法,包括k-means++和二分k-means。

算法本身的局限性:对于类似下面圆形的数据集,聚类效果很差,主要是算法原因。所以还有其他的聚类算法,比如基于密度的方法等。

不适合发现非凸形状的簇或者大小差别较大的簇;

对噪声和异常点比较敏感

End.

作者:求知鸟

来源:知乎

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据分析1480 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【白话机器学习】算法理论+实战之K-Means聚类算法
如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法:
石晓文
2020/03/24
1.5K0
【白话机器学习】算法理论+实战之K-Means聚类算法
数据分析入门系列教程-K-Means实战
上一节我们讲解了 K-Means 算法的原理,并且手动实现了一个 K-Means 算法函数,今天我们一起来完成相关的实战内容。
周萝卜
2020/12/15
6100
【机器学习笔记之一】深入浅出学习K-Means算法
摘要:在数据挖掘中,K-Means算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。 在数据挖掘中,K-Means算法是一种cluster analysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。 问题 K-Means算法主要解决的问题如下图所示。我们可以看到,在图的左边有一些点,我们用肉眼可以看出来有四个点群,但是我们怎么通过计算机程序找出这几个点群来呢?于是就出现了我们的K-Means算法(W
Angel_Kitty
2018/04/09
5980
【机器学习笔记之一】深入浅出学习K-Means算法
算法入门(九)—— 无监督学习介绍与K-Means实战(内附Kaggle实战源码与数据集)
监督学习到这里就算是结束了,接下来我们一起来看你一下无监督学习,无监督学习是机器学习中的一个重要分支,但它看起来有点“神秘”——你会发现,数据集里并没有告诉你哪个是对的答案,也没有提供标签告诉你什么是正解。那么,问题来了:我们到底在做什么呢?别急,今天就带你一起揭开这个“神秘面纱”。
万事可爱^
2025/01/23
1460
算法入门(九)—— 无监督学习介绍与K-Means实战(内附Kaggle实战源码与数据集)
数据挖掘:K-Means 算法
最近在学习一些数据挖掘的算法,看到了这个算法,也许这个算法对你来说很简单,但对我来说,我是一个初学者,我在网上翻看了很多资料,发现中文社区没有把这个问题讲得很全面很清楚的文章,所以,把我的学习笔记记录下来,分享给大家。 在数据挖掘中, k-Means 算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。 1问题 K-Means算法主要解决的问题如下图所示。我们可以看到,在图的左边有一些点,我们用肉眼可以看出来有四个点
机器学习AI算法工程
2018/03/09
1.1K0
数据挖掘:K-Means 算法
聚类(二):k-means算法(R&python)
聚类算法属于无监督的机器学习算法,即没有类别标签y,需要根据数据特征将相似的数据分为一组。k-means为聚类算法中最简单、常见的一种,通过计算距离,将相似性高的数据分在一起。 算法流程 随机选择k个
三猫
2018/04/10
1.2K0
聚类(二):k-means算法(R&python)
K_means算法案例分析
得出当聚类中心数量为3的时候,轮廓系数最大;此时,也可以观察到聚类中心数量为3也符合数据的分布特点,的确是相对较为合理的类簇数量。
用户3577892
2020/06/11
8700
机器学习系列:(六)K-Means聚类
K-Means聚类 前面几章我们介绍了监督学习,包括从带标签的数据中学习的回归和分类算法。本章,我们讨论无监督学习算法,聚类(clustering)。聚类是用于找出不带标签数据的相似性的算法。我们将介绍K-Means聚类思想,解决一个图像压缩问题,然后对算法的效果进行评估。最后,我们把聚类和分类算法组合起来,解决一个半监督学习问题。 在第一章,机器学习基础中,我们介绍过非监督学习的目的是从不带标签的训练数据中挖掘隐含的关系。聚类,或称为聚类分析(cluster analysis)是一种分组观察的方法,将更具
小莹莹
2018/04/23
1.7K0
机器学习系列:(六)K-Means聚类
Python数据分析笔记:聚类算法之K均值
我们之前接触的所有机器学习算法都有一个共同特点,那就是分类器会接受2个向量:一个是训练样本的特征向量X,一个是样本实际所属的类型向量Y。由于训练数据必须指定其真实分类结果,因此这种机器学习统称为有监督学习。 然而有时候,我们只有训练样本的特征,而对其类型一无所知。这种情况,我们只能让算法尝试在训练数据中寻找其内部的结构,试图将其类别挖掘出来。这种方式叫做无监督学习。由于这种方式通常是将样本中相似的样本聚集在一起,所以又叫聚类算法。 下面我们介绍一个最常用的聚类算法:K均值聚类算法(K-Means)。 1、K
机器学习AI算法工程
2018/03/13
1.1K0
Python数据分析笔记:聚类算法之K均值
数学建模--K-Means聚类分析
对数据进行自动分组,使得同一组内的数据样本尽可能相似,不同组之间的数据样本尽可能不同,以此来完成用户细分,这就是聚类。
阑梦清川
2025/02/24
2910
数学建模--K-Means聚类分析
【技术分享】k-means、k-means++以及k-means||算法分析
k-means算法是聚类分析中使用最广泛的算法之一。它把n个对象根据它们的属性分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。
腾讯云TI平台
2019/07/03
6K0
聚类(Clustering) K-means算法
3.2 算法接受参数 k ;然后将事先输入的n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。
foochane
2019/05/23
6550
聚类(Clustering) K-means算法
机器学习20:聚类(k-means模型、高斯混合聚类模型)
在无监督学习中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据内在的性质及规律,其中,应用最广的是聚类算法。
用户5473628
2019/08/08
3K0
机器学习20:聚类(k-means模型、高斯混合聚类模型)
K-means 学习笔记
给定 K 值和 K 个初始类中心点,把每个点分到离其最近的类中心点所代表的类中,所有点分配完毕之后,根据一个类内的所有点重新计算该类的中心点(平均值),然后再迭代的进行分配点和更新类中心点的步骤,直至类中心点的变化很小,或者达到指定的迭代次数。
EmoryHuang
2022/10/31
4240
K-means 学习笔记
讲解K-Means聚类算法进行压缩图片
在计算机视觉领域中,图像压缩是一个重要的问题。在本文中,我们将介绍如何使用K-Means聚类算法来压缩图像。K-Means算法是一种常用的聚类算法,它可以将数据分成几个不同的簇,每个簇的数据点都具有相似的特征。
大盘鸡拌面
2023/12/15
4490
【聚类 | K-means】原理及推导流程(附模板代码,库&手撕实现)
🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)
计算机魔术师
2023/11/28
7500
【机器学习】K-means聚类的最优k值的选取(含代码示例)
数据科学领域中,聚类是一种无监督学习方法,它旨在将数据集中的样本划分成若干个组,使得同一组内的样本相似度高,而不同组之间的样本相似度低。K-means聚类是其中最流行的一种算法,因其简单、高效而广受青睐。然而,选择合适的K值(即聚类数)对于聚类结果至关重要。本文将探讨如何选取最优的K值,以确保K-means聚类算法能够揭示数据中的潜在模式。
程序员洲洲
2024/06/07
1.1K0
【机器学习】K-means聚类的最优k值的选取(含代码示例)
算法金 | 再见!!!K-means
今天我们来聊聊达叔 6 大核心算法之 —— k-means 算法。最早由斯坦福大学的 J. B. MacQueen 于 1967 年提出,后来经过许多研究者的改进和发展,成为了一种经典的聚类方法。吴恩达:机器学习的六个核心算法!
算法金
2024/06/14
1290
算法金 | 再见!!!K-means
K-means聚类算法
机器学习算法主要分为两大类:有监督学习和无监督学习,它们在算法思想上存在本质的区别。 有监督学习,主要对有标签的数据集(即有“参考答案”)去构建机器学习模型,但在实际的生产环境中,其实大量数据是处于没有被标注的状态,这时因为“贴标签”的工作需要耗费大量的人力,如果数据量巨大,或者调研难度大的话,生产出一份有标签的数据集是非常困难的。再者就算是使用人工来标注,标注的速度也会比数据生产的速度慢的多。
zhangjiqun
2024/12/14
1560
K-means聚类算法
[Python从零到壹] 十三.机器学习之聚类算法四万字总结(K-Means、BIRCH、树状聚类、MeanShift)
在过去,科学家会根据物种的形状习性规律等特征将其划分为不同类型的门类,比如将人种划分为黄种人、白种人和黑种人,这就是简单的人工聚类方法。聚类是将数据集中某些方面相似的数据成员划分在一起,给定简单的规则,对数据集进行分堆,是一种无监督学习。聚类集合中,处于相同聚类中的数据彼此是相似的,处于不同聚类中的元素彼此是不同的。本章主要介绍聚类概念和常用聚类算法,然后详细讲述Scikit-Learn机器学习包中聚类算法的用法,并通过K-Means聚类、Birch层次聚类及PAC降维三个实例加深读者印象。
Eastmount
2021/12/02
2.1K0
[Python从零到壹] 十三.机器学习之聚类算法四万字总结(K-Means、BIRCH、树状聚类、MeanShift)
推荐阅读
相关推荐
【白话机器学习】算法理论+实战之K-Means聚类算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验