运行虚拟数据集结果
Input the name of data set: (TwoMoon or ThreeRing)
TwoMoon
iter = 5 lambda:16
Data set TwoMoon-> ACC:1.0000 NMI:1.0000 ARI:1.0000 error_cnt:0
运行真实数据集结果
iter = 6 lambda:8
100leaves
=====In iteration 1=====
ACC:0.8237 NMI:0.9292 ARI:0.4974 error_cnt:282
iter = 7 lambda:64
3sources
=====In iteration 1=====
ACC:0.6923 NMI:0.6216 ARI:0.4431 error_cnt:52
iter = 8 lambda:128
BBC
=====In iteration 1=====
ACC:0.6934 NMI:0.5628 ARI:0.4789 error_cnt:210
iter = 6 lambda:32
BBCSport
=====In iteration 1=====
ACC:0.8070 NMI:0.7600 ARI:0.7218 error_cnt:105
iter = 8 lambda:128
HW
=====In iteration 1=====
ACC:0.8820 NMI:0.9041 ARI:0.8496 error_cnt:236
iter = 6 lambda:32
HW2sources
=====In iteration 1=====
ACC:0.9940 NMI:0.9853 ARI:0.9867 error_cnt:12
iter = 6 lambda:32
NGs
=====In iteration 1=====
ACC:0.9820 NMI:0.9392 ARI:0.9554 error_cnt:9
iter = 7 lambda:64
WebKB
=====In iteration 1=====
ACC:0.7586 NMI:0.4133 ARI:0.4169 error_cnt:49
iter = 7 lambda:64
Hdigit
=====In iteration 1=====
ACC:0.9981 NMI:0.9939 ARI:0.9958 error_cnt:19
iter = 8 lambda:128
Mfeat
=====In iteration 1=====
ACC:0.8820 NMI:0.9041 ARI:0.8496 error_cnt:236
——————————
读取虚拟数据集TwoMoon
得到1x2个200x2的X,转置得到1x2个2x200的data
调用GMC,求解
m i n ∑ v ∑ i ∣ ∣ x i − x j ∣ ∣ 2 s i j + α ∣ ∣ s i ∣ ∣ 2 + w v ∣ ∣ U − S v ∣ ∣ 2 + λ ∗ t r a c e ( F T L u F ) min \sum_v{\sum_i{||x_i - x_j||^2s_{ij} + \alpha||s_i||^2} + w_v||U - Sv||^2 + \lambda*trace(F^TL_uF)} min∑v∑i∣∣xi−xj∣∣2sij+α∣∣si∣∣2+wv∣∣U−Sv∣∣2+λ∗trace(FTLuF)
s.t S v > = 0 , 1 T S i v = 1 , U > = 0 , 1 T U i = 1 , F T F = I S^v>=0, 1^TS^v_i=1, U>=0, 1^TU_i=1, F^TF=I Sv>=0,1TSiv=1,U>=0,1TUi=1,FTF=I
输入:
data 多视图数据集,即两个视图
c 聚类数=2
lambda λ=1
normData =0,就不需要做z-score标准化
输出:
y 最终的聚类结果,即聚类指标向量
U 统一矩阵
S0 每个视图的相似性诱导图 (SIG) 矩阵
S0_initial
F 图拉普拉斯矩阵的特征值
evs 嵌入表示
初始化1x2的S0
遍历两个视图,调用InitializeSIGs
参考Laplacian rank algorithm for graph-based clustering
输入:
X{i} 每列都是一个数据点
pn 邻居数k=15
issymmetric 0,如果为1则S = (S+S')/2
输出:
S0{i} 相似矩阵,每一行是一个数据点
D
调用L2_distance_1,计算当前X{i}的平方欧氏距离,其实应该说是2范数 ∣ ∣ A − B ∣ ∣ 2 = ∣ ∣ A ∣ ∣ 2 + ∣ ∣ B ∣ ∣ 2 − 2 A T B ||A-B||^2 = ||A||^2 + ||B||^2 - 2A^TB ∣∣A−B∣∣2=∣∣A∣∣2+∣∣B∣∣2−2ATB
aa=sum(a.*a); bb=sum(b.*b); ab=a'*b; d = repmat(aa',[1 size(bb,2)]) + repmat(bb,[size(aa,2) 1]) - 2*ab; d = real(d); d = max(d,0); d = d - diag(diag(d));
再对得到200x200的D每行升序排列得到索引矩阵idx
取D升序每行的[2:17]这16个距离记作di,构造每行的S
S ( i ) = d i ( 16 ) − d i 15 d i ( 16 ) − ∑ j = 1 15 d i ( j ) + e p s S(i)=\frac{d_i(16)-d_i}{15d_i(16)-\sum\limits_{j=1}^{15}d_i(j)+eps} S(i)=15di(16)−j=1∑15di(j)+epsdi(16)−di(明明论文里说是用高斯核的,但这个结果倒挺像什么插值的)
最终得到200x200的稀疏S(有元素的位置索引就是对应idx的值)
最终得到1x2的200x200的S0_initial
接下来构造200x200的U,S0的两个分块对应求平均数得到
再对应U的每行计算U(j,:) = U(j,:)/sum(U(j,:))(归一化?)
sU = (U+U')/2; D = diag(sum(sU)); L = D - sU;
调用eig1
输入:
A =L
c =2
isMax =0
isSym =1
输出:
eigvec L最小的两个特征值对应的特征向量=F[200x2]
eigval L最小的两个特征值
eigval_full L升序的特征值=evs[200x1]
nargin=3所以令isSym = 1,从而有A = max(A,A’)(对应取A和A’的最大值)
计算A的特征向量矩阵v和特征值列向量d
再对d升序
计算i视图的X{i}的2范数得到ed[1x2x200x200]
迭代20轮,依次更新 S v , w , U , F , λ , S^v,w,U,F,\lambda, Sv,w,U,F,λ,
(更新过程看不明白啊,另外这不是深度学习啊,全靠数学公式智能优化,大概这种MATLAB写的都不用看了吧;另外虽然可能可以参考一下思想,但看不懂是大问题,麻了)
生成结果图(和论文上的一样)
[clusternum, y]=graphconncomp(sparse(sU)); y = y';
if clusternum ~= c
fprintf('Can not find the correct cluster number: %d\n', c)
end;
以原论文采用的3sources数据集为例,
实例169个,视图3个,最终聚类分簇6个,每个视图的每个实例特征维度不统一三千以上,但是其实还是节点级别的!!!