#!/usr/bin/env ruby require 'pp' $:<<".." require 'tools.rb' require 'matrix_math.rb' module PCA class Input def initialize(i=nil) @vecs=[] if i if i.is_a?(Array) i.each{|k|self<b[1]}.reverse z=y.map{|a|a[0]} #pp x,y,z @base=Linalg::DMatrix[*@base] @eigenvalues.sort!.reverse! pp self exit end end def doOrthoPCA trainCount=@input.trainCount featureCount=@input.featureCount #middle=@input.middle d=@input.dmatrix @middle=d.middle_row dt=d.transpose t=d*dt t=t*(1.0/trainCount) eigenValues=eigenVectors=nil t.eigensystem {|_eigenVectors,_eigenValues,img| eigenValues=_eigenValues eigenVectors=_eigenVectors } nvr=dT*eigenVectors #Tools::Math::Matrix nvr(trainCount,featureCount); #nvr=dT*vr; # PCAOutput o; # for(size_t y=0;y0) # scale=sqrt(ev[y]*trainCount); # else # scale=0; # if(scale<=0.0f) # scale=0; # else # scale=1.0/scale; # for(size_t x=0;x0?ev[y]:0); # } end end if false i=PCA::Input.new i<<[1,1,0] i<<[0,1,1] i<<[0,1,2] i<<[9,1,1] i<<[0,1,0] base=PCA::Base.new(i) #pp base c=base.compress([5,1,0]) #pp c r=base.decompress(c) pp r end