复现GMC: Graph-based Multi-view Clustering

运行虚拟数据集结果

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)} minvixixj2sij+αsi2+wvUSv2+λ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 AB2=A2+B22ATB

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=115di(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, SvwUFλ
(更新过程看不明白啊,另外这不是深度学习啊,全靠数学公式智能优化,大概这种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个,每个视图的每个实例特征维度不统一三千以上,但是其实还是节点级别的!!!

你可能感兴趣的:(图融合,线性代数,算法,matlab)