我是靠谱客的博主 幸福长颈鹿,这篇文章主要介绍2022年12月1日 K-Means聚类算法学习笔记,现在分享给大家,希望可以做个参考。

​ K 均值聚类算法思路:首先选取一个K值(簇数),然后随机选取K个聚类中心,计算第三个点到聚类中心的距离,并将它划归为最近的聚类中心,然后计算每个簇的均值作为新的聚类中心,重复以上操作,直到某个情况新的聚类中心与旧的聚类中心的距离小于某个阈值则聚类结束。

这篇博客举了通俗的例子来讲解,可以看一下

算法比较简单,看两篇博客就能理解了

这篇博客过程很详细的算法过程,但是代码在作图方面有点问题

第二篇博客

这篇博客代码完整

第三篇博客

复制代码
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
import random import pandas as pd import numpy as np import matplotlib.pyplot as plt import math import numpy as np import matplotlib.pyplot as plt # 两点距离 def distance(e1, e2): return np.sqrt((e1[0]-e2[0])**2+(e1[1]-e2[1])**2) # 集合中心 def means(arr): return np.array([np.mean([e[0] for e in arr]), np.mean([e[1] for e in arr])]) # arr中距离a最远的元素,用于初始化聚类中心 def farthest(k_arr, arr): f = [0, 0] max_d = 0 for e in arr: d = 0 for i in range(k_arr.__len__()): d = d + np.sqrt(distance(k_arr[i], e)) if d > max_d: max_d = d f = e return f # arr中距离a最近的元素,用于聚类 def closest(a, arr): c = arr[1] min_d = distance(a, arr[1]) arr = arr[1:] for e in arr: d = distance(a, e) if d < min_d: min_d = d c = e return c if __name__=="__main__": ## 生成二维随机坐标,手上有数据集的朋友注意,理解arr改起来就很容易了 ## arr是一个数组,每个元素都是一个二元组,代表着一个坐标 ## arr形如:[ (x1, y1), (x2, y2), (x3, y3) ... ] arr = np.random.randint(100, size=(100, 1, 2))[:, 0, :] ## 初始化聚类中心和聚类容器 m = 5 r = np.random.randint(arr.__len__() - 1) k_arr = np.array([arr[r]]) cla_arr = [[]] for i in range(m-1): k = farthest(k_arr, arr) k_arr = np.concatenate([k_arr, np.array([k])]) cla_arr.append([]) ## 迭代聚类 n = 20 cla_temp = cla_arr for i in range(n): # 迭代n次 for e in arr: # 把集合里每一个元素聚到最近的类 ki = 0 # 假定距离第一个中心最近 min_d = distance(e, k_arr[ki]) for j in range(1, k_arr.__len__()): if distance(e, k_arr[j]) < min_d: # 找到更近的聚类中心 min_d = distance(e, k_arr[j]) ki = j cla_temp[ki].append(e) # 迭代更新聚类中心 for k in range(k_arr.__len__()): if n - 1 == i: break k_arr[k] = means(cla_temp[k]) cla_temp[k] = [] ## 可视化展示 col = ['HotPink', 'Aqua', 'Chartreuse', 'yellow', 'LightSalmon'] for i in range(m): plt.scatter(k_arr[i][0], k_arr[i][1], linewidth=10, color=col[i]) plt.scatter([e[0] for e in cla_temp[i]], [e[1] for e in cla_temp[i]], color=col[i]) plt.show()
  • 缺点
    • 对初始化的点敏感 改进:先用算法分析数据分布,如重心和密度
    • 非球状分布搞不定
    • 数据集较大,收敛慢
    • 最终都会收敛,有可能是局部最优

最后

以上就是幸福长颈鹿最近收集整理的关于2022年12月1日 K-Means聚类算法学习笔记的全部内容,更多相关2022年12月1日内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(81)

评论列表共有 0 条评论

立即
投稿
返回
顶部