<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: ruby code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 03 Oct 2008 21:50:29 GMT</pubDate>
    <description>DZone Snippets: ruby code</description>
    <item>
      <title>Variance, Mean, Normalizing Functions, Euclidean and other Distances</title>
      <link>http://snippets.dzone.com/posts/show/3488</link>
      <description>Here &lt;b&gt;sum&lt;/b&gt;, &lt;b&gt;mean&lt;/b&gt; and &lt;b&gt;variance&lt;/b&gt; were inspired by the Peter's inline sum code:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Array; def sum; inject( nil ) { |sum,x| sum ? sum+x : x }; end; end&lt;br /&gt;class Array; def mean; self.sum/self.size.to_f; end; end&lt;br /&gt;class Array; def variance; mean = self.mean; Math.sqrt(inject( nil ) { |var,x| var ? var+((x-mean)**2) : ((x-mean)**2)}/self.size.to_f); end; end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If you want to normalize a random variable (array) so that mean = 0 and variance = 1, you can transform your array &lt;b&gt;x&lt;/b&gt; by calling:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# inputs a random variable, sets mean = 0 and variance = 1&lt;br /&gt;def standardize_random_variable(x)&lt;br /&gt;  mean = x.mean&lt;br /&gt;  variance = x.variance&lt;br /&gt;  x.map!{|a| (a-mean)/variance }&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If you want to compute distance, call these functions between two arrays of data, a and b.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;## Distance Functions&lt;br /&gt;&lt;br /&gt;# Sum of (x-y)^2&lt;br /&gt;def euclidean_squared_distance(a,b)&lt;br /&gt;  b = b.to_a&lt;br /&gt;  a = a.to_a&lt;br /&gt;  sum_of_diff_sq = 0&lt;br /&gt;  (0...a.size).each { |i| sum_of_diff_sq+=((a[i].to_f-b[i].to_f)**2)}&lt;br /&gt;  sum_of_diff_sq &lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# Square root of sum of (x-y)^2&lt;br /&gt;def euclidean_distance(neighbor,xq)&lt;br /&gt;  Math.sqrt(euclidean_squared_distance(neighbor,xq))&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# Sum of abs(x,y)&lt;br /&gt;def cityblock_distance(neighbor,xq)&lt;br /&gt;  xq = xq.to_a&lt;br /&gt;  abs_diff = 0&lt;br /&gt;  (0...xq.size).each { |i| abs_diff+=(Math.abs(xq[i].to_f-neighbor[i].to_f)}&lt;br /&gt;  abs_diff&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 10 Feb 2007 02:14:52 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3488</guid>
      <author>dustinsmith (dustin smith)</author>
    </item>
  </channel>
</rss>
