K-means 聚类算法分析
算法简述
K-means 算法原理
我们假定给定数据样本 X ,包含了 n 个对象 ,其中每一个对象都具有 m 个维度的属性。而 K-means 算法的目标就是将 n 个对象依据对象间的相似性聚集到指定的 k 个类簇中,每个对象属于且仅属于一个其到类簇中心距离最小的类簇中。对于 K-means 算法,首先需要初始化 k 个聚类中心 , 然后通过计算每一个对象到每一个聚类中心的欧式距离,如下式所示:
这里的 表示第i个对象,表示第 j 个聚类中心,表示第i个对象的第t个属性,,表示第j个聚类中心的第t个属性。
依次比较每一个对象到每一个聚类中心的距离,将对象分配到距离最近的聚类中心的类簇中,得到k个类簇,kmeans 算法定义了类簇的原型,类簇中心就是类簇内所有对象在各个维度的均值,其计算公式如下所示:
式中, 表示第l个聚类中心,,表示第l个类簇中对象的个数,表示第l个类簇中第i个对象,
算法实现流程
- 随机设置 K 个特征空间内的点作为初始的聚类中⼼。
- 对于其他每个点计算到 K 个中⼼的距离,未知的点选择最近的⼀个聚类中⼼点作为标记类别。
- 接着对着标记的聚类中⼼之后,重新计算出每个聚类的新中心点(平均值)
- 如果计算得出的新中⼼点与原中⼼点⼀样(质⼼不再移动),那么结束,否则重新进⾏第⼆步过程。
核心代码
手写实现 K-means 算法:
import numpy as np
import random
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
"""
手写实现Kmeans
"""
data = np.genfromtxt("classes.txt", delimiter='\t')
X = data
K = 5
colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k']
max_iterations = 10000
random.seed(100)
def kmeans(data, K, max_iterations):initial_centers = random.sample(list(data), K)centers = initial_centersfor iteration in range(max_iterations):clusters = {i: [] for i in range(K)}for point in data:distances = [np.linalg.norm(point - center) for center in centers]cluster_index = np.argmin(distances)clusters[cluster_index].append(point)new_centers = [np.mean(clusters[i], axis=0) for i in range(K)]if np.all(np.array_equal(centers[i], new_centers[i]) for i in range(K)):breakcenters = new_centersreturn centers, clustersfinal_centers, final_clusters = kmeans(X, K, max_iterations)
for i in range(K):cluster = np.array(final_clusters[i])plt.scatter(cluster[:, 0], cluster[:, 1], c=colors[i], label=f'簇 {i + 1}')centers = np.array(final_centers)
plt.scatter(centers[:, 0], centers[:, 1], c='k', marker='x', s=100, label='簇中心')plt.xlabel('高度')
plt.ylabel('宽度')
plt.legend()
plt.show()
调用 sklearn 包的 K-means 算法:
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
"""
调用sklearn库的Kmeans算法
"""
data = np.genfromtxt("classes.txt", delimiter='\t')
X = data
K = 3
num_experiments = 5
colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k']
for i in range(num_experiments):kmeans = KMeans(n_clusters=K, init='k-means++', random_state=i)kmeans.fit(X)print(f"实验 {i + 1} - 初始中心: {kmeans.cluster_centers_}")kmeans = KMeans(n_clusters=K, init='k-means++', random_state=0)
kmeans.fit(X)labels = kmeans.labels_clustered_data = {i: [] for i in range(K)}
for i, label in enumerate(labels):clustered_data[label].append(X[i])for i in range(K):cluster = np.array(clustered_data[i])plt.scatter(cluster[:, 0], cluster[:, 1], c=colors[i], label=f'簇 {i + 1}')centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='k', marker='x', s=100, label='簇中心')plt.xlabel('高度')
plt.ylabel('宽度')
plt.legend()
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文件:
201 158
171 330
94 137
300 180
175 250
190 265
150 146
222 274
102 372
213 122
19 43
202 297
163 348
174 356
29 53
31 81
85 105
77 159
102 140
333 482
148 229
97 200
133 186
52 76
256 306
411 332
30 115
151 202
164 233
283 328
394 237
107 153
151 128
99 139
118 318
240 311
420 371
153 188
75 148
54 52
197 326
14 34
196 250
295 374
230 167
206 161
105 164
41 28
119 108
328 360
252 414
279 429
135 251
101 156
75 169
123 311
238 298
132 157
79 64
15 106
52 172
159 327
82 90
82 252
273 305
281 211
205 291
456 330
223 372
199 118
116 162
231 212
19 25
334 346
68 222
116 179
165 206
222 461
91 277
36 25
86 155
162 251
173 372
255 228
74 171
296 440
118 158
288 271
120 87
31 87
300 206
131 195
69 109
71 186
300 298
330 190
222 187
56 135
192 276
95 300
209 166
100 309
455 315
38 42
89 177
303 401
277 200
216 357
221 246
130 106
232 263
340 498
126 213
162 343
465 221
130 280
144 223
499 356
35 60
260 372
64 153
181 161
55 153
42 78
182 295
178 333
460 485
121 354
142 227
299 304
194 147
478 332
236 441
132 108
56 45
242 374
30 73
40 27
46 57
230 228
251 221
217 356
104 264
108 150
26 35
172 275
261 199
17 30
272 197
324 408
10 24
76 45
160 215
274 373
248 201
128 104
311 329
413 176
267 382
160 331
255 175
97 224
306 240
367 252
198 219
222 260
214 292
225 358
66 167
146 137
96 344
353 498
167 100
287 191
445 373
372 331
474 328
117 185
386 334
124 202
74 68
27 83
405 418
57 121
214 225
166 469
347 362
209 437
251 302
188 167
30 110
155 198
227 225
231 290
314 188
13 20
243 206
23 51
385 330
26 31
164 280
355 235
385 353
77 184
148 288
82 134
220 309
366 341
150 104
126 318
163 473
37 135
315 485
187 242
339 484
236 177
159 176
339 402
260 274
145 277
231 237
246 270
158 117
49 139
276 373
60 167
281 482
60 190
191 382
325 317
252 298
147 235
64 71
67 127
280 318
212 437
184 165
165 288
61 188
290 319
62 115
301 232
478 144
254 169
106 123
70 70.1
100 223
97 130
96 282
201 309
110 183
99 214
159 186
92 266
82 150
151 248
226 319
100 113
195 192
471 326
202 238
98 216
478 331
159 160
402 374
220 138
239 261
248 176
108 118
297 372
155 287
30 57
192 163
19 23
112 429
363 251
83 173
134 373
341 440
309 321
190 476
120 149
67 233
30 35
102 196
68 188
62 158
305 425
196 178
184 354
121 140
165 243
121 320
314 315
198 170
190 376
215 184
193 114
148 161
138 222
262 203
301 487
361 210
87 216
183 381
318 337
401 275
64 55
43 49
254 137
316 270
439 268
41 32
155 133
223 175
46 50
142 161
381 276
71 199
81 55
184 287
304 276
162 213
81 59
341 229
85 63
187 275
74 256
121 109
167 354
160 200
346 466
202 320
289 453
303 182
422 266
49 56
156 194
267 124
333 178
173 127
185 178
326 485
177 280
222 245
313 277
99 152
74 98
410 188
148 51
161 140
428 428.1
318 317
65 117
496 330
255 166
274 245
100 114
158 138
74 130
184 273
260 204
90 67
150 246
126 96
190 233
170 324
301 288
356 292
462 340
297 332
48 97
343 349
57 131
110 79
58 70
253 226
23 25
466 323
179 260
198 215
341 219
76 66
324 255
218 170
376 446
88 216
146 338
280 265
216 298
222 185
268 175
194 414
118 214
273 234
62 149
366 239
181 188
258 198
42 20
224 401
30 22
108 257
139 285
428 339
140 162
92 90
314 184
263 206
180 170
246 223
127 67
403 327
189 273
280 317
288 272
56 118
77 72
38 27
468 368
96 164
169 149
240 190
219 383
232 135
136 366
145 306
361 206
165 209
305 428
105 232
305 222
182 139
108 141
32 38
123 83
425 247
201 261
61 133
88 88.1
400 364
100 191
109 107
122 92
107 340
329 213
152 133
147 130
57 134
251 187
31 57
449 231
347 207
164 292
314 199
175 198
48 63
74 76
121 120
98 81
52 38
106 163
298 230
344 278
249 201
432 371
43 23
82 220
152 92
236 111
190 189
228 173
134 322
290 246
82 48
220 182
40 65
338 272
103 302
453 315
138 200
339 224
165 128
184 155
256 389
407 259
293 180
264 351
283 175
334 218
303 345
127 139
166 252
70 51
175 166
439 256
247 257
321 448
207 204
271 370
164 261
306 303
303 342
155 118
405 358
177 330
96 71
420 174
62 87
76 57
475 340
163 190
167 164
177 238
190 104
357 329
97 77
163 213
46 38
43 34
49 37
113 99
421 313
32 31
410 482
128 173
366 430
39 29
457 232
36 66
485 468
118 112
89 77
132 107
233 304
425 330
112 79
102 117
452 295
71 48
46 89
267 229
85 163
326 269
161 214
409 332
299 180
49 29
116 118
209 137
264 132
273 269
162 105
202 171
70 163
97 170
286 355
323 174
117 161
117 214
223 220
138 95
110 100
468 333
57 55
168 186
27 19
189 220
141 134
371 362
46 30
253 280
135 106
321 377
68 65
182 260
126 218
162 165
111 125
312 258
357 238
461 388
240 176
177 150
156 116
321 250
31 43
65 52
186 183
163 160
147 196
82 64
219 214
101 131
247 154
70 42
37 31
113 186
145 171
14 11
相关文章:
K-means 聚类算法分析
算法简述 K-means 算法原理 我们假定给定数据样本 X ,包含了 n 个对象 ,其中每一个对象都具有 m 个维度的属性。而 K-means 算法的目标就是将 n 个对象依据对象间的相似性聚集到指定的 k 个类簇中,每个对象属于且仅属于一个其到类簇中心距离…...
uniapp获取定位
Uniapp 是一种跨平台应用开发框架,它能够快速地构建出针对不同平台的应用程序。在Uniapp中,实现定位功能也变得十分简单,只需要简单的配置就能轻松实现。 一、高德地图根据指定位置获取经纬度 参考地址:地理/逆地理编码-基础 API…...
Python 面向对象之反射
Python 面向对象之反射 【一】概念 反射是指通过对象的属性名或者方法名来获取对象的属性或调用方法的能力反射还指的是在程序额运行过程中可以动态获取对象的信息(属性和方法) 【二】四个内置函数 又叫做反射函数 万物皆对象(整数、字符串、函数、模块、类等等…...
HPM6750开发笔记《DMA接收和发送数据UART例程深度解析》
目录 概述: 端口设置: 代码分析: 运行现象: 概述: DMA(Direct Memory Access)是一种计算机系统中的数据传输技术,它允许数据在不经过中央处理器(CPU)的直…...
SQL IN 操作符
IN 操作符 IN 操作符允许您在 WHERE 子句中规定多个值。 SQL IN 语法 SELECT column1, column2, ... FROM table_name WHERE column IN (value1, value2, ...); 参数说明: column1, column2, ...:要选择的字段名称,可以为多个字段。如果…...
如何使用Plex在Windows系统搭建个人媒体站点公网可访问
文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各…...
web前端——clear可以清除浮动产生的影响
clear可以解决高度塌陷的问题,产生的副作用要小 未使用clear之前 <!DOCTYPE html> <head><meta charset"UTF-8"><title>高度塌陷相关学习</title><style>div{font-size:50px;}.box1{width:200px;height:200px;backg…...
centos用yum安装mysql详细教程
1 查询安装mysql的yum源,命令如下 ls /etc/yum.repos.d/ -l 界面如下图所示,未显示mysql的安装源 2 安装mysql相关的yum源,例如: 例如:rpm -ivh mysql57-community-release-el7.rpm 要注意 mysql的版本和系统的版本匹配 mysql57-communi…...
冲刺2024年AMC8竞赛的专题突破:匹克定律和不规则形状面积的求法
先温馨提示:2024年AMC8比赛报名今天是最后一天,如果还想参加比赛的孩子今天务必完成报名,错过今天再等一年。需要AMC8自由报名通道可以问我。 到昨天为止,六分成长已经把过去20多年的AMC8竞赛真题都给大家过了一遍,今天为大家做一…...
阿里云迁移AWS视频点播技术攻坚
文章目录 🐷 背景🦥 简述🐥 Aws服务🦜 AWS CloudFormation🐞 问题🐉 落地方案🦉 Aws vs Aliyun🍄 避坑指南 🐷 背景 由于AWS整体成本略低于阿里云,公司决定将…...
Scrum敏捷认证CSM官方认证班Certified ScrumMaster - CSM认证班
课程简介 Scrum是目前运用最为广泛的敏捷开发方法,是一个轻量级的项目管理和产品研发管理框架,旨在最短时间内交付最大价值。根据2021年全球敏捷状态报告,Scrum及Scrum衍生方法的应用占比达到81%。 在企业的敏捷转型历程中,Scru…...
深度解析qt核心机制:信号槽的多线程行为与对象的线程依附性
对象的线程依附性 每一个学过C以及系统编程的程序员,对于变量会与特定线程有关联都会感到不可思议;在qt中所说的对象的线程依附性,只是针对继承自QObject的对象而言的;对象的线程依附性,并不是代表真的某个底层线程才…...
关于时间格式yyyy-M-d或yyyy-MM-d到yyyy-MM-dd的转换
工作时遇到前端传的时间格式是"2023-12-3 17:41:52",和"2023-1-1 17:41:52"但是我想要的是"2023-12-03 17:41:52"和"2023-01-01 17:41:52"。下面给大家分享几个解决方法 方法一: 找前端!让他改&…...
【Windows】之微软输入法配置小鹤双拼
前言 Windows 自带的输入法微软输入法本身就是个最简洁、最方便的输入法,不需要去安装多余的第三方输入法软件。同时,微软中文拼音输入法支持双拼输入法,但微软自带的双拼输入法不包含小鹤双拼方案的。所以,在这里将会讲解如何配置…...
【AI】使用Jan.ai在本地部署大模型开启AI对话(含通过huggingface下载大模型,实现大模型自由)
文章目录 前言一、Jan.ai是什么?二、下载大模型1. 找到大模型文件地址2. 下载大模型3. 修改model.json文件 三、使用Jan调用大模型进行对话总结 前言 2023年是AIGC元年。以后,每个人多少都会接触到GPT带来的变化。别人都在用,我们也不能落下…...
C++摸版(初阶)----函数模版与类模版
本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…...
Embedded-Project项目介绍
Embedded-Project项目介绍 Server后端项目后端启动连接数据库启动时可能遇到的问题架构介绍 web前端项目前端启动启动时可能遇到的问题架构介绍 前后端分离开发流程 项目地址: https://github.com/Catxiaobai/Embedded-Project Server后端项目 系统后端项目&#…...
golang 的那些花样
从 A Tour of Go 可以看到一些 Go 比较特殊的点 文章目录 变量声明时,类型放在后面Array 的引用 Slicereceiver 和 argumentbuilt-int特殊接口Error 变量声明时,类型放在后面 var i, j int 1, 2declaration-syntax Array 的引用 Slice slices-intro …...
如何设计企业级业务流程?学习华为的流程六级分类经验
业务流程管理(BPM)是一种系统化的方法,用于分析、设计、执行、监控和优化组织的业务流程,以实现预期的目标和价值。业务流程管理中,流程的分级方法有多种,常见的有以下几种: APQC的流程分级方法…...
视频智能分析支持摄像头异常位移检测,监测摄像机异常位移变化,保障监控状态
我们经常在生产场景中会遇到摄像头经过风吹日晒,或者异常的触碰,导致了角度或者位置的变化,这种情况下,如果不及时做出调整,会导致原本的监控条件被破坏,发生事件需要追溯的时候,查不到对应位置…...
C++ UTF-8与GBK字符的转换 —基于Linux 虚拟机 (iconv_open iconv)
1、UTF-8 和 GBK 的区别 GBK:通常简称 GB (“国标”汉语拼音首字母),GBK 包含全部中文字符。 UTF-8 :是一种国际化的编码方式,包含了世界上大部分的语种文字(简体中文字、繁体中文字、英文、…...
云原生十二问
一、什么是云原生? 云原生是在云计算环境中构建、部署和管理现代应用程序的软件方法。现代企业希望构建高度可扩展、灵活且具有弹性的应用程序,可以快速更新以满足客户需求。为此,他们使用现代工具和技术,这些工具和技术本质上支…...
K8Spod组件
一个pod能包含几个容器 一个pause容器(基础容器/父容器/根容器) 一个或者多个应用容器(业务容器) 通常一个Pod最好只包含一个应用容器,一个应用容器最好也只运行一个业务进程。 同一个Pod里的容器都是运行在同一个node节点上的,并且共享 net、…...
clickhouse-client INSERT CSV/TSV时跳过错误行
clickhouse-client INSERT CSV/TSV时跳过错误行 在使用clickhouse-client向ck中导入csv文件时,当csv中有个别行数据格式错误时,整个文件就插入失败了,经常会导致丢数据。 经过一番搜索,发现ck提供了两个参数可以跳过错误行&#x…...
直流稳压电源电路
一、稳压电源的技术指标及对稳压电源的要求 稳压电源的技术指标可以分为两大类:一类是特性指标,如输出电压、输出电滤及电压调节范围;另一类是质量指标,反映一个稳压电源的优劣,包括稳定度、等效内阻(输出电阻&#x…...
记录爬虫编写步骤
本文讲解 Python 爬虫实战案例:抓取百度贴吧(https://tieba.baidu.com/)页面,比如 Python爬虫吧、编程吧,只抓取贴吧的前 5 个页面即可。今天一个毕业学生问到一个问题:不清楚编写爬虫的步骤,不…...
SpringBoot配置Swagger2与Swagger3
swagger是什么? 在平时开发中,一个好的API文档可以减少大量的沟通成本,还可以帮助新加入项目的同事快速上手业务。大家都知道平时开发时,接口变化总是很多,有了变化就要去维护,也是一件比较头大的事情。尤…...
C/C++ 枚举
目录 枚举概述 枚举的使用 枚举的大小计算 枚举的优点 C语言中的自定义类型有:结构 位段 枚举 联合 枚举概述 枚举顾名思义就是一一列举,把可能的取值一一列举。 比如我们现实生活中:一周的星期一到星期日是有限的7天,…...
P12 音视频复合流——TS流讲解
前言 从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Linux C应用编程(概念类)_C…...
三维重建 3D Gaussian Splatting:实时的神经场渲染
目录 概念理解三维高斯喷洒 渲染实例 依赖项: 编译报错: 预训练模型 13G:...
公众平台的微信网站开发/网络推广平台有哪些?
在Webdesignerwall.com逛时,看到一篇文章《5 Simple, But Useful CSS Properties 》一文,细看以之后真的很有用,这几个属性大家都有见过,也很常用,但有几个人会认为他很有用呢?不信,我们来一起看…...
wordpress音乐站源码/武汉seo网站排名
报错信息 The data property "loading" is already declared as a prop. Use prop default value instead. default{data}中的“loading”属性已经在 default{props} 中定义。默认使用 default{props}中的属性值替代。 vue.runtime.esm.js:619 [Vue warn]: The d…...
wordpress 时尚网/免费行情网站大全搜狐网
我现在的电脑是2017年买的游戏本,高考之后买的电脑,但是由于是电脑小白在使用电脑的过程中踩过很多坑,比如电脑会遇到系统卡顿、蓝屏、系统不流畅等问题。但是只要有一颗探索的心,这些问题都不是事。我不是计算机专业的哈…...
黑龙江建设银行网站/sem技术培训
目录帧动画(时间的暂停和开始)创建安卓应用编写视图(activity_shuji.xml)字符串资源文件strings.xml主界面运行效果帧动画(时间的暂停和开始) 创建安卓应用 编写视图(activity_shuji.xml&#…...
用什么语言来做网站/网站推广优化排名
目前的测试效果性能较2.4.6 提高有20% spark 3.0 性能改进项--简化内容可以参考 https://www.cnblogs.com/xing901022/p/13381167.html : spark3.0 的 发布时间 --2020年6月 大版本的更新注定有许多性能优化方面的新特性,其中整个版本升级改进中spark …...
揭阳网站建设策划方案/营销图片素材
在Linux系统中,Resouce limit指在一个进程的执行过程中,它所能得到的资源的限制,比如进程的corefile的最大值,虚拟内存的最大值等。Resouce limit的大小可以直接影响进程的执行状况。其有两个最重要的概念:soft limit …...