这是我看下来,最简单的内容,哭了,K-means,so nice
K-means,由于太过简单,不需要数学推导时,一时间甚至无从下指
首先,K-means需要提前锚定几个点,然后让所有数据样本根据与这几个点的距离,将分别选择最短距离凑成一簇
有那么点近水楼台先得月,兔子硬吃窝边草的意思
然后所有样本分别站队分组后,每个组再重新选出新的锚定点:计算出所有特征各自的均值,作为新锚定点
重复分组与计算新锚点,直到最终所有组的锚点不再改变,或是超过最大迭代次数。
- 确定初始锚点
- 数据样本分组
- 计算各组新锚点
- 重复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,然后,
- 首先随机选取一个锚点,此时,所有样本都归于当前锚点
- 计算出所有样本到锚点的距离,选择距锚点最远的样本点,作为新的锚点,
- 计算出所有样本到新锚点的距离,如果到新锚点距离更短,则分到新锚点组
- 然后再次分别计算所有样本到各自锚点的距离,选择各组中距离锚点最远的点,作为新锚点,(注意:如果已经有多个锚点,也是依次遍历多个锚点,生成新锚点)
- 依次循环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()