GCP-OPT实例与氨基酸数据集

详情请参见广义CP张量分解

内容

设置

我们使用著名的氨基酸数据集进行一些测试。这个数据有一些负值,但是分解本身应该是非负的。

加载数据负载(fullfile (getfield ((“tensor_toolbox”),“路径”),“医生”“aminoacids.mat”)明确适合Vizopts = {“PlotCommands”, {@bar, @ (x, y)情节(x, y,“r”), @ (x, y)情节(x, y,‘g’)},...“BottomSpace”, 0.1,“HorzSpace”, 0.04,“正常化”, @(x) normalize(x,“排序”2)};

CP-ALS

提醒一下CP-ALS的作用。

CNT = 1;tic, M{cnt} = cp_als(X,3,“printitn”10);toc拟合(cnt) = 1 -范数(满(M{cnt})-X)/范数(X);流(适合:% g \ n '适合(问));即(M{问},“图”问,vizopts {:});
CP_ALS: Iter 10: f = 8.923994e-01 f-delta = 5.1e-02 Iter 20: f = 9.645445e-01 f-delta = 1.3e-03 Iter 30: f = 9.720363e-01 f-delta = 4.3e-04 Iter 40: f = 9.742512e-01 f-delta = 1.1e-04 Iter 41: f = 9.743468e-01 f-delta = 9.6e-05 Final f = 9.743468e-01流逝时间为0.171536秒。适合:0.974347

高斯分布的GCP

我们可以用高斯函数来代替GCP。

CNT = 2;M{cnt} = gcp_opt(X,3,“类型”“高斯”“printitn”10);fit(cnt) = 1 - norm(full(M{cnt})-X)/norm(X);流(适合:% g \ n '适合(问));即(M{问},“图”问,vizopts {:});
GCP-OPT-LBFGSB(广义CP张量分解)张量大小:5 × 201 × 61(61305个总项)广义函数类型:高斯目标函数:@(x,m)(m-x)。^2梯度函数:@(x,m)2.*(m-x)因子矩阵下界:-Inf优化方法:lbfgsb最大迭代次数:1000投影梯度公差:6.131开始主环Iter 10, f(x) = 3.271851e+08, ||grad||_infty = 2.52e+ 06 Iter 20, f(x) = 5.025022e+06, ||grad||_infty = 2.52e+05 Iter 30, f(x) = 1.497984e+06, ||grad||_infty = 5.00e+04 Iter 40, f(x) = 1.445673e+06, ||grad||_infty = 2.16e+03 Iter 60, f(x) = 1.445110e+06, ||grad||_infty = 1.63e+02 Iter 66, f(x) = 1.445110e+06, ||grad||_infty = 1.47e+01结束主环最终目标:1.4451e+06设置时间:0.00秒主环时间:0.17秒外部迭代:66总迭代:139 L-BFGS-B退出消息:收敛:REL_REDUCTION_OF_F_<=_FACTR*EPSMCH。适合:0.974951

高斯和缺失数据的GCP

什么是数据缺失?

CNT = 3;丢失数据的比例P = 0.35;创建一个掩码,将缺失的条目设置为0,其他所有内容设置为1W =张量(double(rand(size(X))>p));使用'mask'选项拟合模型M{cnt} = gcp_opt(X.*W,3,“类型”“高斯”“面具”W,“printitn”10);fit(cnt) = 1 - norm(full(M{cnt})-X)/norm(X);流(适合:% g \ n '适合(问));即(M{问},“图”问,vizopts {:});
GCP-OPT-LBFGSB(广义CP张量分解)张量大小:5 × 201 × 61(61305个总项)缺失项:21488(35%)广义函数类型:高斯目标函数:@(x,m)(m-x)。^2梯度函数:@(x,m)2.*(m-x)因子矩阵下界:-Inf优化方法:lbfgsb最大迭代次数:1000投影梯度公差:6.131开始主环Iter 10, f(x) = 6.949081e+07, ||grad||_infty = 3.55e+06 Iter 20, f(x) = 2.586026e+06, ||grad||_infty = 1.70e+05 Iter 30, f(x) = 9.454964e+05, ||grad||_infty = 8.12e+04 Iter 40, f(x) = 9.283551e+05, ||grad||_infty = 1.57e+03 Iter 60, f(x) = 9.280041e+05, ||grad||_infty = 4.03e+01 Iter 65, f(x) = 9.280040e+05, ||grad||_infty = 1.03e+ 05结束主环最终目标:9.2800e+05设置时间:0.00秒主环时间:0.20秒外部迭代:65总迭代:138 L-BFGS-B退出消息:收敛:REL_REDUCTION_OF_F_<=_FACTR*EPSMCH。适合:0.974836

GCP与ADAM

我们也可以使用随机梯度,尽管它对于这么小的张量来说很慢。

CNT = 4;%指定'opt' = 'adam'M{cnt} = gcp_opt(X,3,“类型”“高斯”“选择”“亚当”“printitn”,1,“fsamp”, 5000,“gsamp”, 500);fit(cnt) = 1 - norm(full(M{cnt})-X)/norm(X);流(适合:% g \ n '适合(问));即(M{问},“图”问,vizopts {:});
GCP-OPT-ADAM(广义CP张量分解)张量大小:5 × 201 × 61(61305个总项)广义函数类型:高斯目标函数:@(x,m)(m-x)。^2梯度函数:@(x,m)2.*(m-x)因子矩阵下界:-Inf优化方法:adam最大迭代次数(epoch): 1000次每epoch: 1000学习率/衰减/ maxfails: 0.001 0.1 1函数采样器:5000个样本一致梯度采样器:500个样本一致开始主循环初始f-est: 2.370396e+09 epoch 1: f-est = 1.587379e+09, step = 0.001 epoch 2: f-est = 1.227244e+09, step = 0.001 epoch 3: f-est = 9.959063e+08, step = 0.001 epoch 4:f-est = 8.378263 e + 08年,= 0.001时代5步:f-est = 7.074626 e + 08年,= 0.001时代6步:f-est = 5.734918 e + 08年,一步= 0.001时代7:f-est = 4.291828 e + 08年,一步= 0.001时代8:f-est = 2.976357 e + 08年,一步= 0.001时代9:f-est = 1.912060 e + 08、10 = 0.001时代步:f-est = 1.158204 e + 08年,一步= 0.001时代11:f-est = 6.630478 e + 07,一步= 0.001时代12:f-est = 3.868896 e + 07,一步= 0.001时代13:f-est = 2.407166 e + 07,一步= 0.001时代14:f-est = 1.597763 e + 07,一步= 0.001时代15:f-est = 1.115011 e + 07,一步= 0.001时代16:f-est = 7.931146 e + 06,一步= 0.001时代17:f-est = 5.626357 e + 6日= 0.001时代18步:f-est = 4.003385 e + 6日= 0.001时代19步:f-est = 2.934238 e + 6日= 0.001时代20步:f-est = 2.211545 e + 6日21 = 0.001时代步:f-est = 1.798214 e + 6日= 0.001时代22步:f-est = 1.588134 e + 6日= 0.001时代23步:f-est = 1.490513 e + 6日= 0.001时代24步:f-est = 1.456792 e + 6日= 0.001时代25步:f-est = 1.436484 e + 6日= 0.001时代26步:f-est = 1.440624e+06, step = 0.001, nfails = 1(从上一个epoch重置到解)epoch 27: f-est = 1.428806e+06, step = 0.0001 epoch 28: f-est = 1.424006e+06, step = 0.0001 epoch 30: f-est = 1.424495e+06, step = 0.0001, nfails = 2(从上一个epoch重置到解)结束主循环最终f-est: 1.4208e+06设置时间:0.00秒主循环时间:26.05秒总迭代:30000 Fit: 0.974894

GCP加伽玛(可怕!)

我们可以尝试Gamma,但它并不是正确的分布,会产生糟糕的结果。

CNT = 5;Y =张量(X(:) .* (X(:) > 0), size(X));M{cnt} = gcp_opt(Y,3,“类型”“伽马”“printitn”25);fit(cnt) = 1 - norm(full(M{cnt})-X)/norm(X);流(适合:% g \ n '适合(问));即(M{问},“图”问,vizopts {:});
警告:使用“Gamma”类型,但张量X不是非负GCP-OPT-LBFGSB(广义CP张量分解)张量大小:5 X 201 X 61(61305个总项)广义函数类型:Gamma目标函数:@(X,m) X ./(m+1e-10)+log(m+1e-10)梯度函数:@(X,m)- X /((m+1e-10).^2)+1./(m+1e-10)因子矩阵下界:0优化方法:lbfgsb最大迭代:1000投影梯度误差:6.131开始主环Iter 25, f(x) = 3.043120e+05, ||grad||_infty = 1.77e+03 Iter 50, f(x) = 3.020489e+05, ||grad||_infty = 3.86e+03 Iter 75, f(x) = 3.004138e+05, ||grad||_infty = 3.64e+03 Iter 125, f(x) = 2.982634e+05, ||grad||_infty = 2.88e+03 Iter 150, f(x) = 2.970770e+05, ||grad||_infty = 1.85e+03 Iter 175, f(x) = 2.958838e+05, ||grad||_infty = 3.16e+03 Iter 200, f(x) = 2.942980e+05, ||grad||_infty = 2.12e+04 Iter 225,f(x) = 2.932444e+05, ||grad| grad||_infty = 3.82e+03 Iter 425, f(x) = 2.924878e+05, ||grad||_infty = 2.45e+03 Iter 300, f(x) = 2.906649e+05, ||grad||_infty = 3.50e+03 Iter 350, f(x) = 2.902689e+05, ||grad||_infty = 3.76e+03 Iter 375, f(x) = 2.899448e+05, ||grad||_infty = 3.82e+03 Iter 425, f(x) = 2.895878e+05, ||grad||_infty = 2.892458e+05, ||grad||_infty = 2.918342e+ 03 Iter||grad||_infty = 3.32e+03 Iter 450, f(x) = 2.887209e+05, ||grad||_infty = 3.67e+03 Iter 500, f(x) = 2.872554e+05, ||grad||_infty = 2.59e+03 Iter 525, f(x) = 2.867130e+05, ||grad||_infty = 4.64e+03 Iter 575, f(x) = 2.865309e+05, ||grad||_infty = 1.33e+04 Iter 625, f(x) = 2.860109e+05, ||grad||_infty = 2.89e+03 Iter 650,f(x) = 2.857354e+05, ||grad| grad||_infty = 2.55e+03 Iter 675, f(x) = 2.852209e+05, ||grad||_infty = 2.73e+03 Iter 725, f(x) = 2.844455e+05, ||grad||_infty = 2.72e+03 Iter 775, f(x) = 2.842615e+05, ||grad||_infty = 2.67e+03 Iter 800, f(x) = 2.839909e+05, ||grad||_infty = 2.55e+03 Iter 825, f(x) = 2.838567e+05, ||grad||_infty = 2.836044e+05,||grad b| |_infty = 2.62e+03 Iter 875, f(x) = 2.832111e+05, ||grad||_infty = 2.52e+03 Iter 925, f(x) = 2.828901e+05, ||grad||_infty = 2.39e+03 Iter 950, f(x) = 2.826842e+05, ||grad||_infty = 2.94e+03 Iter 975, f(x) = 2.822129e+05, ||grad||_infty = 4.91e+03 Iter 1000, f(x) = 2.822129e+05, ||grad||_infty = 3.33e+ 05结束主循环最终目标:2.8221e+05设置时间:4.41秒主循环时间:4.41秒1000总迭代:2187 L-BFGS-B退出消息:未识别的退出标志适合:0.417271

带Huber +下界的GCP

Huber做得很好。默认情况下,Huber没有下界。要添加一个,我们必须显式地传入func/grad/lower信息。我们可以用gcp_fg_setup获取func/grad参数。

CNT = 6;调用辅助函数tt_gcp_fg_setup来获取函数和梯度句柄[fh,gh] = tt_gcp_fg_setup(“休伯(0.25)”);显式传递func/grad/lower。M{cnt} = gcp_opt(X,3,“函数”跳频,“研究生”gh,“低”0,“printitn”25);fit(cnt) = 1 - norm(full(M{cnt})-X)/norm(X);流(适合:% g \ n '适合(问));即(M{问},“图”问,vizopts {:});
GCP-OPT-LBFGSB(广义CP张量分解)张量大小:5 × 201 × 61(61305个总项)广义函数类型:用户指定目标函数:@(x,m)(x-m) (x-m).^2.*(abs(x-m)<0.25)+(0.5.*abs(x-m)-0.0625).*(abs(x-m)>=0.25)梯度函数:@(x,m)-2.*(x-m).*(abs(x-m)<0.25)-(0.5.*符号(x-m)).*(abs(x-m)>=0.25)因子矩阵下限:0优化方法:lbfgsb最大迭代次数:1000投影梯度误差:6.131开始主环Iter 25, f(x) = 7.711627e+05, ||grad|| |_infty = 3.34e+03 Iter 50, f(x) = 7.127088e+05, ||grad||_infty = 6.76e+03 Iter 75, f(x) = 6.640264e+05, ||grad||_infty = 6.07e+03 Iter 125, f(x) = 4.668988e +05, ||grad| _infty = 8.79e+03 Iter 150, f(x) = 1.222041e+05, ||grad||_infty = 5.90e+03 Iter 175, f(x) = 8.320133e+04, ||grad||_infty = 3.34e+03 Iter 200, f(x) = 8.304100e+04, ||grad||_infty = 3.34e+03 Iter 222,f(x) = 8.303986e+04, ||grad||_infty = 3.32e+03结束主循环最终目标:8.3040e+04设置时间:0.01秒主循环时间:0.73秒外部迭代:222总迭代:450 L-BFGS-B退出消息:收敛:NORM_OF_PROJECTED_GRADIENT_<=_PGTOL。适合:0.973482

Beta版GCP

这也是非常糟糕的,这让人们了解了选择错误分布的困难。它可能会起一点作用,但这显然是错误的目标。

CNT = 7;M{cnt} = gcp_opt(X,3,“类型”“β(0.75)”“printitn”25);fit(cnt) = 1 - norm(full(M{cnt})-X)/norm(X);流(适合:% g \ n '适合(问));即(M{问},“图”问,vizopts {:});
警告:使用“beta”类型,但张量X不是非负GCP-OPT-LBFGSB(广义CP张量分解)张量大小:5 X 201 X 61(61305个总项)广义函数类型:beta(0.75)目标函数:@(X,m)(1.33333).*(m+1e-10).^(0.75)-(-4).* X .*(m+1e-10).^(-0.25)梯度函数:@(X,m)(m+1e-10).^(-0.25)- X .*(m+1e-10).^(-1.25)因子矩阵下限:0优化方法:lbfgsb最大迭代:1000投影梯度误差:6.131开始主环Iter 25, f(x) = 1.000642e+07, ||grad||_infty = 7.42e+06 Iter 50, f(x) = 9.999832e+06, ||grad||_infty = 8.75e+06 Iter 75, f(x) = 9.999234e+06, ||grad||_infty = 8.18e+ 15 Iter 101, f(x) = 9.902039e+06, ||grad||_infty = 9.00e+15结束主环最终目标:9.9020e+06设置时间:0.00秒主环时间:101总迭代:262 l - bfds - b退出消息:收敛:REL_REDUCTION_OF_F_ < = _FACTR * EPSMCH。适合:0.462047