Esempio n. 1
0
def pca(ID, biniter):
  tree = Display.getFront().getLayerSet().findById(ID)

  #Calculate the center of mass
  center = Matrix( [[0,0,0]] )
  coords = Matrix(getNodeCoordinates(tree))
  m=coords.getRowDimension()

  for i in range(0, coords.getRowDimension()):
    center += Matrix([coords.getRow( i )])
  center /= float(m)

  #print center

  """
  x, y, z = 0, 0, 0
  nc = getNodeCoordinates(tree)
  for c in nc:
    x += c[0]
    y += c[1]
    z += c[2]
  print "center:", x/len(nc), y/len(nc), z/len(nc)
  """

  #Define covvariance matrix
  cova = Matrix([[0,0,0],[0,0,0],[0,0,0]])
  diff= Matrix ( [[0,0,0]])
  for i in range(0, m):
    diff = Matrix([coords.getRow( i )]) - center
    cova += diff.transpose() * diff
  cova /= float(m)

  #Evaluedecomposition 
  evaluedecomp = cova.eig()
  evalues = evaluedecomp.getRealEigenvalues()
  evectors = evaluedecomp.getV() # is a Matrix instance

  #Find maximum Eigenvector for maximal Eigenvalue
  maxevaluepos = -1
  maxevalue = 0
  for i in range(0, len(evalues)):
	  if evalues[i] > maxevalue or maxevaluepos==-1:
		  maxevalue=evalues[i]
		  maxevaluepos=i	
  maxevector=evectors.getColumn(maxevaluepos)  #HAVE TO GET VALUES OF COLUMN of evector matrix  i NOT ROW



  #--------------------TEST if Eigenvaluedecomposition is correct-----------
  #vectormatrix=Matrix([evectors.getColumn(maxevaluepos)])
  #test=cova * vectormatrix.transpose()
  #test2=vectormatrix*maxevalue
  #print test
  #print test2
  #-------------------------------------------------------------------------

  #Define a vector over the point cloud and count points in defined interval
  #Normalize vector
  length=sqrt(maxevector[0]**2 + maxevector[1]**2 + maxevector[2]**2)
  normvector = map(lambda x: x / length, maxevector)


  normvectormatrix = Matrix([normvector])
  pca=[]
  m=coords.getRowDimension()
  for i in range(0, m):
    pcastore = (Matrix([coords.getRow( i )]) - center ) * normvectormatrix.transpose()
    pca.append(pcastore.getRow(0))

  #Count number of nodes which fall in defined interval of pca projection -> has to be fixed globally when to compare PCAs!
  counter = 0
  histovector = []
  pca=[ x[0] for x in pca] #get it back in array form (get rid of list in list)
  binleft = -12500 #binleft = min(pca)
  iterations = biniter
  length = int(25000/iterations + 0.5) #int((max(pca)-min(pca))/iterations + 0.5)
  binright = binleft + length

  for i in range(0,iterations):
    for i in range(0, len(pca)):
      if pca[i] <= binright and pca[i] >= binleft:
        counter += 1    
    histovector.append(counter)
    counter=0
    binleft+=length
    binright+=length
  #print "The histogram vector is:", histovector
  return histovector
Esempio n. 2
0
coords = getNodeCoordinates(tree)
for coord in coords:
  center += coord
center /= float(len(coords)) 
print center


#Define covvariance matrix
# [[row1], [row2], [row3]]
cova = Matrix([[0,0,0],[0,0,0],[0,0,0]])
for coord in coords:
  diff = coord - center
  cova += diff * diff.transpose()

#Evaluedecomposition 
evaluedecomp = cova.eig()
evalues = evaluedecomp.getRealEigenvalues()
evectors = evaluedecomp.getV() # is a Matrix instance

#Find maximum Eigenvector for maximal Eigenvalue
maxevaluepos = -1
maxevalue = 0
for i in range(0, len(evalues)):
	if evalues[i] > maxevalue or maxevaluepos==-1:
		maxevalue=evalues[i]
		maxevaluepos=i
		
maxevector=evectors.getRow(maxevaluepos)  # its a list of 3 values

#Define a vector over the point cloud and count points in defined interval
#Normalize vector