1.基于聚类的相似性
通常我们希望解决如下问题:想知道一群人中的一个成员与其他成员的相似度时多少。例如,某品牌想知道该品牌对那种类型的人群最具有吸引了,也就是说具有哪些特征(例如性别,年龄层,工作,收入等)的群体对该品牌表现出的兴趣最为强烈。并且还可以分析出该品牌的哪种特性吸引了这类群体。
对不同的观测记录,如何理解用距离的概念来阐明它们互相之间的相似性和相异性。这需要针对分析数据定义一些不同类型的距离矩阵。一般地,仅仅死算这些距离还不够。“多维定标技术”可以基于观察值之间的距离度量进行聚类。通过MDS,我们可以只使用所有点之间的一个距离度量,就可以将数据进行可视化。
2.距离度量与多维定标简介
首先给出一个示例,这里我们拥有4名用户ABCD以及6项产品1-6,每个用户对这6中产品进行评价,评价标准很简单,对用户有用则记为1,无用则记为-1,不做评价/不关心记为0。这样我们就得到了一个4*6的矩阵,矩阵内容就是用户对产品的评价。现在我们需要使用不同用户对上述产品评价的差异来生成一个用户之间的距离度量。
用户/产品 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
A | 0 | -1 | 0 | 0 | -1 | 0 |
B | -1 | 0 | -1 | 0 | 0 | 1 |
C | 0 | 0 | 0 | 1 | 0 | 0 |
D | 1 | 0 | 0 | 0 | 1 | 0 |
使用这份数据生产一个距离度量的第一步是,摘要每个产品的用户评分,因为通过评分可以使用户和其他用户进行关联。换言之,现在的矩阵仅仅是将用户和每个产品关联起来,因此我们需要换一种思路,把这个4X6的矩阵转化为一个4X4的矩阵,在新矩阵中,每个元素都代表了用户之间基于产品评分所产生的关联。将4X6的矩阵转换为4X4的矩阵的方法则是将现有矩阵和它自己的转置矩阵相乘。 这个乘法的意义在于体现原来矩阵中每两行之间的相关性。
matrix = EE^T
在java中实现某矩阵与其自身的转置矩阵相乘的代码:
public class Matrix{
private int[][] matrix;
public int[][] getMatrix() {
return matrix;
}
public void setMatrix(int[][] matrix) {
this.matrix = matrix;
}
public Matrix(int[][] matrix) {
super();
this.matrix = matrix;
}
public int[][] inverse(){
int[][] transMatrix=new int[matrix[0].length][matrix.length];
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[i].length;j++){
transMatrix[j][i]=matrix[i][j];
}
}
return transMatrix;
}
public int[][] PastInverse(){
int[][] result=new int[matrix.length][matrix.length];
int[][] transMatrix=new Matrix(matrix).inverse();
for(int i=0;i<result.length;i++){
int sum=0;
for(int j=0;j<result[i].length;j++){
for(int k=0;k<transMatrix.length;k++){
sum+=matrix[i][k]*transMatrix[k][j];
}
result[i][j]=sum;
sum=0;
}
}
return result;
}
}
得到的新矩阵反映了:在已知两个用户都进行了评分的那些产品的情况下,用户对产品的评分大体是一致(正)的还是不一致(负)的。非对角线的元素的正值越大,则两个用户的评分就越一致;同样,负值越小,则两个用户的评分差异就越大。对角线元素只是反映了该用户对多少个产品进行了评分。
需要注意的是,这个矩阵传递的信息是有限的,因为我们只能对用户的共有评分记录给出一些解释,但我们想要的结果是可以通过某种方法将用户评分记录的差异泛化到更丰富的表达程度。为此,我们将在多维空间中引入欧式距离的概念。欧式距离(Euclidean distance)是我们直观上所感受到的距离的一个公式化描述。
我们将基于上面的矩阵乘积所定义的整体相似性和差异性度量,来计算所有用户之间的欧式距离。为了实现这一点,我们将把每个用户的所有评分作为一个向量。
于是我们对A用户和B用户进行比较,利用欧氏距离公式来计算AB用户之间的距离
distance=sqrt(x^2+y^2)
计算不同用户之间欧式距离的代码如下:
//承接上一部分代码
public double[][] distanceMatrix(){
double[][] result=new double[matrix.length][matrix.length];
for(int i=0;i<matrix.length;i++){
int[] start=new int[matrix[i].length];
for(int line=0;line<matrix[i].length;line++){
//获取向量
start[line]=matrix[i][line];
}
for(int j=0;j<matrix.length;j++){
double distance=0;
for(int line=0;line<matrix[i].length;line++){
distance+=(start[line]-matrix[j][line])*(start[line]-matrix[j][line]);
}
distance=Math.sqrt(distance);
result[i][j]=distance;
}
}
return result;
}
经过计算前文中给出的矩阵里可以发现A用户与D用户的距离是最近的,而B用户和D用户的距离是最远的。通过距离矩阵,不同用户之间的差异得到了更为清晰的展示,现在我们希望进一步展示这种差异性。于是我们采用MDS技术对这种差异进行可视化处理。
MDS是一个统计技术集合,用于可视化地描述距离集合中的相似性和差异性。经典的MDS,它的整个处理过程包括:输入一个包含数据集中任意两个数据点之间距离的距离矩阵,返回一个坐标集合,这个集合可以近似反映每对数据之间的距离。近似反映 是因为在二维空间中很可能不存在被一组距离分开的点集。
3.实现MDS(多维标度法)
多维标度法时一种多远统计分析方法的总称,包含各种各样的模型和手段,其目的是通过各种途径把高维的研究对象转化成低维的情形来进行定位、分析和归类,同时又保留事物之间的原始关系。也是一种可视化方法。
MDS分析的数据不仅仅是事物之间的距离,也可以是相似系数,亲疏程度,如余弦相似度等,合理地将研究对象在低维空间中给出标度或位置。
MDS要处理的问题:由n个指标(变量、属性)反映的实体(entity),仅仅知道它们互相之间的某种距离(相似度),如何在较低维的空间中推测实体之间的原始距离,以反映这n个实体的真是结构关系。
MDS不是一个单独的方法,而是有相似的不同算法的集合,常用的MDS为距离标度(distance scaling),可以分为度量标度和非度量标度。
MDS方法有5个关键的要素,分别为主体、客体、准则、准则权重、主体权重。
客体:被评估的对象,可以认为是待分类的几个类别,数量M。
主体:评估客体的单位,就是训练数据,N个。
准则:根据研究目的的自行定义,用以评估客体优劣的标准,K个。
准则权重:主体衡量准则重要性后,对每个准则分别赋予权重值,P个。
主体权重:研究者权衡准则重要性后,对主体赋予权重值,N个。