机器学习——聚类之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]表示对应的锚点..........
}

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

  • 维护一张所有样本与所有组锚点距离的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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值