随机交替最小二乘对CP分解

这个函数cp_arls计算估计的最佳rank-R CP的张量模型X使用交替随机最小二乘算法。输入X必须(密度)张量。CP模型的输出ktensor。CP-ARLS方法中描述以下参考:

内容

建立一个样本的问题

我们设立了一个特别困难,有些大样本问题,具有较高的共线性(0.9)和1%的噪音。这是一个例子,随机方法通常会比标准的方法。

深圳= (200 300 400);R = 5;ns = 0.01;科尔= 0.9;信息= create_problem (“大小”、深圳、“Num_Factors”R“噪音”ns,“Factor_Generator”@ (m, n) matrandcong (m, n,科尔),“Lambda_Generator”,@ones);%提取数据和解决方案X = info.Data;M_true = info.Soln;

运行CP-ARLS方法

运行使用CP-ALS方法本质上是一样的,饲料所需的数据矩阵和等级。注意,表单的迭代是NxN时代x数量的每个时代的迭代数。默认每个时代的迭代数量是50。在每个时代的结束,我们检查收敛性判别准则。因为这是一个随机的方法,我们没有实现严格的目标函数下降。相反,我们看时代的数量没有改善(newi)和退出当这个十字架预定义的公差(“newitol”),默认为5。重要的是要注意报道的适应值近似,所以这就是为什么用“f ~”而不仅仅是“f”。

抽搐(M1, ~,着干活)= cp_arls (X, R);time1 = toc;scr1 =分数(M1, M_true);流(' \ n * * *结果CP-ARLS(混合)* * * \ n”);流(的时间(秒):% .3f \ n 'time1)流(的分数(max = 1): % .3f \ n ',scr1);
CP-ARLS(混合):Iter 10×50: f ~ = 9.895866 e-01 newi = 0 Iter 20×50: f ~ = 9.895783 e-01 newi = 4 Iter 21×50: f ~ = 9.895769 e-01 newi = 5 * * *结果CP-ARLS(混合)* * *时间(秒):8.923分(max = 1): 0.989

加快速度,跳过初始混合

默认行为是混合数据在每个模式下使用FFT和随机+ / 1矩阵对角线。这可能会增加大量的预处理时间,尽管它有助于确保收敛的方法。通常,如与随机生成的数据,混合是不必要的。

抽搐(M2, ~, out2) = cp_arls (X, R,“混合”、假);time2 = toc;scr2 =分数(M2, M_true);流(' \ n * * *结果CP-ARLS(没有混合)* * * \ n”);流(的时间(秒):% .3f \ n 'time2)流(的分数(max = 1): % .3f \ n ',scr2);
CP_ARLS(没有混合):Iter 10×50: f ~ = 9.889934 e-01 newi = 1 Iter 20×50: f ~ = 9.891646 e-01 newi = 0 Iter 30×50: f ~ = 9.890769 e-01 newi = 5 * * *结果CP-ARLS(没有混合)* * *时间(秒):8.029分(max = 1): 0.976

与CP-ALS

CP-ALS可能有点快,特别是因为这是一个相对较小的问题,但它通常不会实现的好答案的评分。

抽搐;[M3, ~, out3] = cp_als (X, R,“maxiters”,500,“printitn”10);历史问题= toc;scr3 =分数(M3, M_true);流(' \ n CP-ALS * * * * * *结果\ n”);流(的时间(秒):% .3f \ n '历史问题)流(的分数(max = 1): % .3f \ n ',scr3);
CP_ALS: Iter 10: f = 9.726647 e-01 fδ= 4.8 e-04 Iter 20: f = 9.756937 e-01 fδ= 2.6 e-04 Iter 30: f = 9.868227 e-01 fδ= 2.7 e 03 Iter 33: f = 9.884157 e-01 fδ= 5.8 e-05最终f = 9.884157 e-01 CP-ALS * * * * * *结果时间(秒):3.505分(max = 1): 0.709

近似符合做情况如何?

可以检查适合计算的准确性通过代码计算出真正适合和最终的解决方案,由“truefit”选项启用。

[M4, ~, out4] = cp_arls (X, R,“truefit”,真正的);
CP-ARLS(混合):Iter 10×50: f ~ = 9.897749 e-01 newi = 2 Iter 17×50: f ~ = 9.898412 e-01 newi = 5最终适合= 9.898393 e-01最终估计适合= 9.898489 e-01

不同时代的大小

有可能不同,每个时代的迭代数。更少的迭代意味着更多时间检查收敛,也可能更难检测作为一个单一的迭代可以有一些波动,我们实际上是寻找总体趋势。相比之下,意味着太多的迭代方法不会意识到当聚集,可能花太多的时间计算。

抽搐M = cp_arls (X, R,“时代”,1“newitol”,20);toc流(“分数:% .4f \ n”分数(M, M_true));
CP-ARLS(混合):Iter 10 x1: f ~ = 9.701522 e-01 newi 20 x1 = 1 Iter: f ~ = 9.725415 e-01 newi = 5 Iter 30 x1: f ~ = 9.738450 e-01 newi = 0 Iter 40 x1: f ~ = 9.745092 e-01 newi 50 x1 = 0 Iter: f ~ = 9.770124 e-01 newi = 0 Iter 60 x1: f ~ = 9.877161 e-01 newi = 0 Iter 70 x1: f ~ = 9.881069 e-01 newi = 0 Iter 80 x1: f ~ = 9.882726 e-01 newi = 2 Iter 90 x1: f ~ = 9.885071 e-01 newi = 1 100年Iter x1: f ~ = 9.886444 e-01 newi = 0 Iter 110 x1: f ~ = 9.886701 e-01 newi = 8 Iter 120 x1: f ~ = 9.888270 e-01 newi = 1 130年Iter x1: f ~ = 9.888974 e-01 newi = 1 140年Iter x1: f ~ = 9.891171 e-01 newi = 0 Iter 150 x1: f ~ = 9.891283 e-01 newi = 0 Iter 160 x1: f ~ = 9.890805 e-01 newi = 1 170年Iter x1: f ~ = 9.892718 e-01 newi = 0 Iter 180 x1: f ~ = 9.891860 e-01 newi = 8 Iter 190 x1: f ~ = 9.893004 e-01 newi = 6 Iter 200 x1: f ~ = 9.894006 e-01 newi = 0 Iter 210 x1: f ~ = 9.893971 e-01 newi = 1 220年Iter x1: f ~ = 9.894173 e-01 newi = 0 Iter 230 x1: f ~ = 9.894356 e-01 newi = 2 Iter 240 x1: f ~ = 9.894381 e-01 newi = 3 Iter 250 x1: f ~ = 9.894686 e-01 newi = 6 Iter 260 x1: f ~ = 9.894537 e-01 newi = 4 270年Iter x1: f ~ = 9.894538 e-01 newi = 1 280年Iter x1: f ~ = 9.895148 e-01 newi = 1 290年Iter x1: f ~ = 9.895310 e-01 newi = 7 Iter 300 x1: f ~ = 9.895601 e-01 newi = 17 Iter 303 x1: f ~ = 9.895373 e-01 newi = 20运行时间是3.350615秒。得分:0.9171
抽搐M = cp_arls (X, R,“时代”,200,“newitol”3,“printitn”2);toc流(“分数:% .4f \ n”分数(M, M_true));
CP-ARLS(混合):Iter 2 x200型:f ~ = 9.896707 e-01 newi = 0 Iter 4 x200型:f ~ = 9.896960 e-01 newi = 1 Iter 6 x200型:f ~ = 9.896960 e-01 newi = 3运行时间是10.381222秒。得分:0.9720

建立另一个样品的问题

我们设置的另一个问题10%的噪音,但是没有共线性。

深圳= (200 300 400);R = 5;ns = 0.10;信息= create_problem (“大小”、深圳、“Num_Factors”R“噪音”ns,“Factor_Generator”@rand,“Lambda_Generator”,@ones);%提取数据和解决方案X = info.Data;M_true = info.Soln;

终止一次获得了理想的适合

如果我们知道噪音水平是10%,我们预期的0.90。所以,我们可以设置一个阈值接近,并终止尽快实现这一精度。自检测融合是困难的对于随机方法,这可能导致速度ups。然而,如果配合不够高,因而精度会受到影响。

M = cp_arls (X, R,“newitol”,20岁,“fitthresh”,0.895,“truefit”,真正的);流(“分数:% .4f \ n”分数(M, M_true));
CP-ARLS(混合):Iter 1×50: f ~ = 8.966351 e-01 newi = 0 = 8.972839 e-01最后估计配合最终= 8.966351 e-01得分:0.9566

改变函数评估样本的数量

评价函数近似和基于抽样“nsampfit”指定的条目的数量。如果这个太小了,样品会不够准确。如果太大,计算需要太长时间。默认值是2 ^ 14美元,一般来说应该足够了。有时可能使用更小的值。同一采样条目用于每一个收敛检查- - -我们不重新取样检查其他条目。

M = cp_arls (X, R,“truefit”,真的,“nsampfit”,100);流(“分数:% .4f \ n”分数(M, M_true));
CP-ARLS(混合):Iter 7×50: f ~ = 8.890117 e-01 newi = 5最终适合= 8.935068 e-01最终估计适合= 8.948104 e-01得分:0.9809

改变采样的行数最小二乘解

默认的最小二乘法解决采样的行数是“装天花板(10 * R * log2®)”。这似乎很好地工作在大多数测试,但这可以不同的更高或更低。为R = 5,这意味着我们每解决样本117行。行是不同的对于每一个最小二乘问题。让我们看看会发生什么,如果我们减少到10。

M = cp_arls (X, R,“truefit”,真的,“nsamplsq”10);流(“分数:% .4f \ n”分数(M, M_true));
CP-ARLS(混合):Iter 10×50: f ~ = 7.180423 e-01 newi = 4 Iter 11×50: f ~ = 7.033075 e-01 newi = 5最终适合= 7.553195 e-01最终估计适合= 7.554767 e-01得分:0.1939

如果我们使用25 ?

M = cp_arls (X, R,“truefit”,真的,“nsamplsq”25);流(“分数:% .4f \ n”分数(M, M_true));
CP-ARLS(混合):Iter 8×50: f ~ = 8.812275 e-01 newi = 5最终适合= 8.816266 e-01最终估计适合= 8.813898 e-01得分:0.9236