聚类分析 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 原理

  1. 找到两个距离最近的样本,将他们归为一组

  2. 计算其它样本与该组的距离,最近的样本与该组划在一起(linkage)
  1. 如此不断推进,直到所有样本形成一个大组(类)。

  2. 根据我们的专业经验,确定要分几个组。

  3. 每个样本依据上一步的模型,被分配到不同的组。

Hierachical Clustering 实操步骤

  1. 预备数据,使用dist()函数得到distance_matrix。

  2. 将得到的函数得到distance_matrix传入hclust(distance_matrix, method = “complete”),并选定linkage的方式(complete, single, average)。

  1. 将分组结果与原数据合并。

  2. 分析聚类结果

Hierachical Clustering 实操

install.packages(“mclust”)

使用hclust()来计算linkage 与 使用cutree提取预测的分类结果: 在后台,我们已经载入lineup的数据,是两队各6名球员在球场上的首发位置,我们来根据他们彼此间的距离来给他们分队,看看我们的分队(分类)结果与实际的分队有什么差距。

我们已知是两个队在场上,所以K=2。

hclust()的具体使用方法: hclust(distance_matrix, method = “complete”)。还可以是single, average。

由上面的函数可知,我们还需要distance_matrix。我们之前讲到距离,每一个人与其它所有人的距离,由这些距离组成的矩阵就是distance_matrix。

下面我们来实际操作:

  1. 计算场上运动员之间的distance matrix,命名为dist_players

  2. 使用hclust中的complete method 来做hierarchical clustering 并把结果命名为 hc_players。

  3. 将上面的结果按照k=2,也就是有两个组的情况,使用cutree(), 将得到的结果命名为 clusters_k2, 然后将其合并到原来的数据lineup中,形成新的数据框 lineup_k2_complete

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImxpbmV1cCA8LSByZWFkLmRlbGltKFwiaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy81b2xzeGhhOXVhbTEzdXovbGluZXVwLnR4dD9kbD0xXCIpIiwic2FtcGxlIjoibGlicmFyeShkcGx5cilcblxuIyBDYWxjdWxhdGUgdGhlIERpc3RhbmNlXG5kaXN0X3BsYXllcnMgPC0gX19fXG5cbiMgUGVyZm9ybSB0aGUgaGllcmFyY2hpY2FsIGNsdXN0ZXJpbmcgdXNpbmcgdGhlIGNvbXBsZXRlIGxpbmthZ2VcbmhjX3BsYXllcnMgPC0gX19fXG5cbiMgQ2FsY3VsYXRlIHRoZSBhc3NpZ25tZW50IHZlY3RvciB3aXRoIGEgayBvZiAyXG5jbHVzdGVyc19rMiA8LSBfX19cblxuIyBDcmVhdGUgYSBuZXcgZGF0YWZyYW1lIHN0b3JpbmcgdGhlc2UgcmVzdWx0c1xubGluZXVwX2syX2NvbXBsZXRlIDwtIG11dGF0ZShsaW5ldXAsIGNsdXN0ZXIgPSBfX18pIiwic29sdXRpb24iOiJsaWJyYXJ5KGRwbHlyKVxuXG4jIENhbGN1bGF0ZSB0aGUgRGlzdGFuY2VcbmRpc3RfcGxheWVycyA8LSBkaXN0KGxpbmV1cClcblxuIyBQZXJmb3JtIHRoZSBoaWVyYXJjaGljYWwgY2x1c3RlcmluZyB1c2luZyB0aGUgY29tcGxldGUgbGlua2FnZVxuaGNfcGxheWVycyA8LSBoY2x1c3QoZGlzdF9wbGF5ZXJzLCBtZXRob2QgPSBcImNvbXBsZXRlXCIpXG5cbiMgQ2FsY3VsYXRlIHRoZSBhc3NpZ25tZW50IHZlY3RvciB3aXRoIGEgayBvZiAyXG5jbHVzdGVyc19rMiA8LSBjdXRyZWUoaGNfcGxheWVycywgayA9IDIpXG5cbiMgQ3JlYXRlIGEgbmV3IGRhdGFmcmFtZSBzdG9yaW5nIHRoZXNlIHJlc3VsdHNcbmxpbmV1cF9rMl9jb21wbGV0ZSA8LSBtdXRhdGUobGluZXVwLCBjbHVzdGVyID0gY2x1c3RlcnNfazIpIn0=

检查我们的分类结果

  1. 数一下每一个cluster各有几名球员

  2. 将球员的位置绘制在图上,并用颜色区分两个cluster

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImxpbmV1cCA8LSByZWFkLmRlbGltKFwiaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy81b2xzeGhhOXVhbTEzdXovbGluZXVwLnR4dD9kbD0xXCIpXG5saWJyYXJ5KGdncGxvdDIpXG5saWJyYXJ5KGRwbHlyKVxuXG4jIENhbGN1bGF0ZSB0aGUgRGlzdGFuY2VcbmRpc3RfcGxheWVycyA8LSBkaXN0KGxpbmV1cClcblxuIyBQZXJmb3JtIHRoZSBoaWVyYXJjaGljYWwgY2x1c3RlcmluZyB1c2luZyB0aGUgY29tcGxldGUgbGlua2FnZVxuaGNfcGxheWVycyA8LSBoY2x1c3QoZGlzdF9wbGF5ZXJzLCBtZXRob2QgPSBcImNvbXBsZXRlXCIpXG5cbiMgQ2FsY3VsYXRlIHRoZSBhc3NpZ25tZW50IHZlY3RvciB3aXRoIGEgayBvZiAyXG5jbHVzdGVyc19rMiA8LSBjdXRyZWUoaGNfcGxheWVycywgayA9IDIpXG5cbiMgQ3JlYXRlIGEgbmV3IGRhdGFmcmFtZSBzdG9yaW5nIHRoZXNlIHJlc3VsdHNcbmxpbmV1cF9rMl9jb21wbGV0ZSA8LSBtdXRhdGUobGluZXVwLCBjbHVzdGVyID0gY2x1c3RlcnNfazIpIiwic2FtcGxlIjoibGlicmFyeShnZ3Bsb3QyKVxubGlicmFyeShkcGx5cilcblxuIyBDb3VudCB0aGUgY2x1c3RlciBhc3NpZ25tZW50c1xuY291bnQobGluZXVwX2syX2NvbXBsZXRlLCBfX18pXG5cbiMgUGxvdCB0aGUgcG9zaXRpb25zIG9mIHRoZSBwbGF5ZXJzIGFuZCBjb2xvciB0aGVtIHVzaW5nIHRoZWlyIGNsdXN0ZXJcbmdncGxvdChsaW5ldXBfazJfY29tcGxldGUsIGFlcyh4ID0gX19fLCB5ID0gX19fLCBjb2xvciA9IGZhY3RvcihfX18pKSkgK1xuICBnZW9tX3BvaW50KCkiLCJzb2x1dGlvbiI6ImxpYnJhcnkoZ2dwbG90MilcbmxpYnJhcnkoZHBseXIpXG4jIENvdW50IHRoZSBjbHVzdGVyIGFzc2lnbm1lbnRzXG50YWJsZShsaW5ldXBfazJfY29tcGxldGUkY2x1c3RlcilcblxuIyBQbG90IHRoZSBwb3NpdGlvbnMgb2YgdGhlIHBsYXllcnMgYW5kIGNvbG9yIHRoZW0gdXNpbmcgdGhlaXIgY2x1c3RlclxuZ2dwbG90KGxpbmV1cF9rMl9jb21wbGV0ZSwgYWVzKHggPSB4LCB5ID0geSwgY29sb3IgPSBmYWN0b3IoY2x1c3RlcikpKSArXG4gIGdlb21fcG9pbnQoKSJ9

注意,不同的linkage方法可能会产生不同的结果,试一试更改下面的method:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJsaWJyYXJ5KGdncGxvdDIpXG5saWJyYXJ5KGRwbHlyKVxuXG5saW5ldXAgPC0gcmVhZC5kZWxpbShcImh0dHBzOi8vd3d3LmRyb3Bib3guY29tL3MvNW9sc3hoYTl1YW0xM3V6L2xpbmV1cC50eHQ/ZGw9MVwiKVxuIyBDYWxjdWxhdGUgdGhlIERpc3RhbmNlXG5kaXN0X3BsYXllcnMgPC0gZGlzdChsaW5ldXApXG5cbiMgUGVyZm9ybSB0aGUgaGllcmFyY2hpY2FsIGNsdXN0ZXJpbmcgdXNpbmcgdGhlIGNvbXBsZXRlIGxpbmthZ2VcbmhjX3BsYXllcnMgPC0gaGNsdXN0KGRpc3RfcGxheWVycywgbWV0aG9kID0gXCJjb21wbGV0ZVwiKVxucGxvdChoY19wbGF5ZXJzKSJ9