new orly alter 2018, all rights reserved *) (* bioen 6900 003: data … · 2019. 11. 29. · (*...
TRANSCRIPT
(* © Orly Alter 2020, All Rights Reserved *)
(* BIOEN 6900-003: Data Science for Bioengineers *)
(* Tensor SVD of Synthetic Data *)
(* Initialize *)
Clear["Global`*"]
(* Compose Synthetic Data *)
v = Table[1., {b, 1, 30}];u = Table[1., {a, 1, 1000}];matrix0 = Outer[Times, u, v];matrix = matrix0;{rows, columns} = Dimensions[matrix]contrast = 1;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]], AspectRatio → GoldenRatio
]
{1000, 30}
v = Table[Sin[b / 15. * Pi], {b, 1, 30}];u = Table[Sin[a / 500. * Pi], {a, 1, 1000}];matrix1 = Outer[Times, u, v];matrix = matrix1;{rows, columns} = Dimensions[matrix]contrast = 1;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]], AspectRatio → GoldenRatio
]
{1000, 30}
Notebook_4.nb p. 2
v = Table[Cos[2 * b / 15. * Pi], {b, 1, 30}];u = Table[Cos[2 * a / 500. * Pi], {a, 1, 1000}];matrix2 = Outer[Times, u, v];matrix = matrix2;{rows, columns} = Dimensions[matrix]contrast = 1;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]], AspectRatio → GoldenRatio
]
{1000, 30}
Notebook_4.nb p. 3
(* Define Tensor Data *)
tensor0 = {matrix0,matrix0,matrix0};
tensor1 = {matrix1,matrix1,matrix1};
tensor2 = {matrix1,matrix2,matrix2};
tensor3 = {2 * matrix1,2 * matrix2,matrix1 + matrix2};
tensor4 = {matrix1 + matrix0,matrix2 + matrix0,matrix1 + matrix2};
tensor5 = {matrix0 + matrix1 + matrix2,matrix0 + matrix1 - matrix2,matrix0 - matrix1};
(* Choose Tensor Data *)
tensor = tensor1;{yarrays, zgenes, xarrays} = Dimensions[tensor]
{3, 1000, 30}
(* Compute the Tensor SVD *)
(* Compute the x-Mode SVD *)
xMode = Join[tensor[[1]],tensor[[2]],tensor[[3]]];
{rows, columns} = Dimensions[xMode]
{3000, 30}
Notebook_4.nb p. 4
matrix = xMode;contrast = 1;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]], AspectRatio → 3 * GoldenRatio
]
(* Compute the SVD *)
{ux, sigma, v} = SingularValueDecomposition[xMode, columns];vxt = Transpose[v];Dimensions[ux]Dimensions[sigma]Dimensions[vxt]
{3000, 30}
{30, 30}
{30, 30}
Notebook_4.nb p. 5
(* Visualize the SVD *)
rank = columns - Count[Diagonal[sigma], 0.]TableForm[sigma[[1 ;; rank, 1 ;; rank]]]matrix = sigma;{rows, columns} = Dimensions[matrix];contrast = 0.01;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]]
]
1
150.
Notebook_4.nb p. 6
matrix = vxt;{rows, columns} = Dimensions[matrix];contrast = 5;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]]
]
Notebook_4.nb p. 7
If[sigma[[1, 1]] ≠ 0, ListPlot[vxt[[1]]]]If[sigma[[2, 2]] ≠ 0, ListPlot[vxt[[2]]]]If[sigma[[3, 3]] ≠ 0, ListPlot[vxt[[3]]]]v = Table[Sin[b / 15. * Pi], {b, 1, 30}];vxt[[1]] ⩵ v / Norm[v]vxt[[1]] ⩵ -v / Norm[v]
5 10 15 20 25 30
-0.2
-0.1
0.1
0.2
False
True
Notebook_4.nb p. 8
matrix = ux;{rows, columns} = Dimensions[matrix]contrast = 100;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]], AspectRatio → 3 * GoldenRatio
]
{3000, 30}
Notebook_4.nb p. 9
u = Table[Sin[a / 500. * Pi], {a, 1, 1000}];u = Flatten[Join[{u}, {u}, {u}]];u = u / Norm[u];Transpose[ux][[1]] ⩵ uTranspose[ux][[1]] ⩵ -uMax[Transpose[ux][[1]] - u]Min[Transpose[ux][[1]] - u]Max[Transpose[ux][[1]] + u]Min[Transpose[ux][[1]] + u]Max[Chop[Transpose[ux][[1]] + u]]Min[Chop[Transpose[ux][[1]] + u]]
False
False
0.0516398
-0.0516398
6.93889 × 10-18
-3.11708 × 10-17
0
0
(* Compute the y-Mode SVD *)
yMode = Transpose[Join[{Flatten[tensor[[1]]]},{Flatten[tensor[[2]]]},{Flatten[tensor[[3]]]}]];
{rows, columns} = Dimensions[yMode]
{30 000, 3}
Notebook_4.nb p. 10
matrix = yMode;contrast = 10;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]], AspectRatio → 3 * GoldenRatio
]
(* Compute the SVD *)
{uy, sigma, v} = SingularValueDecomposition[yMode, columns];vyt = Transpose[v];Dimensions[uy]Dimensions[sigma]Dimensions[vyt]
{30 000, 3}
{3, 3}
{3, 3}
Notebook_4.nb p. 11
(* Visualize the SVD *)
TableForm[sigma]matrix = sigma;{rows, columns} = Dimensions[matrix];contrast = 0.01;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]]
]
150. 0. 0.0. 0. 0.0. 0. 0.
Notebook_4.nb p. 12
matrix = vyt;{rows, columns} = Dimensions[matrix];contrast = 1;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]]
]
If[sigma[[1, 1]] ≠ 0, ListPlot[vyt[[1]]]]If[sigma[[2, 2]] ≠ 0, ListPlot[vyt[[2]]]]If[sigma[[3, 3]] ≠ 0, ListPlot[vyt[[3]]]]vyt[[1]]vyt[[1]] ⩵ N[{1, 1, 1} / Norm[{1, 1, 1}]]vyt[[1]] ⩵ -N[{1, 1, 1} / Norm[{1, 1, 1}]]
0.5 1.0 1.5 2.0 2.5 3.0
-1.2
-1.0
-0.8
-0.6
-0.4
-0.2
{-0.57735, -0.57735, -0.57735}
False
True
Notebook_4.nb p. 13
matrix = uy;{rows, columns} = Dimensions[matrix]contrast = 1000;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]], AspectRatio → 3 * GoldenRatio
]
{30 000, 3}
Notebook_4.nb p. 14
u = Flatten[matrix1];u = u / Norm[u];Transpose[uy][[1]] ⩵ uTranspose[uy][[1]] ⩵ -uMax[Transpose[uy][[1]] - u]Min[u - Transpose[uy][[1]] - u]Max[Transpose[uy][[1]] + u]Min[Transpose[uy][[1]] + u]Max[Chop[Transpose[uy][[1]] + u]]Min[Chop[Transpose[uy][[1]] + u]]
False
False
0.0229675
-0.0114837
1.24802 × 10-17
-1.73472 × 10-18
0
0
(* Compute the z-Mode SVD *)
zMode = Transpose[Join[Transpose[tensor[[1]]],Transpose[tensor[[2]]],Transpose[tensor[[3]]]]];
{rows, columns} = Dimensions[zMode]
{1000, 90}
Notebook_4.nb p. 15
matrix = zMode;contrast = 1;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]], AspectRatio → GoldenRatio
]
(* Compute the SVD *)
{u, sigma, vz} = SingularValueDecomposition[zMode, columns];uz = u;Dimensions[uz]Dimensions[sigma]Dimensions[vz]
{1000, 90}
{90, 90}
{90, 90}
Notebook_4.nb p. 16
(* Visualize the SVD *)
rank = columns - Count[Diagonal[sigma], 0.]TableForm[sigma[[1 ;; rank, 1 ;; rank]]]matrix = sigma;{rows, columns} = Dimensions[matrix];contrast = 0.1;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]]
]
1
150.
Notebook_4.nb p. 17
matrix = uz;{rows, columns} = Dimensions[matrix];contrast = 100;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]], AspectRatio → GoldenRatio
]
Notebook_4.nb p. 18
If[sigma[[1, 1]] ≠ 0, ListPlot[Transpose[uz][[1]]]]If[sigma[[2, 2]] ≠ 0, ListPlot[Transpose[uz][[2]]]]If[sigma[[3, 3]] ≠ 0, ListPlot[Transpose[uz][[3]]]]
200 400 600 800 1000
-0.04
-0.02
0.02
0.04
matrix = Transpose[vz];{rows, columns} = Dimensions[matrix];contrast = 10;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]]
]
Notebook_4.nb p. 19
If[sigma[[1, 1]] ≠ 0, ListPlot[Transpose[vz][[1]]]]If[sigma[[2, 2]] ≠ 0, ListPlot[Transpose[vz][[2]]]]If[sigma[[3, 3]] ≠ 0, ListPlot[Transpose[vz][[3]]]]
20 40 60 80
-0.15
-0.10
-0.05
0.05
0.10
0.15
(* Compute the Core Tensor *)
(* Compute the Core Tensor via z-Mode Unfolding *)
? KroneckerProduct
Symbol
KroneckerProduct[m1, m2, …] constructs the Kronecker product of the arrays mi.
vzt = KroneckerProduct[vyt, vxt];Dimensions[vzt]
{90, 90}
Notebook_4.nb p. 20
matrix = vzt;contrast = 5;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]]
]
zMode = Transpose[Join[Transpose[tensor[[1]]],Transpose[tensor[[2]]],Transpose[tensor[[3]]]]];
zCore = Dot[Transpose[uz], zMode, Transpose[vzt]];Dimensions[zCore]
{90, 90}
Notebook_4.nb p. 21
matrix = zCore;contrast = 500;raster = Table[
rgbRaster = N[contrast * matrix[[a, b]]]; If[rgbRaster > 0, {rgbRaster, 0, 0}, {0, -rgbRaster, 0}],{a, 1, rows}, {b, 1, columns}];
g = Show[Graphics[Raster[Reverse[raster]]]
]
core = {zCore[[All, 1 ;; 30]],zCore[[All, 31 ;; 60]],zCore[[All, 61 ;; 90]]};
Dimensions[core]
{3, 90, 30}
? Sort
Symbol
Sort[list] sorts the elements of list into canonical order.
Sort[list, p] sorts using the ordering function p.
list = Sort[Flatten[Chop[Abs[core]]],Greater][[1 ;; Position[Sort[Flatten[Chop[Abs[core]]], Greater], 0][[1, 1]]]]
Table[Position[core, list[[a]]], {a, 1, Dimensions[list][[1]]}]Table[Position[core, -list[[a]]], {a, 1, Dimensions[list][[1]]}]
{150., 0}
{{}, {}}
{{{1, 1, 1}}, {}}
Notebook_4.nb p. 22
(* Test the Tensor SVD *)
Max[Chop[Abs[Dot[Transpose[Join[{Flatten[Dot[uz, core[[1]], vxt]]},{Flatten[Dot[uz, core[[2]], vxt]]},{Flatten[Dot[uz, core[[3]], vxt]]}]], vyt] - yMode]]]
0
Notebook_4.nb p. 23