当前位置:   article > 正文

K-means 聚类算法分析_kmeans中聚类中心对应问题

kmeans中聚类中心对应问题

算法简述

K-means 算法原理

我们假定给定数据样本 X ,包含了 n 个对象 X = \left \{ X_{1},X_{2},X_{3},...,X_{n}\right \},其中每一个对象都具有 m 个维度的属性。而 K-means 算法的目标就是将 n 个对象依据对象间的相似性聚集到指定的 k 个类簇中,每个对象属于且仅属于一个其到类簇中心距离最小的类簇中。对于 K-means 算法,首先需要初始化 k 个聚类中心\left \{ C_{1}, C_{2},C_{3},...,C_{k}, \right \},1<k\leq n , 然后通过计算每一个对象到每一个聚类中心的欧式距离,如下式所示:

dis(X_{i},C_{i}) = \sqrt{\sum_{t=1}^{m} (X_{it}-C_{jt})^{2}}

这里的 X_{i}表示第i个对象1<i<nC_{i}表示第 j 个聚类中心1<j<kX_{it}表示第i个对象的第t个属性,1\leq t\leq mC_{jt}表示第j个聚类中心的第t个属性。

依次比较每一个对象到每一个聚类中心的距离,将对象分配到距离最近的聚类中心的类簇中,得到k个类簇\left \{S_{1},S_{2},S_{3},...,S_{k}\right \},kmeans 算法定义了类簇的原型,类簇中心就是类簇内所有对象在各个维度的均值,其计算公式如下所示:

C_{t} = \frac{\sum_{X_{i}\in S_{i}}^{}X_{i}}{\left | S_{l} \right |}

式中, C_{l}表示第l个聚类中心,1\leq l\leq k\left | S_{l} \right |表示第l个类簇中对象的个数,X_{i}表示第l个类簇中第i个对象,1\leq i\leq \left | S_{i} \right |

算法实现流程

  1. 随机设置 K 个特征空间内的点作为初始的聚类中⼼。
  2. 对于其他每个点计算到 K 个中⼼的距离,未知的点选择最近的⼀个聚类中⼼点作为标记类别。
  3. 接着对着标记的聚类中⼼之后,重新计算出每个聚类的新中心点(平均值)
  4. 如果计算得出的新中⼼点与原中⼼点⼀样(质⼼不再移动),那么结束,否则重新进⾏第⼆步过程。

核心代码

手写实现 K-means 算法:

  1. import numpy as np
  2. import random
  3. import matplotlib.pyplot as plt
  4. plt.rcParams['font.sans-serif'] = ['SimHei']
  5. plt.rcParams['axes.unicode_minus'] = False
  6. """
  7. 手写实现Kmeans
  8. """
  9. data = np.genfromtxt("classes.txt", delimiter='\t')
  10. X = data
  11. K = 5
  12. colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k']
  13. max_iterations = 10000
  14. random.seed(100)
  15. def kmeans(data, K, max_iterations):
  16. initial_centers = random.sample(list(data), K)
  17. centers = initial_centers
  18. for iteration in range(max_iterations):
  19. clusters = {i: [] for i in range(K)}
  20. for point in data:
  21. distances = [np.linalg.norm(point - center) for center in centers]
  22. cluster_index = np.argmin(distances)
  23. clusters[cluster_index].append(point)
  24. new_centers = [np.mean(clusters[i], axis=0) for i in range(K)]
  25. if np.all(np.array_equal(centers[i], new_centers[i]) for i in range(K)):
  26. break
  27. centers = new_centers
  28. return centers, clusters
  29. final_centers, final_clusters = kmeans(X, K, max_iterations)
  30. for i in range(K):
  31. cluster = np.array(final_clusters[i])
  32. plt.scatter(cluster[:, 0], cluster[:, 1], c=colors[i], label=f'簇 {i + 1}')
  33. centers = np.array(final_centers)
  34. plt.scatter(centers[:, 0], centers[:, 1], c='k', marker='x', s=100, label='簇中心')
  35. plt.xlabel('高度')
  36. plt.ylabel('宽度')
  37. plt.legend()
  38. plt.show()

调用 sklearn 包的 K-means 算法:

  1. import numpy as np
  2. from sklearn.cluster import KMeans
  3. import matplotlib.pyplot as plt
  4. plt.rcParams['font.sans-serif'] = ['SimHei']
  5. plt.rcParams['axes.unicode_minus'] = False
  6. """
  7. 调用sklearn库的Kmeans算法
  8. """
  9. data = np.genfromtxt("classes.txt", delimiter='\t')
  10. X = data
  11. K = 3
  12. num_experiments = 5
  13. colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k']
  14. for i in range(num_experiments):
  15. kmeans = KMeans(n_clusters=K, init='k-means++', random_state=i)
  16. kmeans.fit(X)
  17. print(f"实验 {i + 1} - 初始中心: {kmeans.cluster_centers_}")
  18. kmeans = KMeans(n_clusters=K, init='k-means++', random_state=0)
  19. kmeans.fit(X)
  20. labels = kmeans.labels_
  21. clustered_data = {i: [] for i in range(K)}
  22. for i, label in enumerate(labels):
  23. clustered_data[label].append(X[i])
  24. for i in range(K):
  25. cluster = np.array(clustered_data[i])
  26. plt.scatter(cluster[:, 0], cluster[:, 1], c=colors[i], label=f'簇 {i + 1}')
  27. centers = kmeans.cluster_centers_
  28. plt.scatter(centers[:, 0], centers[:, 1], c='k', marker='x', s=100, label='簇中心')
  29. plt.xlabel('高度')
  30. plt.ylabel('宽度')
  31. plt.legend()
  32. plt.show()

手写实现 K-means 的算法流程:

  • 随机选择 initial centers:从数据集中随机选择 K 个数据点,作为 initial centers。
  • 计算距离:对于每个数据点,计算它与当前的 K 个 centers 之间的距离。
  • 分配数据点:将每个数据点分配到最近的 center 所对应的集合中。
  • 更新 centers:将每个集合的中心点更新为集合中的均值。
  • 重复步骤 2-4:直到 centers 不再发生变化,或者达到最大迭代次数。
  • 返回 centers 和 clusters:返回最终的 centers 和 clusters。

实验结果与分析

使用 python 手写实现 K-means 算法效果(假设 K=3 的时候):

使用 sklearn 中的 K-means 算法效果(假设 K=3 的时候):

使用 python 手写实现 K-means 算法效果(假设 K=5 的时候):

这里使用了 Python 手写实现 K-means 算法,并与 scikit-learn 库中的K-means 算法进行了比较。结果发现手写实现的 K-means 算法的效果与scikit-learn 库中的 K-means 算法相似,都可以很好地聚集数据点。

结论与心得体会

K-means 算法是一种常用的聚类算法,可以用来分组数据点 K 个聚类。在本实验中,我们使用了 VOC 数据集中的 600 张图像,并将每个图像的边界框标注为一个数据点。这里使用了 K-means 算法将这些数据点聚集到 K 个聚类中。

classes.txt文件:

  1. 201 158
  2. 171 330
  3. 94 137
  4. 300 180
  5. 175 250
  6. 190 265
  7. 150 146
  8. 222 274
  9. 102 372
  10. 213 122
  11. 19 43
  12. 202 297
  13. 163 348
  14. 174 356
  15. 29 53
  16. 31 81
  17. 85 105
  18. 77 159
  19. 102 140
  20. 333 482
  21. 148 229
  22. 97 200
  23. 133 186
  24. 52 76
  25. 256 306
  26. 411 332
  27. 30 115
  28. 151 202
  29. 164 233
  30. 283 328
  31. 394 237
  32. 107 153
  33. 151 128
  34. 99 139
  35. 118 318
  36. 240 311
  37. 420 371
  38. 153 188
  39. 75 148
  40. 54 52
  41. 197 326
  42. 14 34
  43. 196 250
  44. 295 374
  45. 230 167
  46. 206 161
  47. 105 164
  48. 41 28
  49. 119 108
  50. 328 360
  51. 252 414
  52. 279 429
  53. 135 251
  54. 101 156
  55. 75 169
  56. 123 311
  57. 238 298
  58. 132 157
  59. 79 64
  60. 15 106
  61. 52 172
  62. 159 327
  63. 82 90
  64. 82 252
  65. 273 305
  66. 281 211
  67. 205 291
  68. 456 330
  69. 223 372
  70. 199 118
  71. 116 162
  72. 231 212
  73. 19 25
  74. 334 346
  75. 68 222
  76. 116 179
  77. 165 206
  78. 222 461
  79. 91 277
  80. 36 25
  81. 86 155
  82. 162 251
  83. 173 372
  84. 255 228
  85. 74 171
  86. 296 440
  87. 118 158
  88. 288 271
  89. 120 87
  90. 31 87
  91. 300 206
  92. 131 195
  93. 69 109
  94. 71 186
  95. 300 298
  96. 330 190
  97. 222 187
  98. 56 135
  99. 192 276
  100. 95 300
  101. 209 166
  102. 100 309
  103. 455 315
  104. 38 42
  105. 89 177
  106. 303 401
  107. 277 200
  108. 216 357
  109. 221 246
  110. 130 106
  111. 232 263
  112. 340 498
  113. 126 213
  114. 162 343
  115. 465 221
  116. 130 280
  117. 144 223
  118. 499 356
  119. 35 60
  120. 260 372
  121. 64 153
  122. 181 161
  123. 55 153
  124. 42 78
  125. 182 295
  126. 178 333
  127. 460 485
  128. 121 354
  129. 142 227
  130. 299 304
  131. 194 147
  132. 478 332
  133. 236 441
  134. 132 108
  135. 56 45
  136. 242 374
  137. 30 73
  138. 40 27
  139. 46 57
  140. 230 228
  141. 251 221
  142. 217 356
  143. 104 264
  144. 108 150
  145. 26 35
  146. 172 275
  147. 261 199
  148. 17 30
  149. 272 197
  150. 324 408
  151. 10 24
  152. 76 45
  153. 160 215
  154. 274 373
  155. 248 201
  156. 128 104
  157. 311 329
  158. 413 176
  159. 267 382
  160. 160 331
  161. 255 175
  162. 97 224
  163. 306 240
  164. 367 252
  165. 198 219
  166. 222 260
  167. 214 292
  168. 225 358
  169. 66 167
  170. 146 137
  171. 96 344
  172. 353 498
  173. 167 100
  174. 287 191
  175. 445 373
  176. 372 331
  177. 474 328
  178. 117 185
  179. 386 334
  180. 124 202
  181. 74 68
  182. 27 83
  183. 405 418
  184. 57 121
  185. 214 225
  186. 166 469
  187. 347 362
  188. 209 437
  189. 251 302
  190. 188 167
  191. 30 110
  192. 155 198
  193. 227 225
  194. 231 290
  195. 314 188
  196. 13 20
  197. 243 206
  198. 23 51
  199. 385 330
  200. 26 31
  201. 164 280
  202. 355 235
  203. 385 353
  204. 77 184
  205. 148 288
  206. 82 134
  207. 220 309
  208. 366 341
  209. 150 104
  210. 126 318
  211. 163 473
  212. 37 135
  213. 315 485
  214. 187 242
  215. 339 484
  216. 236 177
  217. 159 176
  218. 339 402
  219. 260 274
  220. 145 277
  221. 231 237
  222. 246 270
  223. 158 117
  224. 49 139
  225. 276 373
  226. 60 167
  227. 281 482
  228. 60 190
  229. 191 382
  230. 325 317
  231. 252 298
  232. 147 235
  233. 64 71
  234. 67 127
  235. 280 318
  236. 212 437
  237. 184 165
  238. 165 288
  239. 61 188
  240. 290 319
  241. 62 115
  242. 301 232
  243. 478 144
  244. 254 169
  245. 106 123
  246. 70 70.1
  247. 100 223
  248. 97 130
  249. 96 282
  250. 201 309
  251. 110 183
  252. 99 214
  253. 159 186
  254. 92 266
  255. 82 150
  256. 151 248
  257. 226 319
  258. 100 113
  259. 195 192
  260. 471 326
  261. 202 238
  262. 98 216
  263. 478 331
  264. 159 160
  265. 402 374
  266. 220 138
  267. 239 261
  268. 248 176
  269. 108 118
  270. 297 372
  271. 155 287
  272. 30 57
  273. 192 163
  274. 19 23
  275. 112 429
  276. 363 251
  277. 83 173
  278. 134 373
  279. 341 440
  280. 309 321
  281. 190 476
  282. 120 149
  283. 67 233
  284. 30 35
  285. 102 196
  286. 68 188
  287. 62 158
  288. 305 425
  289. 196 178
  290. 184 354
  291. 121 140
  292. 165 243
  293. 121 320
  294. 314 315
  295. 198 170
  296. 190 376
  297. 215 184
  298. 193 114
  299. 148 161
  300. 138 222
  301. 262 203
  302. 301 487
  303. 361 210
  304. 87 216
  305. 183 381
  306. 318 337
  307. 401 275
  308. 64 55
  309. 43 49
  310. 254 137
  311. 316 270
  312. 439 268
  313. 41 32
  314. 155 133
  315. 223 175
  316. 46 50
  317. 142 161
  318. 381 276
  319. 71 199
  320. 81 55
  321. 184 287
  322. 304 276
  323. 162 213
  324. 81 59
  325. 341 229
  326. 85 63
  327. 187 275
  328. 74 256
  329. 121 109
  330. 167 354
  331. 160 200
  332. 346 466
  333. 202 320
  334. 289 453
  335. 303 182
  336. 422 266
  337. 49 56
  338. 156 194
  339. 267 124
  340. 333 178
  341. 173 127
  342. 185 178
  343. 326 485
  344. 177 280
  345. 222 245
  346. 313 277
  347. 99 152
  348. 74 98
  349. 410 188
  350. 148 51
  351. 161 140
  352. 428 428.1
  353. 318 317
  354. 65 117
  355. 496 330
  356. 255 166
  357. 274 245
  358. 100 114
  359. 158 138
  360. 74 130
  361. 184 273
  362. 260 204
  363. 90 67
  364. 150 246
  365. 126 96
  366. 190 233
  367. 170 324
  368. 301 288
  369. 356 292
  370. 462 340
  371. 297 332
  372. 48 97
  373. 343 349
  374. 57 131
  375. 110 79
  376. 58 70
  377. 253 226
  378. 23 25
  379. 466 323
  380. 179 260
  381. 198 215
  382. 341 219
  383. 76 66
  384. 324 255
  385. 218 170
  386. 376 446
  387. 88 216
  388. 146 338
  389. 280 265
  390. 216 298
  391. 222 185
  392. 268 175
  393. 194 414
  394. 118 214
  395. 273 234
  396. 62 149
  397. 366 239
  398. 181 188
  399. 258 198
  400. 42 20
  401. 224 401
  402. 30 22
  403. 108 257
  404. 139 285
  405. 428 339
  406. 140 162
  407. 92 90
  408. 314 184
  409. 263 206
  410. 180 170
  411. 246 223
  412. 127 67
  413. 403 327
  414. 189 273
  415. 280 317
  416. 288 272
  417. 56 118
  418. 77 72
  419. 38 27
  420. 468 368
  421. 96 164
  422. 169 149
  423. 240 190
  424. 219 383
  425. 232 135
  426. 136 366
  427. 145 306
  428. 361 206
  429. 165 209
  430. 305 428
  431. 105 232
  432. 305 222
  433. 182 139
  434. 108 141
  435. 32 38
  436. 123 83
  437. 425 247
  438. 201 261
  439. 61 133
  440. 88 88.1
  441. 400 364
  442. 100 191
  443. 109 107
  444. 122 92
  445. 107 340
  446. 329 213
  447. 152 133
  448. 147 130
  449. 57 134
  450. 251 187
  451. 31 57
  452. 449 231
  453. 347 207
  454. 164 292
  455. 314 199
  456. 175 198
  457. 48 63
  458. 74 76
  459. 121 120
  460. 98 81
  461. 52 38
  462. 106 163
  463. 298 230
  464. 344 278
  465. 249 201
  466. 432 371
  467. 43 23
  468. 82 220
  469. 152 92
  470. 236 111
  471. 190 189
  472. 228 173
  473. 134 322
  474. 290 246
  475. 82 48
  476. 220 182
  477. 40 65
  478. 338 272
  479. 103 302
  480. 453 315
  481. 138 200
  482. 339 224
  483. 165 128
  484. 184 155
  485. 256 389
  486. 407 259
  487. 293 180
  488. 264 351
  489. 283 175
  490. 334 218
  491. 303 345
  492. 127 139
  493. 166 252
  494. 70 51
  495. 175 166
  496. 439 256
  497. 247 257
  498. 321 448
  499. 207 204
  500. 271 370
  501. 164 261
  502. 306 303
  503. 303 342
  504. 155 118
  505. 405 358
  506. 177 330
  507. 96 71
  508. 420 174
  509. 62 87
  510. 76 57
  511. 475 340
  512. 163 190
  513. 167 164
  514. 177 238
  515. 190 104
  516. 357 329
  517. 97 77
  518. 163 213
  519. 46 38
  520. 43 34
  521. 49 37
  522. 113 99
  523. 421 313
  524. 32 31
  525. 410 482
  526. 128 173
  527. 366 430
  528. 39 29
  529. 457 232
  530. 36 66
  531. 485 468
  532. 118 112
  533. 89 77
  534. 132 107
  535. 233 304
  536. 425 330
  537. 112 79
  538. 102 117
  539. 452 295
  540. 71 48
  541. 46 89
  542. 267 229
  543. 85 163
  544. 326 269
  545. 161 214
  546. 409 332
  547. 299 180
  548. 49 29
  549. 116 118
  550. 209 137
  551. 264 132
  552. 273 269
  553. 162 105
  554. 202 171
  555. 70 163
  556. 97 170
  557. 286 355
  558. 323 174
  559. 117 161
  560. 117 214
  561. 223 220
  562. 138 95
  563. 110 100
  564. 468 333
  565. 57 55
  566. 168 186
  567. 27 19
  568. 189 220
  569. 141 134
  570. 371 362
  571. 46 30
  572. 253 280
  573. 135 106
  574. 321 377
  575. 68 65
  576. 182 260
  577. 126 218
  578. 162 165
  579. 111 125
  580. 312 258
  581. 357 238
  582. 461 388
  583. 240 176
  584. 177 150
  585. 156 116
  586. 321 250
  587. 31 43
  588. 65 52
  589. 186 183
  590. 163 160
  591. 147 196
  592. 82 64
  593. 219 214
  594. 101 131
  595. 247 154
  596. 70 42
  597. 37 31
  598. 113 186
  599. 145 171
  600. 14 11
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/706444
推荐阅读
相关标签
  

闽ICP备14008679号