[Day 07] 特徵图想让人分群 ~模型们的迁移学习战~ 第二季 (k-means 实作篇)

前言

昨天我们使用预训练模型EfficientNet去提取一张表情的高阶特徵图(1280张特徵图),
今天,我们要用k-means将图片特徵分群。
避免你忘了,下面的特徵都是来自这张原图。
范例图片


如何决定最佳k数?

这1280张高阶特徵图,一定有其意义在。
而我们假设这些意义可以被归类成k群,
那我们可以用手肘法决定出最佳k数!

手肘法(Elbow Method)

其概念是先算出所有资料点与各群中心距离的平方和(Sum of Squared Error, SSE),
理论上,k=1时的SSE最大,k=N(资料点个数)时SSE为0。
所以随着k提升,SSE就会下降。
虽然我们希望SSE变小,但k=N时明显不合理(每个群都只有一个资料点= =)。
所以我们的判断准则是:k提升到k_best时,SSE下降的趋势开始不明显。
而这就是手肘法取名的由来,
因为k提升到k_best时,SSE的下降斜率会从倾斜大幅转为平缓。

SSE的程序码实现:
sum(np.min(cdist(X, X_mean, 'euclidean'), axis=1)) / sample_size)

sample_size, nrows, ncols = X_features.shape
X = X_features.reshape((sample_size, nrows*ncols))
distortions = []
K = range(1, 10)
for k in K:
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    distortions.append(sum(np.min(cdist(X, kmeans.cluster_centers_, 'euclidean'), axis=1)) / sample_size)

绘制手肘图

plt.plot(K, distortions, 'bx-')
plt.xlabel('k')
plt.ylabel('Distortion')
plt.title('The Elbow Method showing the optimal k')
for k in range(1, 9):
    plt.text(k+0.65, 0.3, f"{distortions[k]-distortions[k-1]:.2f}",
             bbox=dict(facecolor='green', alpha=0.5))
plt.show()

绿色框里面的数字是k群的SSE与k-1群的SSE的相减,
可以发现k=5只比k=4下降了0.08,SSE斜率已经平缓。
所以最终决定k=4。
04


结语

透过两天的实作,
我想大家应该跟我一样一头雾水,
心里想「我分出这四类特徵图有甚麽用呢?我还是不知道其代表的意义啊!」
(虽然意义不好解释,但这些特徵图的确可以有效地让神经网路分类器认识一张表情图)
没错!
这就是分群方法的痛点:由於没有标签,各群的意义需要人们自己定义。
但是每个人的定义不同导致分群并没有统一的标准。
而这个时候就需要资料科学家跳出来解决了。

其实除了手肘法,还有其他指标可以决定出最佳k数,
像是beale、gap、c index、gamma等。
有兴趣的朋友可以将google这些关键字。

试试看:请尝试描述各群特徵图的含意

第 0 群特徵图:
c0
第 1 群特徵图:
c1
第 2 群特徵图:
c2
第 3 群特徵图:
c3

缩小後合在一起看(反正我是看不出来XD

c_all


<<:  Day 08 - UPDATE 把资料改成想要的样子!

>>:  每个人都该学的30个Python技巧|技巧 22:想怎麽设就怎麽设的自订函式(字幕、衬乐、练习)

[Day 33] 再访碰撞侦测与解析(五) - Debug Ray vs Rect (二)

今日目标 继续Debug Ray vs Rect的部分 MISSION FAILED! QAQ 今天...

解决 IntelliJ IDEA中文乱码

现在IntelliJ 已经成为开发JAVA使用的主流IDE, 但我们最常遇到的就是IDE出现中文乱码...

[Cmoney 菁英软件工程师战斗营] IOS APP 菜鸟开发笔记(7)----自定义弹出视窗

前言 因为UI和UX方面的需求,这几天上网搜寻了如何自定义下一页的弹出大小,弹出位置和动画,发现有蛮...

Day [3] — this:建构物件 — JS之浸猪笼系列

如果你不知道这个系列为什麽叫这种激烈的名字可以看这篇: Day [0] — JS之浸猪笼系列 如果你...

DAY10 MongoDB 聚合(Aggregate)种类介绍

DAY10 MongoDB 聚合(Aggregate)种类介绍 终於来到第十天,进入比较有趣(X)、...