• third 置顶
    2019-02-19
    两者的区别的比喻是,
    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)
    展开

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

    
     14
  • Lee 置顶
    2019-02-14
    # 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
    展开

    编辑回复: 正确

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

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

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

     1
     5
  • iamtalent123
    2019-03-05
    老师,请问为什么要对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),所以不用再转换了。

     1
     4
  • 听妈妈的话
    2019-03-22
    代码里的第八行应该去掉列名里的空格:
    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

     2
     3
  • 吴乃圩
    2019-10-08
    K-Means 是聚类算法:经常做坏事的人 ,就是坏人。
    KNN 是分类算法:坏人经常做坏事。
    我对孩子就是这么说的。

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

    
     1
  • juixv3937
    2019-08-11
    为什么,你们的代码,运行出来跟我的结果都不一样

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

     1
     1
  • Aries
    2019-04-27
    老师,怎么更换距离计算方法
    
     1
  • FORWARD―MOUNT
    2019-02-18
    如何调整聚类中心没听懂

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

     1
     1
  • groot888
    2020-01-22
    老师,看到之前的算法,都先用训练数据训练出模型,再用测试数据跑出预测数据,但这篇文章没有训练数据训练模型的步骤,为啥直接就跑出预测数据了呢?
    
    
  • Geek_477c02
    2020-01-02
    数据处理部分,为什么能把排名作为正态分布???
    
    
  • twelve
    2019-12-30
    == 分5类(正太分布标准化) =======
            国家 2019年国际排名 2018世界杯 2015亚洲杯 聚类
    0 中国 73 40 7 2
    1 日本 60 15 5 1
    2 韩国 61 19 2 1
    3 伊朗 34 18 6 1
    4 沙特 67 26 10 1
    5 伊拉克 91 40 4 2
    6 卡塔尔 101 40 13 0
    7 阿联酋 81 40 6 2
    8 乌兹别克斯坦 88 40 8 2
    9 泰国 122 40 17 0
    10 越南 102 50 17 0
    11 阿曼 87 50 12 0
    12 巴林 116 50 11 4
    13 朝鲜 110 50 14 0
    14 印尼 164 50 17 3
    15 澳洲 40 30 1 1
    16 叙利亚 76 40 17 0
    17 约旦 118 50 9 4
    18 科威特 160 50 15 3
    19 巴勒斯坦 96 50 16 0
    展开
    
    
  • Ronnyz
    2019-11-18
    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)
    展开

    作者回复: 正确,Ronnyz的代码能力不错

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

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

    
    
  • 张晓辉
    2019-05-23
    #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)
    展开
    
    
  • Frederick
    2019-05-19
    老师,我想问下,决策树可以用来聚类吗,如果可以,要怎么做呢?

    作者回复: 主要用于分类 和 回归

    
    
  • Sam.张朝
    2019-05-09
    运行一次,结果变化一次。

    作者回复: 对 聚类算法有一定的随机性

    
    
  • Sam.张朝
    2019-05-09
    文章里的代码也好,问题的解决代码也好,中国都会在0 和2 之间变化。运行一次,变化一次。

    作者回复: 0 和 2只是label,关键是和谁聚在一起

     2
    
  • 滢
    2019-04-19
    老师,想问个问题,为何我计算出来的结果正好相反,就是后面聚类生成的0、1、2 这些数据,最弱的队归位来0类,一流队归类来2类,看留言里的代码大家计算出来的结果也不尽相同,想问下老师,是不是K-Means结果只是起到聚类的效果,没有展示其它属性的效果

    作者回复: 0, 1, 2只是label,关键是看 聚类出来的 谁和谁聚成了一类。这个数值没有具体含义的

    
    
  • 周飞
    2019-04-14
    分为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
    展开

    作者回复: Good Sharing

    
    
我们在线,来聊聊吧