聚类分析 Cluster Analysis:
机器学习当中的无监督学习,没有明确的预测对象。
Clustering is an unsupervised learning algorithm that tries to cluster data based on their similarity. Thus, there is no outcome to be predicted, and the algorithm just tries to find patterns in the data.
为什么要做聚类分析?
Customer segmentation, targeted marketing
根据相似度把样本分成不同的组,组内成员具有相似性,组间成员具有差异性。
Market segmentation is the activity of dividing a broad consumer or business market, normally consisting of existing and potential customers, into sub-groups of consumers based on some type of shared characteristics.
或者说, Customer segmentation is the process of dividing customers into groups based upon certain boundaries; clustering is one way to generate these boundaries.
相似度,用距离来度量。
欧几里得距离 Euclidean distance formula:
\[d(x, y) = \sqrt{(x_1-y_1)^2+(x_2-y_2)^2}\]
例如有两个运动员,我们要计算他们之间的空间距离,使用函数
dist()
:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJwbGF5ZXJzPC1tYXRyaXgocmJpbmQoYygwLDApLCBjKDMsNCkpLCBucm93ID0gMixcbiAgICAgICAgICAgICAgICBkaW1uYW1lcyA9IGxpc3QoYyhcInJlZFwiLCBcImJsdWVcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhcInhcIiwgXCJ5XCIpKSlcbnBsYXllcnNcblxuZGlzdChwbGF5ZXJzKSJ9
推而广之,如果我们要计算两个观测样本彼此之间的特征距离(不仅是空间上的x,y轴,还包括其它特征,速度,年龄,进球次数等),欧几里得距离的一般公式:
\[d(x, y) = \sqrt{(x_1-y_1)^2+(x_2-y_2)^2+...+(x_n-y_n)^2}\]
度量单位与变量的标准化:
身高与体重,厘米与米或者,怎么样他们之间的距离才有意义?
\[X_{scaled}=\frac{X-mean(X)}{sd(X)}\]
这样所有变量的均值是0,标准差是1.
Hierachical Clustering
重要概念: linkage - 计算某一个样本与其它群组的距离。例如在一群球员在场上,已知其中两名球员距离最近,那剩下的球员里,谁离他们俩最近?找出他!以此类推,把更多的人一层一层圈进来,就像一个石头扔进水里泛出的涟漪,或者金字塔的自上而下。
Hierachical Clustering 原理
找到两个距离最近的样本,将他们归为一组
- 计算其它样本与该组的距离,最近的样本与该组划在一起(linkage)
- 如何确定第三个样本与该组(组里有两个及以上样本)的距离:有 max, min, average三种方法,可以是第三者与两个的平均距离,最短距离,最大距离。不同的方法出来的聚类分析会有差异。
如此不断推进,直到所有样本形成一个大组(类)。
根据我们的专业经验,确定要分几个组。
每个样本依据上一步的模型,被分配到不同的组。
Hierachical Clustering 实操步骤
预备数据,使用dist()
函数得到distance_matrix。
将得到的函数得到distance_matrix传入hclust(distance_matrix, method = “complete”),并选定linkage的方式(complete, single, average)。
如果事先知道要分几个组,例如k=2,将从上述步骤得到的模型传入cutree(hc_players, k = 2)得到每个样本的分组。
如果事先不知道要分几个组,我们就把上述结果plot()出来,然后选取一个高度,例如, h=40, 将从上述步骤得到的模型传入cutree(hc_players, h = 40)得到每个样本的分组
将分组结果与原数据合并。
分析聚类结果
Hierachical Clustering 实操
install.packages(“mclust”)
使用hclust()
来计算linkage 与 使用cutree
提取预测的分类结果: 在后台,我们已经载入lineup
的数据,是两队各6名球员在球场上的首发位置,我们来根据他们彼此间的距离来给他们分队,看看我们的分队(分类)结果与实际的分队有什么差距。
我们已知是两个队在场上,所以K=2。
hclust()
的具体使用方法: hclust(distance_matrix, method = “complete”)。还可以是single, average。
由上面的函数可知,我们还需要distance_matrix。我们之前讲到距离,每一个人与其它所有人的距离,由这些距离组成的矩阵就是distance_matrix。
下面我们来实际操作:
计算场上运动员之间的distance matrix,命名为dist_players
使用hclust
中的complete
method 来做hierarchical clustering 并把结果命名为 hc_players。
将上面的结果按照k=2,也就是有两个组的情况,使用cutree()
, 将得到的结果命名为 clusters_k2
, 然后将其合并到原来的数据lineup
中,形成新的数据框 lineup_k2_complete
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImxpbmV1cCA8LSByZWFkLmRlbGltKFwiaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy81b2xzeGhhOXVhbTEzdXovbGluZXVwLnR4dD9kbD0xXCIpIiwic2FtcGxlIjoibGlicmFyeShkcGx5cilcblxuIyBDYWxjdWxhdGUgdGhlIERpc3RhbmNlXG5kaXN0X3BsYXllcnMgPC0gX19fXG5cbiMgUGVyZm9ybSB0aGUgaGllcmFyY2hpY2FsIGNsdXN0ZXJpbmcgdXNpbmcgdGhlIGNvbXBsZXRlIGxpbmthZ2VcbmhjX3BsYXllcnMgPC0gX19fXG5cbiMgQ2FsY3VsYXRlIHRoZSBhc3NpZ25tZW50IHZlY3RvciB3aXRoIGEgayBvZiAyXG5jbHVzdGVyc19rMiA8LSBfX19cblxuIyBDcmVhdGUgYSBuZXcgZGF0YWZyYW1lIHN0b3JpbmcgdGhlc2UgcmVzdWx0c1xubGluZXVwX2syX2NvbXBsZXRlIDwtIG11dGF0ZShsaW5ldXAsIGNsdXN0ZXIgPSBfX18pIiwic29sdXRpb24iOiJsaWJyYXJ5KGRwbHlyKVxuXG4jIENhbGN1bGF0ZSB0aGUgRGlzdGFuY2VcbmRpc3RfcGxheWVycyA8LSBkaXN0KGxpbmV1cClcblxuIyBQZXJmb3JtIHRoZSBoaWVyYXJjaGljYWwgY2x1c3RlcmluZyB1c2luZyB0aGUgY29tcGxldGUgbGlua2FnZVxuaGNfcGxheWVycyA8LSBoY2x1c3QoZGlzdF9wbGF5ZXJzLCBtZXRob2QgPSBcImNvbXBsZXRlXCIpXG5cbiMgQ2FsY3VsYXRlIHRoZSBhc3NpZ25tZW50IHZlY3RvciB3aXRoIGEgayBvZiAyXG5jbHVzdGVyc19rMiA8LSBjdXRyZWUoaGNfcGxheWVycywgayA9IDIpXG5cbiMgQ3JlYXRlIGEgbmV3IGRhdGFmcmFtZSBzdG9yaW5nIHRoZXNlIHJlc3VsdHNcbmxpbmV1cF9rMl9jb21wbGV0ZSA8LSBtdXRhdGUobGluZXVwLCBjbHVzdGVyID0gY2x1c3RlcnNfazIpIn0=
检查我们的分类结果
数一下每一个cluster各有几名球员
将球员的位置绘制在图上,并用颜色区分两个cluster
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImxpbmV1cCA8LSByZWFkLmRlbGltKFwiaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy81b2xzeGhhOXVhbTEzdXovbGluZXVwLnR4dD9kbD0xXCIpXG5saWJyYXJ5KGdncGxvdDIpXG5saWJyYXJ5KGRwbHlyKVxuXG4jIENhbGN1bGF0ZSB0aGUgRGlzdGFuY2VcbmRpc3RfcGxheWVycyA8LSBkaXN0KGxpbmV1cClcblxuIyBQZXJmb3JtIHRoZSBoaWVyYXJjaGljYWwgY2x1c3RlcmluZyB1c2luZyB0aGUgY29tcGxldGUgbGlua2FnZVxuaGNfcGxheWVycyA8LSBoY2x1c3QoZGlzdF9wbGF5ZXJzLCBtZXRob2QgPSBcImNvbXBsZXRlXCIpXG5cbiMgQ2FsY3VsYXRlIHRoZSBhc3NpZ25tZW50IHZlY3RvciB3aXRoIGEgayBvZiAyXG5jbHVzdGVyc19rMiA8LSBjdXRyZWUoaGNfcGxheWVycywgayA9IDIpXG5cbiMgQ3JlYXRlIGEgbmV3IGRhdGFmcmFtZSBzdG9yaW5nIHRoZXNlIHJlc3VsdHNcbmxpbmV1cF9rMl9jb21wbGV0ZSA8LSBtdXRhdGUobGluZXVwLCBjbHVzdGVyID0gY2x1c3RlcnNfazIpIiwic2FtcGxlIjoibGlicmFyeShnZ3Bsb3QyKVxubGlicmFyeShkcGx5cilcblxuIyBDb3VudCB0aGUgY2x1c3RlciBhc3NpZ25tZW50c1xuY291bnQobGluZXVwX2syX2NvbXBsZXRlLCBfX18pXG5cbiMgUGxvdCB0aGUgcG9zaXRpb25zIG9mIHRoZSBwbGF5ZXJzIGFuZCBjb2xvciB0aGVtIHVzaW5nIHRoZWlyIGNsdXN0ZXJcbmdncGxvdChsaW5ldXBfazJfY29tcGxldGUsIGFlcyh4ID0gX19fLCB5ID0gX19fLCBjb2xvciA9IGZhY3RvcihfX18pKSkgK1xuICBnZW9tX3BvaW50KCkiLCJzb2x1dGlvbiI6ImxpYnJhcnkoZ2dwbG90MilcbmxpYnJhcnkoZHBseXIpXG4jIENvdW50IHRoZSBjbHVzdGVyIGFzc2lnbm1lbnRzXG50YWJsZShsaW5ldXBfazJfY29tcGxldGUkY2x1c3RlcilcblxuIyBQbG90IHRoZSBwb3NpdGlvbnMgb2YgdGhlIHBsYXllcnMgYW5kIGNvbG9yIHRoZW0gdXNpbmcgdGhlaXIgY2x1c3RlclxuZ2dwbG90KGxpbmV1cF9rMl9jb21wbGV0ZSwgYWVzKHggPSB4LCB5ID0geSwgY29sb3IgPSBmYWN0b3IoY2x1c3RlcikpKSArXG4gIGdlb21fcG9pbnQoKSJ9
注意,不同的linkage方法可能会产生不同的结果,试一试更改下面的method:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJsaWJyYXJ5KGdncGxvdDIpXG5saWJyYXJ5KGRwbHlyKVxuXG5saW5ldXAgPC0gcmVhZC5kZWxpbShcImh0dHBzOi8vd3d3LmRyb3Bib3guY29tL3MvNW9sc3hoYTl1YW0xM3V6L2xpbmV1cC50eHQ/ZGw9MVwiKVxuIyBDYWxjdWxhdGUgdGhlIERpc3RhbmNlXG5kaXN0X3BsYXllcnMgPC0gZGlzdChsaW5ldXApXG5cbiMgUGVyZm9ybSB0aGUgaGllcmFyY2hpY2FsIGNsdXN0ZXJpbmcgdXNpbmcgdGhlIGNvbXBsZXRlIGxpbmthZ2VcbmhjX3BsYXllcnMgPC0gaGNsdXN0KGRpc3RfcGxheWVycywgbWV0aG9kID0gXCJjb21wbGV0ZVwiKVxucGxvdChoY19wbGF5ZXJzKSJ9