import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Nonnegative%20Matrix%20Factorization%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20warnings%0A%0A%20%20%20%20warnings.filterwarnings(%22ignore%22)%0A%0A%20%20%20%20import%20cvxpy%20as%20cp%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20from%20dbcp%20import%20BiconvexProblem%0A%0A%20%20%20%20np.random.seed(10015)%0A%20%20%20%20return%20BiconvexProblem%2C%20cp%2C%20mo%2C%20np%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Introduction%0A%0A%20%20%20%20Suppose%20we%20are%20given%20a%20matrix%20%24A%20%5Cin%20%5Cmathbf%7BR%7D%5E%7Bm%20%5Ctimes%20n%7D%24%2C%20and%20are%20interested%20in%20solving%20the%20problem%3A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cbegin%7Barray%7D%7Bll%7D%0A%20%20%20%20%20%20%20%20%5Ctext%7Bminimize%7D%20%26%20%7B%5C%7CXY%20-%20A%5C%7C%7D_F%5E2%20%5C%5C%0A%20%20%20%20%20%20%20%20%5Ctext%7Bsubject%20to%7D%20%26%20X_%7Bij%7D%20%5Cgeq%200%2C%5Cquad%20i%20%3D%201%2C%20%5Cldots%2C%20m%2C%5Cquad%20j%20%3D%201%2C%20%5Cldots%2C%20k%20%5C%5C%0A%20%20%20%20%20%20%20%20%26%20Y_%7Bij%7D%20%5Cgeq%200%2C%5Cquad%20i%20%3D%201%2C%20%5Cldots%2C%20k%2C%5Cquad%20j%20%3D%201%2C%20%5Cldots%2C%20n%2C%0A%20%20%20%20%5Cend%7Barray%7D%0A%20%20%20%20%24%24%0A%20%20%20%20where%20%24X%20%5Cin%20%5Cmathbf%7BR%7D%5E%7Bm%20%5Ctimes%20k%7D%24%20and%20%24Y%20%5Cin%20%5Cmathbf%7BR%7D%5E%7Bk%20%5Ctimes%20n%7D%24%20are%20the%20problem%20variables.%0A%0A%20%20%20%20This%20problem%20is%20biconvex%20in%20the%20variables%20%24X%24%20and%20%24Y%24.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Generate%20problem%20data%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20m%20%3D%205%0A%20%20%20%20n%20%3D%2010%0A%20%20%20%20k%20%3D%205%0A%20%20%20%20A%20%3D%20np.random.rand(m%2C%20k).dot(np.random.rand(k%2C%20n))%0A%20%20%20%20return%20A%2C%20k%2C%20m%2C%20n%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Specify%20and%20solve%20the%20biconvex%20problem%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(A%2C%20BiconvexProblem%2C%20cp%2C%20k%2C%20m%2C%20n)%3A%0A%20%20%20%20X%20%3D%20cp.Variable((m%2C%20k)%2C%20nonneg%3DTrue)%0A%20%20%20%20Y%20%3D%20cp.Variable((k%2C%20n)%2C%20nonneg%3DTrue)%0A%0A%20%20%20%20obj%20%3D%20cp.Minimize(cp.sum_squares(X%20%40%20Y%20-%20A))%0A%20%20%20%20prob%20%3D%20BiconvexProblem(obj%2C%20%5BX%5D%2C%20%5BY%5D)%0A%20%20%20%20prob.solve()%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
a4b03a7117fd897655cf95238456ed38