原文链接:http://tecdat.cn/?p=6689
原文出处:拓端数据部落公众号
在本文中,188 个国家基于这 19 个社会经济指标汇集在一起,应用 Python 实现的蒙特卡罗 K -Means 聚类算法。通过将相似国家分组在一起并对其进行概括,聚类能够缩小发现有吸引力投资机会所需的工作量。
在探讨聚类国家和得出结论的后果之前,本文具体介绍了间隔度量,聚类品质测量,聚类算法,K-Means 聚类算法。
聚类实践 – 类似与间隔的度量
聚类是将一组异构(不同)对象划分为同类(类似)对象的子集的过程。聚类分析的外围是假如给定任何两个对象,您能够量化这些对象之间的相似性或不相似性。在间断搜寻空间中距离测量相似性。
上面我写了对于间断搜寻空间的相似性度量。
class Similarity:
def \_\_init\_\_(self, minimum):
self.e = minimum
self.vector_operators = VectorOperations()
def manhattan\_distance(self, p\_vec, q_vec):
"""
这个办法实现了曼哈顿间隔的度量
:param p_vec: 矢量一
:param q_vec: 向量二
: 返回:向量一和二之间的曼哈顿间隔
"""
return max(np.sum(np.fabs(p\_vec - q\_vec)), self.e)
def square\_euclidean\_distance(self, p\_vec, q\_vec):
"""
这个办法实现了平方欧几里得间隔指标
:param p_vec: 向量一
:param q_vec: 向量二
: 返回:向量一和向量二之间的平方欧几里得间隔
"""
diff = p\_vec - q\_vec
return max(np.sum(diff ** 2), self.e)
聚类实践 – 聚类算法类
聚类算法的两个次要类别是分层聚类和分区聚类。分层聚类通过将小聚类合并为较大的聚类或将较大的聚类分成较小的聚类来造成聚类。分区聚类通过将输出数据集划分为互斥的子集来造成聚类。
分层和分区聚类之间的差别次要与所需的输出无关。分层聚类仅须要相似性度量,而分区聚类可能须要许多额定的输出,最常见的是簇的数量。一般而言,分层聚类算法也更适宜于分类数据。
分层聚类
有两种类型的档次聚类,即凝聚聚类和决裂聚类。凝聚聚类是一种自下而上的办法,波及将较小的聚类(每个输出模式自身)合并为更大的聚类。决裂聚类是一种自上而下的办法,从一个大型集群(所有输出模式)开始,并将它们分成越来越小的集群,直到每个输出模式自身都在集群中。
分区聚类
在本文中,咱们将重点介绍分区聚类算法。分区聚类算法的两个次要类别是 基于质心的聚类 和 基于密度的聚类。本文重点介绍基于质心的聚类; 特地是风行的 K -means 聚类算法。
聚类实践 – K-Means 聚类算法
K-Means 聚类算法是一种基于质心的分区聚类算法。K 均值聚类算法包含三个步骤(初始化,调配和更新)。反复这些步骤,直到聚类曾经收敛或曾经超过迭代次数。
初始化
在搜寻空间中随机初始化一组质心。这些质心必须与聚类的数据模式处于同一数量级。换句话说,如果数据模式中的值介于 0 到 100 之间,则初始化值介于 0 和 1 之间的随机向量是没有意义的。
调配
一旦质心在空间中被随机初始化,咱们迭代数据集中的每个模式并将其调配给最近的质心。尝试并行执行此步骤,尤其是在数据集中有大量模式的状况下。
更新
一旦将模式调配给它们的质心,就利用均值漂移启发式。此启发式替换每个质心中的每个值,并将该值的平均值替换为已调配给该质心的模式。这将质心移向属于它的图案的高维平均值。均值漂移启发式问题在于它对异样值敏感。为了克服这个问题,能够应用 K -medoids 聚类算法,也能够应用 标准化数据来克制异样值的影响,
迭代
反复这三个步骤进行屡次迭代,直到聚类曾经收敛于解决方案。一个十分好的 GIF 显示如下所示,
PYTHON 代码 – 聚类类的补充
上面的 Python 办法是 Clustering 类的扩大,它容许它执行 K -means 聚类算法。这波及应用均值漂移启发式更新质心。
聚类实践 – 聚类品质的度量
假如您有肯定的类似度和数据聚类,您依然须要一个指标函数来掂量该聚类的品质。大多数群集质量指标都尝试依据群集间和群集内间隔来优化群集。简略地说,这些指标确保同一集群中的模式严密 相干 ,不同集群中的模式 相差 甚远。
量化误差
量化误差测量由量化引入的舍入误差,行将一组输出值映射到无限的较小汇合。这基本上是咱们通过将模式聚类到_k 个_集群中所做的事件。
留神:图像假如咱们应用曼哈顿间隔。
在量化误差的上述阐明中,咱们计算每个模式与其调配的质心之间的平方相对间隔之和。
Davies-Bouldin指数
戴维斯 - 尔丁规范是基于一个特定的聚类的簇内和簇间的间隔比。
留神:图像假如咱们应用曼哈顿间隔。
在 Davies-Bouldin 指数的上图中,咱们有三个由三个模式组成的集群。
掠影指数
该 掠影指数)是掂量一个特定的聚类品质的最风行的形式之一。它掂量每个模式与其本身集群中的模式的类似水平,与其余集群中的模式进行比拟。
def silhouette_index(self, index):
# 存储到每个集群的总间隔
silhouette_totals = \[\]
# 存储每个簇中的数量
silhouette_counts = \[\]
# 初始化这些变量
for i in range(solution.num_clusters):
silhouette_totals.append(0.0)
silhouette_counts.append(0.0)
for i in range(len(self.solution.pattern)):
# 对于除咱们当初计算的模式之外的每个模式
如果 i != index。# 失去 pattern\[index\]与该图案之间的间隔
distance = s.fractional_distance(self.solution.patterns\[i\],
# 将该间隔增加到正确群集的掠影总数中
silhouette_totals\[self.solution.solution\[i\]\] += distance。+= 间隔
# 更新该簇中的图案数量
silhouette_counts\[self.solution.solution\[i\]\] += 1 += 1
# 设置变量以找到间隔最小的集群(不等于图案 \[索引 \]的集群)。smallest\_silhouette = silhouette\_totals\[0\] / max(1.0, silhouette_counts\[0\])
for i in range(len(silhouette_totals)):
# 从 pattern\[index\]中计算出该簇中每个图案的均匀间隔
silhouette = silhouette\_totals\[i\] / max(1.0, silhouette\_counts\[i\])
# 如果均匀间隔较低,并且不是 pattern\[index\]集群,则更新该值
如果 silhouette < smallest_silhouette and i != self.solution.solution\[index\]:
Smallest_silhouette = silhouette
# 计算模式 \[index\]的外部集群间隔
index\_silhouette = self.e + silhouette\_totals\[index\_cluster\] / max(1.0, silhouette\_counts\[index_cluster\] )
# 返回 pattern\[index\]与另一个簇的图案的最小间隔之间的比率,并且
# 该图案与 pattern\[index\]属于同一集群
高轮廓值示意ž 与其本人的簇很好地匹配,并且与相邻簇很不匹配。
留神:图像还假如咱们应用曼哈顿间隔。
在应用这些指标过来几个月后,我得出的论断是,它们都不是完满的,
- 量化误差 – 该度量的计算复杂度最小,然而度量偏差大量群集,因为当您增加更多质心时,群集会变得更小(更紧凑),并且在极其状况下,您可能会为每个群集调配一个模式质心。在这种状况下,量化误差被最小化。后果是最可信 的。
- 戴维斯 – 布尔丁 – 随着你减少的值,每个质心之间的间隔均匀会天然缩小。因为这个术语在分母中,所以对于较大的值,最终除以较小的数字ķ。其后果是度量偏差于具备较少数量的簇的解决方案。
- Silhouette Index – 这个指标的计算复杂性很大。假如您计算从每个模式到每个其余模式的间隔,以计算哪个簇最靠近,并且您为每个模式执行此操作。在这个例子中,相当于 35,156 次计算。
以下对不同指标的剖析很好地证实了这些偏差; 只管事实上他们应该测量雷同的货色,但他们简直齐全是负相关的。
X
QE
D B
SI
QE
1.0
-0.965
-0.894
SB
-0.965
1.0
0.949
SI
-0.894
0.949
1.0
PYTHON 代码 – 聚类
在评估给定聚类的适应性之前,您须要理论聚类模式。Clustering 类蕴含将模式调配给最近的质心的办法。
PYTHON 代码 – 指标函数
ClusteringQuality 类测量给定输出模式的聚类的品质。
聚类实践 – 聚类中的蒙特卡罗办法
K-Means 聚类算法的两个最大问题是:
- 它对质心的随机初始化很敏感
- 初始化的质心数,k
因为这些起因,K-means 聚类算法常常重启屡次。因为初始化(通常)是随机的,所以咱们基本上对质心的随机高维起始地位进行采样,这也称为蒙特卡罗模仿。为了比拟独立模仿的解决方案,咱们须要掂量集群品质,例如后面探讨过的那些。
确定性初始化
我说初始化通常是随机的,因为 K -Means 聚类算法有确定性初始化技术。
随机初始化
不同之处在于伪随机序列中的下一个随机数与先前的随机数_无关_,而在准随机数序列中,下一个随机数_取决于_先前的随机数。相干随机数笼罩搜寻空间的更大 面积。
比拟二维空间中的伪随机序列(左)和准随机序列(右)
抉择正确的 K
除了测试不同的初始化之外,咱们还能够在蒙特卡罗框架中测试不同的值 k。目前,没有动静确定正确数量的聚类的最佳形式,只管_总是_正在钻研用于确定正确 k 值的技术。我更违心只是凭教训尝试不同的_k_值并比拟后果,只管这很费时,特地是在大型数据集上。
聚类后果 – 可视化和质心剖析
欧几里德间隔和量化误差是蒙特卡罗 K 均值聚类中应用的间隔和品质度量。数据集是 2014 年的标准化工夫点数据集,其中包含 19 个与理论 GDP 增长正相干的社会经济指标。
群集细分和质心剖析
上面的每个标签都将集群合成为属于它的国家,并将质心与咱们汇集的 19 个社会经济指标中的每一个的核心质心进行比拟。
2014 年该群组中的国家 / 地区
聚类后果 – 论断和进一步钻研
量化不是风险管理,衍生品定价或算法交易; 它是对于挑战事件的形式,通常应用统计和计算方法找到更好的办法。
2004 年,美国是一个异样值,并且本人占据了一个集群。该集群的特点是 PPP 的汇率低,进口高,进口高,家庭收入高,工业生产高,政府支出绝对较高,特地是在衰弱方面。在这个工夫点,最大的差别:中国产生的投资数量要大得多,而且人口(人口在 15 到 64 岁之间)更多。在工业生产方面,中国也超过了美国。这些在上面的比拟中显示,
金砖四国(巴西,俄罗斯,印度,中国和南非)显然更多地受到政治经济的驱动,而不是理论经济。以下是我的认识,
- 东欧与西欧 – 第一组中的国家与第五组和第二组中的国家之间仿佛有显著的区别。过来十年来,西班牙,爱尔兰,捷克共和国和其余左近国家产生了变动。这可能是主权债权危机的后果。
- 东西方国家 – 大多数亚洲国家占据不同的集群,而美国和英国等传统的东方国家实际上并不占据同一集群。
- 金砖四国 – 巴西,俄罗斯,印度,中国和南非属于不同的集群。尽管他们可能已达成贸易协定,但这并不意味着这些国家具备雷同的社会,人口和经济形成或将来理论 GDP 增长的雷同后劲。
- 非洲增长故事 – 尽管资本市场在过来十年中体现良好,但这仿佛并没有反映出非洲大陆的社会,人口和经济形成的重大变动。乏味的是,印度和巴基斯坦不再与中非和南非国家汇集在一起。
- 北非与南部非洲 – 北非国家(摩洛哥,阿尔及利亚,埃及,利比亚等)与非洲其余国家之间存在显著区别。令人诧异的是,南非当初与这些国家汇集在一起。
- 新兴国家与发达国家。
如果您发现其余乏味的关系,请评论。因为咱们不晓得每个社会经济指标的绝对重要性,因而无奈量化在一个集群与另一个集群中的有多好。在某些状况下,咱们无奈确定价值是好还是坏。例如,如果政府效率低下,政府的大笔收入是否依然无效?尽管如此,我还是构建一个度量规范来对每个集群进行排名:
排名 = 进口 + 家庭收入 + 进口 + 改善卫生 + 改善水 + 人口 + 15 岁至 64 岁人口增长 + 总投资 + 城市百分比 + 手机订阅 + 政府支出 + 政府收入 + 医疗收入 + 工业生产 + 互联网用户 – PPP 的汇率 – 失业率 – 年龄依赖率
依据此指标,每个群集的绝对排名如下所示,
簇
排名值
秩
计数
6
10.238
1
2
8
5.191
2
22
1
5.146
3
20
5
3.827
4
20
2
3.825
5
45
4
3.111
6
32
3
3.078
7
4
7
1.799
8
43
这个排名并不完满,但它再次证实了咱们的观点,即世界是不平等的。
那对投资者意味着什么呢?我认为这意味着应该在处于不同倒退阶段的国家之间作出辨别。这是因为尽管大多数欠发达国家代表的是具备最大收益后劲的投资,但它们的危险也更大,可能须要更长的工夫能力取得收益。现实状况下,这些因素应互相衡量,与投资者的危险收益偏好进行比拟。