<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>Equars People  - Non-negative Matrix Factorization Changes</title>
  <id>tag:people.equars.com,2008:/2008/7/8/non-negative-matrix-factorization/changes</id>
  <generator version="0.8.0" uri="http://mephistoblog.com">Mephisto Drax</generator>
  <link href="http://people.equars.com/2008/7/8/non-negative-matrix-factorization/changes.xml" rel="self" type="application/atom+xml"/>
  <link href="/2008/7/8/non-negative-matrix-factorization" rel="alternate" type="text/html"/>
  <updated>2008-07-08T15:00:25Z</updated>
  <entry xml:base="http://people.equars.com/">
    <author>
      <name>marco</name>
    </author>
    <id>tag:people.equars.com,2008-07-08:195:1</id>
    <updated>2008-07-08T15:00:25Z</updated>
    <link href="http://people.equars.com/2008/7/19/non-negative-matrix-factorization" rel="alternate" type="text/html"/>
    <title>Non-negative Matrix Factorization</title>
<content type="html">&lt;p&gt;Here it is a small ruby script that calculate the &lt;a href=&quot;http://en.wikipedia.org/wiki/NMF&quot;&gt;non-negative matrix factorization&lt;/a&gt; of a given matrix.
I tried to mantain the notation consistent with the one used in the paper of &lt;a href=&quot;http://hebb.mit.edu/people/seung/papers/nmfconverge.pdf&quot;&gt;Lee and Seung&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The script requires the &lt;a href=&quot;http://rb-gsl.rubyforge.org/&quot;&gt;GSL&lt;/a&gt; library.&lt;/p&gt;

&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;35&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;42&lt;tt&gt;
&lt;/tt&gt;43&lt;tt&gt;
&lt;/tt&gt;44&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;45&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;46&lt;tt&gt;
&lt;/tt&gt;47&lt;tt&gt;
&lt;/tt&gt;48&lt;tt&gt;
&lt;/tt&gt;49&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;50&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;51&lt;tt&gt;
&lt;/tt&gt;52&lt;tt&gt;
&lt;/tt&gt;53&lt;tt&gt;
&lt;/tt&gt;54&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;55&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;56&lt;tt&gt;
&lt;/tt&gt;57&lt;tt&gt;
&lt;/tt&gt;58&lt;tt&gt;
&lt;/tt&gt;59&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;60&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;61&lt;tt&gt;
&lt;/tt&gt;62&lt;tt&gt;
&lt;/tt&gt;63&lt;tt&gt;
&lt;/tt&gt;64&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;65&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;66&lt;tt&gt;
&lt;/tt&gt;67&lt;tt&gt;
&lt;/tt&gt;68&lt;tt&gt;
&lt;/tt&gt;69&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;70&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;71&lt;tt&gt;
&lt;/tt&gt;72&lt;tt&gt;
&lt;/tt&gt;73&lt;tt&gt;
&lt;/tt&gt;74&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;75&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;76&lt;tt&gt;
&lt;/tt&gt;77&lt;tt&gt;
&lt;/tt&gt;78&lt;tt&gt;
&lt;/tt&gt;79&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;80&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;81&lt;tt&gt;
&lt;/tt&gt;82&lt;tt&gt;
&lt;/tt&gt;83&lt;tt&gt;
&lt;/tt&gt;84&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;85&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;86&lt;tt&gt;
&lt;/tt&gt;87&lt;tt&gt;
&lt;/tt&gt;88&lt;tt&gt;
&lt;/tt&gt;89&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;90&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;91&lt;tt&gt;
&lt;/tt&gt;92&lt;tt&gt;
&lt;/tt&gt;93&lt;tt&gt;
&lt;/tt&gt;94&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;95&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;96&lt;tt&gt;
&lt;/tt&gt;97&lt;tt&gt;
&lt;/tt&gt;98&lt;tt&gt;
&lt;/tt&gt;99&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;100&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;101&lt;tt&gt;
&lt;/tt&gt;102&lt;tt&gt;
&lt;/tt&gt;103&lt;tt&gt;
&lt;/tt&gt;104&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;105&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;106&lt;tt&gt;
&lt;/tt&gt;107&lt;tt&gt;
&lt;/tt&gt;108&lt;tt&gt;
&lt;/tt&gt;109&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;110&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;111&lt;tt&gt;
&lt;/tt&gt;112&lt;tt&gt;
&lt;/tt&gt;113&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;#!/usr/bin/ruby&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;require(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;gsl&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;nmf&lt;/span&gt;(v, col, thresh)&lt;tt&gt;
&lt;/tt&gt;   r, c = v.shape&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# w * h = v&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   w = &lt;span class=&quot;co&quot;&gt;GSL&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Matrix&lt;/span&gt;.alloc(r, col)&lt;tt&gt;
&lt;/tt&gt;   h = &lt;span class=&quot;co&quot;&gt;GSL&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Matrix&lt;/span&gt;.alloc(col, c)&lt;tt&gt;
&lt;/tt&gt;   initrand(w)&lt;tt&gt;
&lt;/tt&gt;   initrand(h)&lt;tt&gt;
&lt;/tt&gt;   dist = thresh&lt;tt&gt;
&lt;/tt&gt;   iter = &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;r&quot;&gt;while&lt;/span&gt;(dist &amp;gt;= thresh)&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;c&quot;&gt;# multiplicative update rule&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      dist, w, h = update(v, w, h)&lt;tt&gt;
&lt;/tt&gt;      puts dist &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; iter%&lt;span class=&quot;i&quot;&gt;50&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      iter += &lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;   &lt;tt&gt;
&lt;/tt&gt;   puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Ended in &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;dl&quot;&gt;#{&lt;/span&gt;iter&lt;span class=&quot;dl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; iteration(s) with dist=&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;dl&quot;&gt;#{&lt;/span&gt;dist&lt;span class=&quot;dl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;r&quot;&gt;return&lt;/span&gt; w, h&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;initrand&lt;/span&gt;(m)&lt;tt&gt;
&lt;/tt&gt;   r, c = m.shape&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;.upto(r&lt;span class=&quot;i&quot;&gt;-1&lt;/span&gt;) { |i|&lt;tt&gt;
&lt;/tt&gt;       &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;.upto(c&lt;span class=&quot;i&quot;&gt;-1&lt;/span&gt;) { |j|&lt;tt&gt;
&lt;/tt&gt;          m[i,j] = rand()&lt;tt&gt;
&lt;/tt&gt;       }&lt;tt&gt;
&lt;/tt&gt;   }&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;update&lt;/span&gt;(v, w, h)&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# choose an update rule&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# v, w, h are GSL::Matrix objects&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   dist, w, h = update_eu(v, w, h)&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;r&quot;&gt;return&lt;/span&gt; dist, w, h&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;update_eu&lt;/span&gt;(v, w, h)&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# multiplicative update rule&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# for minimizing euclidean distance&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# v, w, h are GSL::Matrix objects&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   dist = dist_eu(v, w*h)&lt;tt&gt;
&lt;/tt&gt;   wt = w.transpose&lt;tt&gt;
&lt;/tt&gt;   ht =  h.transpose&lt;tt&gt;
&lt;/tt&gt;   h = h.mul_elements(wt * v).div_elements(wt * w * h)&lt;tt&gt;
&lt;/tt&gt;   w = w.mul_elements(v * ht).div_elements(w * h * ht)&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;r&quot;&gt;return&lt;/span&gt; dist, w, h&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;update_kl&lt;/span&gt;(v, w, h)&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# multiplicative update rule&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# for minimizing divergence&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# v, w, h are GSL::Matrix objects&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   dist = dist_kl(v, w*h)&lt;tt&gt;
&lt;/tt&gt;   wt = w.transpose&lt;tt&gt;
&lt;/tt&gt;   ht =  h.transpose&lt;tt&gt;
&lt;/tt&gt;   num = v.div_elements(w * h)&lt;tt&gt;
&lt;/tt&gt;   rh, ch = h.shape&lt;tt&gt;
&lt;/tt&gt;   rw, cw = w.shape&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;.upto(rh&lt;span class=&quot;i&quot;&gt;-1&lt;/span&gt;) { |i|&lt;tt&gt;
&lt;/tt&gt;       &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;.upto(ch&lt;span class=&quot;i&quot;&gt;-1&lt;/span&gt;) { |j|&lt;tt&gt;
&lt;/tt&gt;          h[i, j] *= w.col(i).mul(num.col(j)).sum / w.col(i).sum&lt;tt&gt;
&lt;/tt&gt;       }&lt;tt&gt;
&lt;/tt&gt;   }&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;.upto(rw&lt;span class=&quot;i&quot;&gt;-1&lt;/span&gt;) { |i|&lt;tt&gt;
&lt;/tt&gt;       &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;.upto(cw&lt;span class=&quot;i&quot;&gt;-1&lt;/span&gt;) { |j|&lt;tt&gt;
&lt;/tt&gt;          w[i, j] *= h.row(j).mul(num.row(i)).sum / h.row(j).sum&lt;tt&gt;
&lt;/tt&gt;       }&lt;tt&gt;
&lt;/tt&gt;   }&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;r&quot;&gt;return&lt;/span&gt; dist, w, h&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# Euclidean distance&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;dist_eu&lt;/span&gt;(a, b)&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# a,b are GSL::Matrix objects&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   dist = &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   (a-b).collect { |d| dist += d * d }&lt;tt&gt;
&lt;/tt&gt;   dist&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# Kullback-Leibler divergence&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;dist_kl&lt;/span&gt;(a, b)&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# a, b are GSL::Matrix objects&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   dist = &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   r, c = a.shape&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;.upto(r&lt;span class=&quot;i&quot;&gt;-1&lt;/span&gt;) { |i|&lt;tt&gt;
&lt;/tt&gt;       &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;.upto(c&lt;span class=&quot;i&quot;&gt;-1&lt;/span&gt;) { |j|&lt;tt&gt;
&lt;/tt&gt;          &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; (b[i,j] == &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;             dist = &lt;span class=&quot;i&quot;&gt;2&lt;/span&gt;**&lt;span class=&quot;i&quot;&gt;32&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;             &lt;span class=&quot;r&quot;&gt;break&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;          &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;          dist += a[i,j] * &lt;span class=&quot;co&quot;&gt;Math&lt;/span&gt;::log(a[i,j]/b[i,j]) - a[i,j] + b[i,j]&lt;tt&gt;
&lt;/tt&gt;       }&lt;tt&gt;
&lt;/tt&gt;   }&lt;tt&gt;
&lt;/tt&gt;   dist&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;v = &lt;span class=&quot;co&quot;&gt;GSL&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Matrix&lt;/span&gt;[[&lt;span class=&quot;i&quot;&gt;29&lt;/span&gt;, &lt;span class=&quot;i&quot;&gt;31&lt;/span&gt;], [&lt;span class=&quot;i&quot;&gt;37&lt;/span&gt;, &lt;span class=&quot;i&quot;&gt;41&lt;/span&gt;]]&lt;tt&gt;
&lt;/tt&gt;w, h = nmf(v, &lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;, &lt;span class=&quot;i&quot;&gt;10&lt;/span&gt;**(&lt;span class=&quot;i&quot;&gt;-10&lt;/span&gt;))&lt;tt&gt;
&lt;/tt&gt;puts w&lt;tt&gt;
&lt;/tt&gt;puts h&lt;tt&gt;
&lt;/tt&gt;puts w*h&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;</content>  </entry>
</feed>
