数据分析实战 45 讲
陈旸
清华大学计算机博士
85359 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
第二模块:数据分析算法篇 (20讲)
第四模块:数据分析工作篇 (2讲)
数据分析实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

26丨K-Means(上):如何给20支亚洲球队做聚类?

今天我来带你进行 K-Means 的学习。K-Means 是一种非监督学习,解决的是聚类问题。K 代表的是 K 类,Means 代表的是中心,你可以理解这个算法的本质是确定 K 类的中心点,当你找到了这些中心点,也就完成了聚类。
那么请你和我思考以下三个问题:
如何确定 K 类的中心点?
如何将其他点划分到 K 类中?
如何区分 K-Means 与 KNN?
如果理解了上面这 3 个问题,那么对 K-Means 的原理掌握得也就差不多了。
先请你和我思考一个场景,假设我有 20 支亚洲足球队,想要将它们按照成绩划分成 3 个等级,可以怎样划分?

K-Means 的工作原理

对亚洲足球队的水平,你可能也有自己的判断。比如一流的亚洲球队有谁?你可能会说伊朗或韩国。二流的亚洲球队呢?你可能说是中国。三流的亚洲球队呢?你可能会说越南。
其实这些都是靠我们的经验来划分的,那么伊朗、中国、越南可以说是三个等级的典型代表,也就是我们每个类的中心点。
所以回过头来,如何确定 K 类的中心点?一开始我们是可以随机指派的,当你确认了中心点后,就可以按照距离将其他足球队划分到不同的类别中。
这也就是 K-Means 的中心思想,就是这么简单直接。你可能会问:如果一开始,选择一流球队是中国,二流球队是伊朗,三流球队是韩国,中心点选择错了怎么办?其实不用担心,K-Means 有自我纠正机制,在不断的迭代过程中,会纠正中心点。中心点在整个迭代过程中,并不是唯一的,只是你需要一个初始值,一般算法会随机设置初始的中心点。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据分析实战 45 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(46)

  • 最新
  • 精选
  • third
    置顶
    两者的区别的比喻是, Kmeans开班,选老大,风水轮流转,直到选出最佳中心老大 Knn小弟加队伍,离那个班相对近,就是那个班的 一群人的有些人想要聚在一起 首先大家民主(无监督学习)随机选K个老大(随机选择K个中心点) 谁跟谁近,就是那个队伍的人(计算距离,距离近的聚合到一块) 随着时间的推移,老大的位置在变化(根据算法,重新计算中心点) 直到选出真正的中心老大(重复,直到准确率最高) Knn 一个人想要找到自己的队伍 首先听从神的旨意(有监督学习),随机最近的几个邻居 看看距离远不远(根据算法,计算距离) 近的就是一个班的了(属于哪个分类多,就是哪一类) #输入数据 #数据探索 import pandas as pd data=pd.read_csv("./26/data.csv",encoding='gbk') # print(data)数据符合完整合一,数据质量较高 #提取数据 train_x=data[["2019年国际排名","2018世界杯","2015亚洲杯"]] #数据规范化 from sklearn import preprocessing ss=preprocessing.StandardScaler() train_ss_x=ss.fit_transform(train_x) #对数据进行拟合并预测 from sklearn.cluster import KMeans kmeans=KMeans(n_clusters=5) kmeans.fit(train_ss_x) pre=kmeans.predict(train_ss_x) #数据对比 train_x=pd.DataFrame(train_x) result=pd.concat((data,pd.DataFrame(pre)),axis=1) result.rename({0:u'聚类'},axis=1,inplace=True) print(result)

    编辑回复: 举例很生动,代码也正确。大家可以看下。

    2
    34
  • Lee
    置顶
    # coding: utf-8 from sklearn.cluster import KMeans from sklearn import preprocessing import pandas as pd import numpy as np # 输入数据 data = pd.read_csv(r'F:\Python\notebook\K-Means\kmeans-master\data.csv', encoding = 'gbk') data.head() train_x = data[["2019年国际排名","2018世界杯","2015亚洲杯"]] df = pd.DataFrame(train_x) kmeans = KMeans(n_clusters=5) # 规范化 min_max_scaler=preprocessing.StandardScaler() 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 0 1 日本 60 15 5 3 2 韩国 61 19 2 3 3 伊朗 34 18 6 3 4 沙特 67 26 10 0 5 伊拉克 91 40 4 0 6 卡塔尔 101 40 13 4 7 阿联酋 81 40 6 0 8 乌兹别克斯坦 88 40 8 0 9 泰国 122 40 17 4 10 越南 102 50 17 4 11 阿曼 87 50 12 2 12 巴林 116 50 11 2 13 朝鲜 110 50 14 2 14 印尼 164 50 17 1 15 澳洲 40 30 1 3 16 叙利亚 76 40 17 4 17 约旦 118 50 9 2 18 科威特 160 50 15 1 19 巴勒斯坦 96 50 16 4

    编辑回复: 正确

    9
  • 白夜
    然后我们再重新计算这三个类的中心点,如何计算呢?最简单的方式就是取平均值,然后根据新的中心点按照距离远近重新分配球队的分类,再根据球队的分类更新中心点的位置。计算过程这里不展开,最后一直迭代(重复上述的计算过程:计算中心点和划分分类)到分类不再发生变化。 老师,这段可以再解释一下吗?没计算过程不太理解

    编辑回复: 同一个类别下的平均值。比如都属于同一个类别里面有10个点,那么新的中心点就是这10个点的中心点,一种简单的方式就是取平均值。比如我在文章里举了足球队的例子,一共有3个指标,每个球队都有这三个指标的特征值,那么新的中心点,就是取这个类别中的这些点 这三个指标特征值的平均值。。

    3
    10
  • 乃鱼同学
    K-Means 是聚类算法:经常做坏事的人 ,就是坏人。 KNN 是分类算法:坏人经常做坏事。 我对孩子就是这么说的。

    作者回复: 哈哈哈 这么说很形象

    6
  • 听妈妈的话
    代码里的第八行应该去掉列名里的空格: train_x = data[['2019年国际排名','2018世界杯','2015亚洲杯']] Z-score标准化的代码:train_x=preprocessing.scale(train_x) 国家 2019年国际排名 2018世界杯 2015亚洲杯 聚类 0 中国 73 40 7 3 1 日本 60 15 5 1 2 韩国 61 19 2 1 3 伊朗 34 18 6 1 4 沙特 67 26 10 1 5 伊拉克 91 40 4 3 6 卡塔尔 101 40 13 0 7 阿联酋 81 40 6 3 8 乌兹别克斯坦 88 40 8 3 9 泰国 122 40 17 4 10 越南 102 50 17 4 11 阿曼 87 50 12 0 12 巴林 116 50 11 0 13 朝鲜 110 50 14 0 14 印尼 164 50 17 2 15 澳洲 40 30 1 1 16 叙利亚 76 40 17 4 17 约旦 118 50 9 0 18 科威特 160 50 15 2 19 巴勒斯坦 96 50 16 4

    作者回复: Good Job

    3
    4
  • iamtalent123
    老师,请问为什么要对train_x转化为datadframe格式呢?df=pd.DataFrame(train_x),df有什么用呢?

    编辑回复: 可以不用转换,之前已经用了: data = pd.read_csv('data.csv', encoding='gbk') train_x = data[["2019年国际排名","2018世界杯","2015亚洲杯"]] 得到的train_x是DataFrame数据结构,你也可以通过查看type(train_x),所以不用再转换了。

    2
    4
  • juixv3937
    为什么,你们的代码,运行出来跟我的结果都不一样

    作者回复: KMeans每次运行结果不一定都相同,有一定随机性

    2
    2
  • 周飞
    k-means的算法原理就是: 1.选择几个初始的中心点。 2.计算每个点到各个中心点的距离,然后把每个点划分到距离最近的中心点所在的类。 3.更新中心点的值。对于每个类,计算类中所有数据的平均值,把平均值作为新的中心点。 4.重复 2 和4 步骤,直到每个类中的数据不再变化,或者到达指定的迭代步数。

    作者回复: 整理的不错

    2
  • FORWARD―MOUNT
    如何调整聚类中心没听懂

    编辑回复: 取特征值的平均值为中心点。

    2
    2
  • Jack
    老师,对于K-Means算法,我们如何评估模型的好坏,常用的评价指标都有哪些呢?

    作者回复: 一般使用轮廓系数(越大越好)或者误差平方和(即SSE,一般用于手肘法中确认K值的拐点)

    1
收起评论
显示
设置
留言
46
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部