new orly alter 2018, all rights reserved *) (* bioen 6900 003: data … · 2019. 11. 29. · (*...

23
(* © 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}

Upload: others

Post on 10-Oct-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

(* © 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}

Page 2: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 3: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 4: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

(* 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

Page 5: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 6: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

(* 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

Page 7: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 8: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 9: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 10: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 11: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 12: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

(* 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

Page 13: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 14: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 15: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 16: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 17: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

(* 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

Page 18: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 19: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 20: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 21: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 22: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

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

Page 23: New Orly Alter 2018, All Rights Reserved *) (* BIOEN 6900 003: Data … · 2019. 11. 29. · (* Define Tensor Data *) tensor1 = {matrix1, matrix1, matrix1}; tensor2 = {matrix1, matrix2,

(* 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