数据分析实战45讲
陈旸
清华大学计算机博士
立即订阅
17314 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要数据分析能力?
免费
第一模块:数据分析基础篇 (16讲)
01丨数据分析全景图及修炼指南
02丨学习数据挖掘的最佳路径是什么?
03丨Python基础语法:开始你的Python之旅
04丨Python科学计算:用NumPy快速处理数据
05丨Python科学计算:Pandas
06 | 学数据分析要掌握哪些基本概念?
07 | 用户画像:标签化就是数据的抽象能力
08 | 数据采集:如何自动化采集数据?
09丨数据采集:如何用八爪鱼采集微博上的“D&G”评论
10丨Python爬虫:如何自动化下载王祖贤海报?
11 | 数据科学家80%时间都花费在了这些清洗任务上?
免费
12 | 数据集成:这些大号一共20亿粉丝?
13 | 数据变换:考试成绩要求正态分布合理么?
14丨数据可视化:掌握数据领域的万金油技能
15丨一次学会Python数据可视化的10种技能
16丨数据分析基础篇答疑
第二模块:数据分析算法篇 (20讲)
17 丨决策树(上):要不要去打篮球?决策树来告诉你
18丨决策树(中):CART,一棵是回归树,另一棵是分类树
19丨决策树(下):泰坦尼克乘客生存预测
20丨朴素贝叶斯分类(上):如何让机器判断男女?
21丨朴素贝叶斯分类(下):如何对文档进行分类?
22丨SVM(上):如何用一根棍子将蓝红两色球分开?
23丨SVM(下):如何进行乳腺癌检测?
24丨KNN(上):如何根据打斗和接吻次数来划分电影类型?
25丨KNN(下):如何对手写数字进行识别?
26丨K-Means(上):如何给20支亚洲球队做聚类?
27丨K-Means(下):如何使用K-Means对图像进行分割?
28丨EM聚类(上):如何将一份菜等分给两个人?
29丨EM聚类(下):用EM算法对王者荣耀英雄进行划分
30丨关联规则挖掘(上):如何用Apriori发现用户购物规则?
31丨关联规则挖掘(下):导演如何选择演员?
32丨PageRank(上):搞懂Google的PageRank算法
33丨PageRank(下):分析希拉里邮件中的人物关系
34丨AdaBoost(上):如何使用AdaBoost提升分类器性能?
35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?
36丨数据分析算法篇答疑
第三模块:数据分析实战篇 (7讲)
37丨数据采集实战:如何自动化运营微博?
38丨数据可视化实战:如何给毛不易的歌曲做词云展示?
39丨数据挖掘实战(1):信用卡违约率分析
40丨数据挖掘实战(2):信用卡诈骗分析
41丨数据挖掘实战(3):如何对比特币走势进行预测?
42丨当我们谈深度学习的时候,我们都在谈什么?
43丨深度学习(下):如何用Keras搭建深度学习网络做手写数字识别?
第四模块:数据分析工作篇 (2讲)
44丨如何培养你的数据分析思维?
45丨求职简历中没有相关项目经验,怎么办?
加餐 (1讲)
加餐丨在社交网络上刷粉刷量,技术上是如何实现的?
结束语 (1讲)
结束语丨当大家都在讲知识和工具的时候,我更希望你重视思维和实战
数据分析实战45讲
登录|注册

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

陈旸 2019-02-11
今天我来带你进行 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据分析实战45讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(30)

  • 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)

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

    2019-02-19
    14
  • 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

    编辑回复: 正确

    2019-02-14
    5
  • 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),所以不用再转换了。

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

    老师,这段可以再解释一下吗?没计算过程不太理解

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

    2019-02-15
    1
    4
  • 听妈妈的话
    代码里的第八行应该去掉列名里的空格:
    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
    2019-03-22
    2
    3
  • juixv3937
    为什么,你们的代码,运行出来跟我的结果都不一样
    2019-08-11
    1
  • Aries
    老师,怎么更换距离计算方法
    2019-04-27
    1
  • FORWARD―MOUNT
    如何调整聚类中心没听懂

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

    2019-02-18
    1
    1
  • Ronnyz
    from sklearn.cluster import KMeans

    from sklearn import preprocessing

    import numpy as np

    import pandas as pd



    #输出数据

    data=pd.read_csv('./kmeans-master/data.csv',encoding ='gbk')

    train_x = data[['2019年国际排名','2018世界杯','2015亚洲杯']]



    #规范化数据

    min_max_scaler=preprocessing.MinMaxScaler()

    train_x_mm=min_max_scaler.fit_transform(train_x)

    # print(train_x)



    #构建kmeans聚类器

    kmeans = KMeans(n_clusters=3)

    kmeans.fit(train_x_mm)

    pred_y=kmeans.predict(train_x_mm)



    #合并聚类结果

    result = pd.concat((data,pd.DataFrame(pred_y)),axis=1)

    result.rename({0:u'聚类'},axis=1,inplace=True)

    print(result)

    print('\n')





    #练习:K-Means=5,且采用标准化方式规范化



    #规范化数据StandScaler

    ss=preprocessing.StandardScaler()

    train_x_z=ss.fit_transform(train_x)

    print(train_x_z)



    #构建kmeans聚类器

    kmeans = KMeans(n_clusters=5)

    kmeans.fit(train_x_z)

    pred2_y=kmeans.predict(train_x_z)



    #合并聚类结果

    result = pd.concat((data,pd.DataFrame(pred2_y)),axis=1)

    result.rename({0:u'聚类'},axis=1,inplace=True)

    print(result)
    2019-11-18
  • 吴乃圩
    K-Means 是聚类算法:经常做坏事的人 ,就是坏人。
    KNN 是分类算法:坏人经常做坏事。
    我对孩子就是这么说的。
    2019-10-08
  • Yafei
    这也就是 K-Means 的中心思想,就是这么简单直接。你可能会问:如果一开始,选择一流球队是中国,二流球队是伊朗,三流球队是韩国,中心点选择错了怎么办?其实不用担心,K-Means 有自我纠正机制,在不断的迭代过程中,会纠正中心点。中心点在整个迭代过程中,并不是唯一的,只是你需要一个初始值,一般算法会随机设置初始的中心点。
    老师,这段是否表述有误,如果你一开始就给中国一流球队的标签,在计算所有点到中国距离的平均距离过程中,分类点会收敛到这类标签的中心点,但是标签还是一流球队,并不会改变,变化的仅是分类点。因此,对于聚类,我们只是将所有样本点归到一个类别下,具体类别的标签应该是我们自己来标记的。如理解不对,还望指正!

    编辑回复: 对 可以这么理解,你可以理解是K=3代表是三个类,分别对应Class1, Class2, Class3。我们需要先给这三个类分别指定3个中心点,然后做聚类。最后的聚类标签含义,是我们来标记的。

    2019-07-01
  • 张晓辉
    #coding:utf-8
    from sklearn.cluster import KMeans
    from sklearn import preprocessing
    import pandas as pd
    import numpy as np

    data = pd.read_csv('data.csv', encoding='utf-8')
    train_x = data[["2019年国际排名", "2018世界杯", "2015亚洲杯"]]
    df = pd.DataFrame(train_x)
    kmeans = KMeans(n_clusters=5)
    std = preprocessing.StandardScaler()
    #min_max_scaler = preprocessing.MinMaxScaler()
    #train_x = min_max_scaler.fit_transform(train_x)
    train_x = std.fit_transform(train_x)
    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-05-23
  • Frederick
    老师,我想问下,决策树可以用来聚类吗,如果可以,要怎么做呢?
    2019-05-19
  • Sam.张朝
    运行一次,结果变化一次。
    2019-05-09
  • Sam.张朝
    文章里的代码也好,问题的解决代码也好,中国都会在0 和2 之间变化。运行一次,变化一次。
    2019-05-09
    2
  • 老师,想问个问题,为何我计算出来的结果正好相反,就是后面聚类生成的0、1、2 这些数据,最弱的队归位来0类,一流队归类来2类,看留言里的代码大家计算出来的结果也不尽相同,想问下老师,是不是K-Means结果只是起到聚类的效果,没有展示其它属性的效果
    2019-04-19
  • 周飞
    分为5来的代码:
    # coding: utf-8
    from sklearn.cluster import KMeans
    from sklearn import preprocessing
    import pandas as pd
    import numpy as np
    # 输入数据
    data = pd.read_csv('data.csv', encoding='gbk')
    print(data)
    train_x = data[["2019年国际排名","2018世界杯","2015亚洲杯"]]
    df = pd.DataFrame(train_x)
    kmeans = KMeans(n_clusters=5)
    # 规范化到 [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)
    result.sort_values('聚类',inplace=True)
    print(result)
    运行结果:
            国家 2019年国际排名 2018世界杯 2015亚洲杯 聚类
    0 中国 73 40 7 0
    5 伊拉克 91 40 4 0
    7 阿联酋 81 40 6 0
    8 乌兹别克斯坦 88 40 8 0
    18 科威特 160 50 15 1
    14 印尼 164 50 17 1
    1 日本 60 15 5 2
    2 韩国 61 19 2 2
    3 伊朗 34 18 6 2
    4 沙特 67 26 10 2
    15 澳洲 40 30 1 2
    17 约旦 118 50 9 3
    11 阿曼 87 50 12 3
    12 巴林 116 50 11 3
    13 朝鲜 110 50 14 3
    16 叙利亚 76 40 17 4
    9 泰国 122 40 17 4
    6 卡塔尔 101 40 13 4
    10 越南 102 50 17 4
    19 巴勒斯坦 96 50 16 4
    2019-04-14
  • 周飞
    k-means的算法原理就是:
    1.选择几个初始的中心点。
    2.计算每个点到各个中心点的距离,然后把每个点划分到距离最近的中心点所在的类。
    3.更新中心点的值。对于每个类,计算类中所有数据的平均值,把平均值作为新的中心点。
    4.重复 2 和4 步骤,直到每个类中的数据不再变化,或者到达指定的迭代步数。
    2019-04-14
  • 滨滨
    Kmeans开班,选老大,风水轮流转,直到选出最佳中心老大
    Knn小弟加队伍,离那个班相对近,就是那个班的

    一群人的有些人想要聚在一起
    首先大家民主(无监督学习)随机选K个老大(随机选择K个中心点)
    谁跟谁近,就是那个队伍的人(计算距离,距离近的聚合到一块)
    随着时间的推移,老大的位置在变化(根据算法,重新计算中心点)
    直到选出真正的中心老大(重复,直到准确率最高)

    Knn
    一个人想要找到自己的队伍
    首先听从神的旨意(有监督学习),随机最近的几个邻居
    看看距离远不远(根据算法,计算距离)
    近的就是一个班的了(属于哪个分类多,就是哪一类)
    2019-03-31
  • 跳跳
    k-means的原理是:先假定有要聚类个数个中心点,然后根据中心点对其余点分类。接着重新计算中心点,计算的时候采用取均值的方式,再重新划分中心点,再对其余点分类。以此类推
    # coding: utf-8
    from sklearn.cluster import KMeans
    from sklearn import preprocessing
    import pandas as pd
    import numpy as np
    # 输入数据
    data = pd.read_csv('data1.csv', encoding='gbk')
    train_x = data[["2019年国际排名","2018世界杯","2015亚洲杯"]]
    df = pd.DataFrame(train_x)
    kmeans = KMeans(n_clusters=5)
    # 规范化到标准空间
    ss = preprocessing.StandardScaler()
    train_x = ss.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)
    k-means分成5类在代码中体现为n_clusters=5,0-1标准化体现在StandardScaler

    2019-03-06
收起评论
30
返回
顶部