• 机器学习——聚类之K-means(手动代码)


    这是我看下来,最简单的内容,哭了,K-means,so nice

    K-means,由于太过简单,不需要数学推导时,一时间甚至无从下指

    首先,K-means需要提前锚定几个点,然后让所有数据样本根据与这几个点的距离,将分别选择最短距离凑成一簇

    有那么点近水楼台先得月,兔子硬吃窝边草的意思

    然后所有样本分别站队分组后,每个组再重新选出新的锚定点:计算出所有特征各自的均值,作为新锚定点

    重复分组与计算新锚点,直到最终所有组的锚点不再改变,或是超过最大迭代次数。

    1. 确定初始锚点
    2. 数据样本分组
    3. 计算各组新锚点
    4. 重复2和3步,直到达标

    但非常关键的是,如何确定初始锚点?以及,需要几个初始锚点?

    需要几个初始锚点: 这个其实不好说,在scikit-learn里,默认是8个,但要想获得更好的聚类效果,一般可以调试选择最终表现较好的锚点数 N p o i n t N_{point} Npoint

    如何确定初始锚点: 可以随机,但是有一个优化选择初始锚点的方式,一般被称为K-means++

    K-means++:也是先确定了锚点数 N p o i n t N_{point} Npoint,然后,

    1. 首先随机选取一个锚点,此时,所有样本都归于当前锚点
    2. 计算出所有样本到锚点的距离,选择距锚点最远的样本点,作为新的锚点,
    3. 计算出所有样本到新锚点的距离,如果到新锚点距离更短,则分到新锚点组
    4. 然后再次分别计算所有样本到各自锚点的距离,选择各组中距离锚点最远的点,作为新锚点,(注意:如果已经有多个锚点,也是依次遍历多个锚点,生成新锚点)
    5. 依次循环234步,直到得到 N p o i n t N_{point} Npoint个锚点

    K-means++,仅仅是获取 N p o i n t N_{point} Npoint个新锚点,还要重新开始进行聚类,即

    1. 确定初始锚点
    ①. 首先随机选取一个锚点,此时,所有样本都归于当前锚点
    ②. 计算出所有样本到锚点的距离,选择距锚点最远的样本点,作为新的锚点,
    ③. 计算出所有样本到新锚点的距离,如果到新锚点距离更短,则分到新锚点组
    ④. 然后再次分别计算所有样本到各自锚点的距离,选择各组中距离锚点最远的点,作为新锚点,(注意:如果已经有多个锚点,也是依次遍历多个锚点,生成新锚点)
    ⑤. 依次循环234步,直到得到 N p o i n t N_{point} Npoint个锚点

    2. 数据样本分组
    3. 计算各组新锚点
    4. 重复2和3步,直到达标

    步骤很清晰,思路很明确,下笔如有神!开敲键盘~

    程序设计

    数据结构

    考虑到每个簇,有各自的锚点,还有分组的点,并且都有一样的计算距离的方式
    用字典或是创建一个类的对象来存储各个簇(组)的数据,也是可以的

    但考虑到,样本要同时与每个锚点计算并比较距离,如果是用对象的话呢,不太好在类之外进行比较

    因此,不如直接用字典存储,然后在外边定义一个计算距离的方法,直接在外边进行比较,会更方便吧

    那就是,一个字典,包含了多个组别,每个组别都有各自的锚点、分组数据、组均方误差

    字典 = {
    		"组1":[xxxx],
    		"组2":[xxxx]
    		# .......[xxxx]表示对应的锚点..........
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    但在对每个样本进行分类时,遇到点小麻烦,有两个思路:
    思路一:

    • 维护一张所有样本与所有组锚点距离的dataframe表,每次都计算出所有样本与新锚点的距离
    • 再给每个样本获取距离最小的对应锚点,并添加一个新列class,这个新列存的是每个样本的组别名
    • 再对组别名新列,进行分组聚合,也就是每个组都割裂开各自的数据(这里要注意,新列里的组别名要跟字典的组名保持一致)
    • 将割裂开的数据,依次计算各特征的均值作为新锚点,并对比旧锚点是否有改变
    • 判断是否需要再迭代:是否超迭代次数或锚点是否无改变?
    • 如果需要再迭代,那就继续循环,否则停止迭代,输出最终的分组锚点及数据

    思路二:

    • 所有锚点都存在一个列表里
    • 对一条数据,计算各样本与新锚点的距离,并存入一个新列表里。
    • 获取列表中距离最小的下标值,并获取到对应的锚点
    • 用pandas里的apply函数,对所有样本数据,进行相同的操作,最终得到每个样本的锚点
      如果是每个样本都单独去计算距离,再进行比较
      。。。。啊算了,思路一就挺好的,思路二还有些小问题。。。。

    啊,明天再说,今晚没心思敲键盘了。。。

    程序实现

    总体的分组效果,其实是很不错的!
    重点看推荐分值,因为推荐分值是有明显区别的,而专业度、回复速度、服务态度这些源数据本身设置的就差别不大

    D:\python3.10\python.exe D:/PycharmWork/venv/Machine_Learning/K_means.py
    a0
    专业度     2.709677
    回复速度    2.919355
    服务态度    3.870968
    推荐分值    1.016129
    dtype: float64
         专业度  回复速度  服务态度  推荐分值  ...         a4         a5         a6         a7
    6      3     4     4     0  ...  60.590829  32.865385  54.575625  13.114258
    18     2     2     3     0  ...  71.130511  36.096154  58.325625  15.051758
    56     3     4     3     0  ...  62.892416  32.788462  56.125625  14.176758
    60     4     2     3     2  ...  37.162257  11.634615  26.725625   6.301758
    70     2     2     3     2  ...  45.162257  19.326923  34.725625   5.051758
    ..   ...   ...   ...   ...  ...        ...        ...        ...        ...
    436    2     2     3     1  ...  57.146384  26.711538  45.525625   9.051758
    447    3     4     5     1  ...  46.305115  25.557692  42.225625   8.051758
    453    2     3     4     0  ...  66.209877  35.942308  57.175625  12.739258
    455    3     4     5     1  ...  46.305115  25.557692  42.225625   8.051758
    458    4     2     4     1  ...  46.844797  19.096154  35.975625   9.239258
    
    [62 rows x 13 columns]
    —————+++++++++++++++——————————
    a1
    专业度     4.991228
    回复速度    4.596491
    服务态度    4.675439
    推荐分值    8.991228
    dtype: float64
         专业度  回复速度  服务态度  推荐分值  ...        a4         a5         a6         a7
    0      5     5     5     8  ...  1.797178  15.942308   9.025625  30.051758
    1      4     4     5     9  ...  3.432099  19.634615   8.825625  33.676758
    7      5     4     5     9  ...  2.432099  18.788462   7.825625  37.301758
    20     5     5     5     9  ...  3.813051  22.557692  12.225625  40.051758
    25     5     4     5     9  ...  2.432099  18.788462   7.825625  37.301758
    ..   ...   ...   ...   ...  ...       ...        ...        ...        ...
    452    5     5     5     8  ...  1.797178  15.942308   9.025625  30.051758
    459    5     4     4     9  ...  2.733686  16.711538   7.375625  36.364258
    460    5     4     4     9  ...  2.733686  16.711538   7.375625  36.364258
    466    5     4     5    10  ...  6.447972  27.403846  13.025625  49.301758
    469    5     5     5     9  ...  3.813051  22.557692  12.225625  40.051758
    
    [114 rows x 13 columns]
    —————+++++++++++++++——————————
    a2
    专业度     5.000000
    回复速度    4.552941
    服务态度    3.329412
    推荐分值    9.670588
    dtype: float64
         专业度  回复速度  服务态度  推荐分值  ...         a4         a5         a6         a7
    4      5     5     4    10  ...   8.130511  29.096154  16.975625  51.114258
    8      5     5     3    10  ...  10.432099  29.019231  18.525625  52.176758
    10     5     5     4    10  ...   8.130511  29.096154  16.975625  51.114258
    15     5     5     4    10  ...   8.130511  29.096154  16.975625  51.114258
    31     5     5     3    10  ...  10.432099  29.019231  18.525625  52.176758
    ..   ...   ...   ...   ...  ...        ...        ...        ...        ...
    413    5     5     3    10  ...  10.432099  29.019231  18.525625  52.176758
    415    5     4     3     9  ...   5.035273  16.634615   8.925625  37.426758
    456    5     4     3     9  ...   5.035273  16.634615   8.925625  37.426758
    464    5     4     4    10  ...   6.749559  25.326923  12.575625  48.364258
    471    5     4     4    10  ...   6.749559  25.326923  12.575625  48.364258
    
    [85 rows x 13 columns]
    —————+++++++++++++++——————————
    a3
    专业度     5.000000
    回复速度    4.313725
    服务态度    3.019608
    推荐分值    7.549020
    dtype: float64
         专业度  回复速度  服务态度  推荐分值  ...        a4         a5         a6         a7
    5      5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    12     5     4     3     7  ...  3.003527   5.403846   4.525625  19.426758
    14     5     5     4     7  ...  2.082892   9.250000   7.375625  21.114258
    17     5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    22     5     4     3     7  ...  3.003527   5.403846   4.525625  19.426758
    23     5     5     3     7  ...  4.384480   9.173077   8.925625  22.176758
    39     5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    40     5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    50     5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    58     5     4     3     6  ...  4.987654   2.788462   5.325625  13.426758
    72     5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    75     5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    77     5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    121    5     4     3     7  ...  3.003527   5.403846   4.525625  19.426758
    124    5     4     3     7  ...  3.003527   5.403846   4.525625  19.426758
    145    5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    148    5     4     3     7  ...  3.003527   5.403846   4.525625  19.426758
    157    5     4     3     7  ...  3.003527   5.403846   4.525625  19.426758
    167    5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    170    5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    175    5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    184    5     4     3     7  ...  3.003527   5.403846   4.525625  19.426758
    205    5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    230    5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    236    5     4     3     6  ...  4.987654   2.788462   5.325625  13.426758
    240    5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    247    5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    248    5     4     3     7  ...  3.003527   5.403846   4.525625  19.426758
    253    5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    258    5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    278    5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    300    5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    305    5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    314    5     4     3     7  ...  3.003527   5.403846   4.525625  19.426758
    315    5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    317    5     3     3     7  ...  3.622575   3.634615   2.125625  18.676758
    332    5     4     3     7  ...  3.003527   5.403846   4.525625  19.426758
    334    5     4     3     7  ...  3.003527   5.403846   4.525625  19.426758
    354    5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    364    5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    367    5     4     3     6  ...  4.987654   2.788462   5.325625  13.426758
    375    5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    380    5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    397    5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    411    5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    422    5     3     3     7  ...  3.622575   3.634615   2.125625  18.676758
    431    5     4     3     8  ...  3.019400  10.019231   5.725625  27.426758
    433    5     4     3     7  ...  3.003527   5.403846   4.525625  19.426758
    449    5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    462    5     3     3     7  ...  3.622575   3.634615   2.125625  18.676758
    470    5     5     3     8  ...  4.400353  13.788462  10.125625  30.176758
    
    [51 rows x 13 columns]
    —————+++++++++++++++——————————
    a4
    专业度     5.000000
    回复速度    3.809524
    服务态度    4.650794
    推荐分值    7.492063
    dtype: float64
         专业度  回复速度  服务态度  推荐分值  ...        a4         a5        a6         a7
    2      5     4     4     8  ...  0.717813  10.096154  4.175625  26.364258
    9      5     4     4     8  ...  0.717813  10.096154  4.175625  26.364258
    21     5     5     5     7  ...  1.781305  11.326923  7.825625  22.051758
    24     5     4     4     7  ...  0.701940   5.480769  2.975625  18.364258
    29     5     4     4     8  ...  0.717813  10.096154  4.175625  26.364258
    ..   ...   ...   ...   ...  ...       ...        ...       ...        ...
    442    5     4     5     8  ...  0.416226  12.173077  4.625625  27.301758
    448    5     4     5     8  ...  0.416226  12.173077  4.625625  27.301758
    465    5     3     5     7  ...  1.019400   5.788462  1.025625  18.551758
    467    5     3     5     7  ...  1.019400   5.788462  1.025625  18.551758
    472    5     4     5     8  ...  0.416226  12.173077  4.625625  27.301758
    
    [63 rows x 13 columns]
    —————+++++++++++++++——————————
    a5
    专业度     4.923077
    回复速度    2.615385
    服务态度    3.461538
    推荐分值    5.192308
    dtype: float64
         专业度  回复速度  服务态度  推荐分值  ...         a4        a5         a6         a7
    11     5     3     3     6  ...   5.606702  1.019231   2.925625  12.676758
    19     5     2     3     5  ...  12.209877  0.634615   5.325625   9.926758
    42     5     2     3     5  ...  12.209877  0.634615   5.325625   9.926758
    47     5     2     4     5  ...   9.908289  0.711538   3.775625   8.864258
    62     5     2     3     5  ...  12.209877  0.634615   5.325625   9.926758
    101    5     2     4     5  ...   9.908289  0.711538   3.775625   8.864258
    108    5     2     3     6  ...   8.225750  1.250000   2.525625  13.926758
    111    5     3     4     5  ...   7.289242  0.480769   4.175625   7.614258
    139    4     3     3     4  ...  16.574956  2.634615  11.525625   3.051758
    165    5     3     3     5  ...   9.590829  0.403846   5.725625   8.676758
    179    5     3     5     5  ...   6.987654  2.557692   4.625625   8.551758
    196    5     2     3     6  ...   8.225750  1.250000   2.525625  13.926758
    199    5     2     3     6  ...   8.225750  1.250000   2.525625  13.926758
    203    5     2     3     5  ...  12.209877  0.634615   5.325625   9.926758
    216    5     3     3     6  ...   5.606702  1.019231   2.925625  12.676758
    259    5     3     4     5  ...   7.289242  0.480769   4.175625   7.614258
    289    5     2     3     5  ...  12.209877  0.634615   5.325625   9.926758
    306    5     2     4     5  ...   9.908289  0.711538   3.775625   8.864258
    323    4     2     4     4  ...  16.892416  2.942308   9.575625   3.239258
    344    5     4     5     5  ...   6.368607  4.326923   7.025625   9.301758
    360    5     4     3     5  ...   8.971781  2.173077   8.125625   9.426758
    391    5     4     3     5  ...   8.971781  2.173077   8.125625   9.426758
    404    5     2     3     5  ...  12.209877  0.634615   5.325625   9.926758
    405    5     3     5     5  ...   6.987654  2.557692   4.625625   8.551758
    444    5     3     3     6  ...   5.606702  1.019231   2.925625  12.676758
    457    5     3     3     6  ...   5.606702  1.019231   2.925625  12.676758
    
    [26 rows x 13 columns]
    —————+++++++++++++++——————————
    a6
    专业度     5.000
    回复速度    2.300
    服务态度    4.275
    推荐分值    6.900
    dtype: float64
         专业度  回复速度  服务态度  推荐分值  ...        a4        a5        a6         a7
    53     5     3     4     7  ...  1.320988  3.711538  0.575625  17.614258
    99     5     2     5     7  ...  3.638448  6.019231  0.625625  19.801758
    114    5     2     5     7  ...  3.638448  6.019231  0.625625  19.801758
    115    5     2     4     7  ...  3.940035  3.942308  0.175625  18.864258
    128    5     3     4     7  ...  1.320988  3.711538  0.575625  17.614258
    141    5     3     5     6  ...  3.003527  3.173077  1.825625  12.551758
    147    5     3     4     7  ...  1.320988  3.711538  0.575625  17.614258
    169    5     3     5     6  ...  3.003527  3.173077  1.825625  12.551758
    176    5     2     5     7  ...  3.638448  6.019231  0.625625  19.801758
    191    5     2     4     7  ...  3.940035  3.942308  0.175625  18.864258
    192    5     2     5     7  ...  3.638448  6.019231  0.625625  19.801758
    200    5     2     5     7  ...  3.638448  6.019231  0.625625  19.801758
    204    5     2     5     7  ...  3.638448  6.019231  0.625625  19.801758
    215    5     2     5     7  ...  3.638448  6.019231  0.625625  19.801758
    221    5     2     5     7  ...  3.638448  6.019231  0.625625  19.801758
    223    5     2     5     7  ...  3.638448  6.019231  0.625625  19.801758
    227    5     2     3     7  ...  6.241623  3.865385  1.725625  19.926758
    256    5     2     5     7  ...  3.638448  6.019231  0.625625  19.801758
    264    5     3     4     7  ...  1.320988  3.711538  0.575625  17.614258
    265    5     3     4     7  ...  1.320988  3.711538  0.575625  17.614258
    270    5     2     3     7  ...  6.241623  3.865385  1.725625  19.926758
    287    5     3     4     7  ...  1.320988  3.711538  0.575625  17.614258
    291    5     2     5     7  ...  3.638448  6.019231  0.625625  19.801758
    297    5     3     5     6  ...  3.003527  3.173077  1.825625  12.551758
    299    5     2     4     7  ...  3.940035  3.942308  0.175625  18.864258
    304    5     2     5     7  ...  3.638448  6.019231  0.625625  19.801758
    321    5     3     4     7  ...  1.320988  3.711538  0.575625  17.614258
    353    5     2     4     7  ...  3.940035  3.942308  0.175625  18.864258
    368    5     2     4     7  ...  3.940035  3.942308  0.175625  18.864258
    378    5     3     4     7  ...  1.320988  3.711538  0.575625  17.614258
    379    5     3     4     7  ...  1.320988  3.711538  0.575625  17.614258
    383    5     2     5     7  ...  3.638448  6.019231  0.625625  19.801758
    403    5     2     4     7  ...  3.940035  3.942308  0.175625  18.864258
    421    5     2     3     7  ...  6.241623  3.865385  1.725625  19.926758
    429    5     2     4     7  ...  3.940035  3.942308  0.175625  18.864258
    434    5     2     3     7  ...  6.241623  3.865385  1.725625  19.926758
    454    5     2     5     6  ...  5.622575  3.403846  1.425625  13.801758
    461    5     2     3     7  ...  6.241623  3.865385  1.725625  19.926758
    463    5     2     3     7  ...  6.241623  3.865385  1.725625  19.926758
    468    5     2     4     7  ...  3.940035  3.942308  0.175625  18.864258
    
    [40 rows x 13 columns]
    —————+++++++++++++++——————————
    a7
    专业度     2.68750
    回复速度    3.12500
    服务态度    4.03125
    推荐分值    3.50000
    dtype: float64
         专业度  回复速度  服务态度  推荐分值  ...         a4         a5         a6        a7
    3      4     4     5     4  ...  13.352734   6.557692  12.825625  3.676758
    13     2     2     5     3  ...  32.574956  16.096154  24.825625  2.926758
    16     4     3     5     3  ...  21.955908   8.173077  17.225625  2.926758
    28     2     4     3     3  ...  31.940035  15.480769  28.725625  2.551758
    38     3     3     4     5  ...  11.289242   4.173077   8.175625  2.364258
    69     2     3     4     3  ...  30.257496  13.788462  24.775625  0.739258
    103    4     2     3     3  ...  27.178131   6.250000  17.925625  4.301758
    120    4     4     5     4  ...  13.352734   6.557692  12.825625  3.676758
    130    2     4     3     4  ...  23.955908  12.096154  21.925625  2.551758
    137    3     2     5     3  ...  27.574956  11.250000  19.825625  2.551758
    146    2     2     5     4  ...  24.590829  12.711538  18.025625  2.926758
    161    2     4     4     3  ...  29.638448  15.557692  27.175625  1.489258
    182    2     2     3     3  ...  35.178131  13.942308  25.925625  3.051758
    201    3     4     3     4  ...  18.955908   7.250000  16.925625  2.176758
    202    4     4     3     3  ...  23.940035   7.788462  20.725625  3.801758
    208    3     3     4     4  ...  17.273369   5.557692  12.975625  0.364258
    219    2     3     4     4  ...  22.273369  10.403846  17.975625  0.739258
    241    3     2     4     3  ...  27.876543   9.173077  19.375625  1.614258
    249    2     3     3     3  ...  32.559083  13.711538  26.325625  1.801758
    250    4     3     5     4  ...  13.971781   4.788462  10.425625  2.926758
    267    2     2     3     4  ...  27.194004  10.557692  19.125625  3.051758
    279    2     3     5     4  ...  21.971781  12.480769  18.425625  1.676758
    293    4     4     5     3  ...  21.336861   9.942308  19.625625  3.676758
    318    2     4     3     4  ...  23.955908  12.096154  21.925625  2.551758
    343    2     3     5     3  ...  29.955908  15.865385  25.225625  1.676758
    346    3     3     4     4  ...  17.273369   5.557692  12.975625  0.364258
    358    2     4     3     4  ...  23.955908  12.096154  21.925625  2.551758
    361    3     4     5     4  ...  16.352734   9.403846  15.825625  2.051758
    371    2     2     3     3  ...  35.178131  13.942308  25.925625  3.051758
    385    2     4     5     3  ...  29.336861  17.634615  27.625625  2.426758
    445    3     4     5     3  ...  24.336861  12.788462  22.625625  2.051758
    451    2     2     3     3  ...  35.178131  13.942308  25.925625  3.051758
    
    [32 rows x 13 columns]
    —————+++++++++++++++——————————
    
    进程已结束,退出代码0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    import time
    import numpy as np
    import pandas as pd
    import warnings
    import copy
    
    warnings.filterwarnings('ignore')
    # 获取所需数据:'推荐分值', '专业度','回复速度','服务态度','推荐类型'
    datas = pd.read_excel('./datas4.xlsx')
    feats = ['专业度','回复速度','服务态度','推荐分值'] #
    datas_1 = datas[feats]
    """
    1. 确定初始锚点
    		①. 首先随机选取一个锚点,此时,所有样本都归于当前锚点
    		②. 计算出所有样本到锚点的距离,选择距锚点最远的样本点,作为新的锚点,
    		③. 计算出所有样本到新锚点的距离,如果到新锚点距离更短,则分到新锚点组
    		④. 然后再次分别计算所有样本到各自锚点的距离,选择各组中距离锚点最远的点,作为新锚点,(注意:如果已经有多个锚点,也是依次遍历多个锚点,生成新锚点)
    		⑤. 依次循环234步,直到得到$N_{point}$个锚点
    
    2. 数据样本分组
    3. 计算各组新锚点
    4. 重复2和3步,直到达标
    """
    
    class K_means():
        def __init__(self,datas,K_num = 8,times=300):
            self.datas = datas
            self.K_num = K_num
            self.clas = ['a'+str(i) for i in range(K_num)]
            self.points = {}
            self.points_num = len(self.points)
            self.times = times
            self.end = False
    
        def get_distance(self,data,point):
            """计算两点的距离"""
            dis = 0
            for feat in feats:
                dis += (data[feat]-point[feat])**2
            return dis
        def get_dis_datas(self,point,cla):
            """计算所有样本与所有锚点的距离,并维护在数据表中"""
            dis = self.datas.apply(self.get_distance, args=(point,), axis=1)
            self.datas[cla] = dis
        def get_cla_name(self):
            """获取组名"""
            return 'a'+str(len(self.points))
        def get_far_point(self,datas,point,cla):
            """获取距离最远的点,并维护dataframe,存储所有样本离锚点的距离"""
            dis = datas.apply(self.get_distance, args=(point,), axis=1)
            datas[cla] = dis
            point_new = datas.loc[datas[cla].idxmax()]
            return point_new
        # 分组
        def divide_datas(self,temp_points):
            clas = temp_points.keys()
            for cla,value in temp_points.items():
                point = value['point']
                self.get_dis_datas(point,cla)
            self.datas['class'] = self.datas[clas].idxmin(axis=1)
            for cla,value in self.points.items():
                self.points[cla]['datas'] = pd.DataFrame()
            groups = self.datas.groupby('class')
            for cla,value in groups:
                self.points[cla]['datas'] = value
        # 1. 确定初始锚点:K_means++
        def get_points(self):
            while len(self.points)<self.K_num:
                if len(self.points) == 0:
                    point = self.datas.sample()
                    cla_new = self.get_cla_name()
                    self.points[cla_new] = {'point':point,'datas':pd.DataFrame()}
    
                temp_points = copy.deepcopy(self.points)
                self.divide_datas(temp_points)
                for cla,value in temp_points.items():
                    point = value['point']
                    datas = value['datas']
                    if datas.empty:
                        continue
                    cla_new = self.get_cla_name()
                    point_new = self.get_far_point(datas,point,cla)
                    self.points[cla_new] = {'point':point_new,'datas':pd.DataFrame()}
                    if len(self.points)>=self.K_num:
                        break
        # 2. 重复234步,迭代聚类
        def learning(self):
            self.get_points()
            num = 0
            while not self.end and num<self.times:
                self.end = True
                num += 1
                last_point = copy.deepcopy(self.points)
                self.divide_datas(self.points)
                for cla,value in self.points.items():
                    if value['datas'].empty:
                        continue
                    point_new = value['datas'][feats].mean()
                    self.points[cla]['point'] = point_new
                    if not last_point[cla]['point'][feats].equals(point_new):
                        self.end = False
            for cla,value in self.points.items():
                print(cla)
                print(value['point'])
                print(value['datas'])
                print("—————+++++++++++++++——————————")
    
    temp = K_means(datas_1)
    temp.learning()
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
  • 相关阅读:
    单例模式及线程安全的实践
    专业音视频领域中,Pro AV的崛起之路
    QT串口助手:识别串口号,发送,接收,十六进制
    Kafka为什么这么快?
    如何使用Hexo搭建个人博客
    T-SQL——批量刷新视图
    如何比较分子的极性?
    MySQL-DCL数据控制语言简要介绍
    大模型引领未来:探索其在多个领域的深度应用与无限可能【第二章、金融领域:大模型重塑金融生态】
    这一次,Windows 站起来了:Windows ​& Linux 的性能 Battle
  • 原文地址:https://blog.csdn.net/weixin_50348308/article/details/132922570