周末的休闲

2018/05/06 休息

Posted by WangXiaoDong on May 6, 2018
    今天早晨,师兄约我去健身,早晨我吃的比较少,结果健身的时候感觉胃不舒服,果然健身的话还是要多吃点!
中午回来后,和杭杰一起吃了顿午饭,下午就睡了一大觉。

今天,主要研究一下层次聚类在进行数据运算的时候,对数据结果进行自然簇分离而需要分析的API————inconsistent() 该函数是计算层次聚类不一致系数的,不一致系数越大,表明使用该阈值进行聚类的偏差越大。这样按照该不一致系数下的阈值进行聚类即相对于其他 情况下的阈值更不适合,因此可以进行自然簇的分离,即取阈值为该不一致系数下小一点即可。解释在这里

下面介绍API的使用方法。 首先,我们使用的原始数据如下:(注意,原始数据来源这里)

origin data : [[2], [8], [0], [4], [1], [9], [9], [0]]

下面为了讨论方便,我们把元素数据标签标号,如: [2] ==> x[0] [8] ==> x[1] … [0] ==> x[7]

下面使用层次聚类,按照如下方式输入实验:

Z = linkage(X, 'single')  ==> Z:

analysis:
下面序列从数字8开始,因为原始数据有8个,但是序列从0开始计算,所以使用了0~7号的数字序号。
[[  2.   7.   0.   2.] <== x[8] = {x[2], x[7]}  
 [  5.   6.   0.   2.] <== x[9] = {x[5],x[6]}
 [  0.   4.   1.   2.] <== x[10] = {x[0], x[4]}
 [  8.  10.   1.   4.] <== x[11] = {x[8], x[10]} = {x[2], x[7], x[0], x[4]}
 [  1.   9.   1.   3.] <== x[12] = {x[1], x[9]} = {x[1], x[5], x[6]}
 [  3.  11.   2.   5.] <== x[13] = {x[3], x[11]} = {x[3], x[8], x[10]} = {x[3], x[2], x[7], x[0], x[4]}
 [ 12.  13.   4.   8.]]<== x[14] = {x[12], x[13]} = {x[1], x[9], x[3], x[11]} = {x[1], x[5], x[6], x[3], x[8], x[10]} = {x[1], x[5], x[6], x[3], x[2], x[7], x[0], x[4]}

显然,第一列和第二列代表聚集的两类的序列号,第三列代表第一列和第二列序号所代表的集群在聚集时的距离(与层次聚类图的高度相等),第四列代表聚集时所包含的原始数据的个数。

然后为了计算组内均值,按照如下方式输入实验:

R = inconsistent(Z)  ==> R:     (这里没有指定d参数,则默认是2,代表进计算到深度为2的数据)

[[ 0.       0.       1.       0.     ]
 [ 0.       0.       1.       0.     ]
 [ 1.       0.       1.       0.     ]
 [ 0.66667  0.57735  3.       0.57735]
 [ 0.5      0.70711  2.       0.70711]
 [ 1.5      0.70711  2.       0.70711]
 [ 2.33333  1.52753  3.       1.09109]]

注意,R的行数和Z的行数一样,计算的时候一一对应。 则第一列代表Z对应行聚集时距离的平均值,第二列代表Z对应行聚集时距离的标准差,第三列代表计算计算该集群均值和标准差时选择的集群的个数,第四列是聚集时的偏值。 下面以上面的例子说明一下。

假设计算R第i行的数据。则按照如下方式计算: 对于第四行的数据: | Link | Height/Distance | | x[2] - x[7] | Z[0,2] = 0 | | x[0] - x[4] | Z[2,2] = 1 | | x[8] - x[10] | Z[3,2] = 1 |

显然,对于(1,1,0)组合的平均值对应的R[3,0] = 0.66667, 标准差对应的R[3,1] = 0.57735 (其中标准差计算时是N-1, 不是N)。 偏值计算如下:

       Z[i,2] - R[i,0]      1 - 0.6667 R[i,3]  =  ---------------  =   ----------  =  0.57735
          R[i,1]             0.57735

在举一个第七行的数据: | Link | Height/Distance | | x[1] - x[9] | Z[4,2] = 1 | | x[3] - x[11] | Z[5,2] = 2 | | x[12] - x[13] | Z[6,2] = 4 | (1,2,4) ==> avr = 2.33333 ==> 标准差 = 1.52753

写到这里,也行有人会问了,对于x[11]来说,明明也分为了{x[8], x[10]},为啥计算平均值和标准差的时候不加入进去? 这里就跟inconsistent()函数传入的参数K有关了,因为我在使用该函数是,没有传入参数K,因此该函数取默认值K=2,这个值代表 的是计算平均值时的深度。比如对于第七行数据来说,x[12] - x[13]代表深度1的数据。x[3] - x[11]和x[1] - x[9]代表深度为2的数据。而x[8]-x[10]代表深度为三的数据,默认值是2,所以 在计算平均值和标准差时就没有计算该数据。如果需要计算,则需要改K值即可。如果你想要计算深度到底,则K设置为你输入数据的长度N即可,因为层次聚类的结果的图形深度最高也不会超过你 数据的长度。