# source:orange/Orange/orng/orngDimRed.py@9671:a7b056375472

Revision 9671:a7b056375472, 4.8 KB checked in by anze <anze.staric@…>, 2 years ago (diff)

Moved orange to Orange (part 2)

Line
1#
2# Module Orange Dimension Reduction
3# ---------------------------------
4#
5# CVS Status: \$Id\$
6#
7# Author: Aleks Jakulin (jakulin@acm.org)
9#
10# Purpose: Dimension reduction
11#
12# Bibliography: Tom Minka, "36-350: Data Mining, Fall 2003", Lecture Notes, Carnegie Mellon University.
13#
14# ChangeLog:
15#   - 2003/10/28: project initiated
16#   - 2003/11/20: returning the parameters of the transform
17
18import numpy, mathutil
19import numpy.linalg as LinearAlgebra
20
21# before running PCA, it is helpful to apply the transformation
22# operators on individual vectors.
23class PCA:
24    def __init__(self, data, components=1):
25        (u,d,v) = LinearAlgebra.svd(data)
27        self.variance = d               # principal components' variance
28        self.factors = v                # the principal basis
29        d2 = numpy.power(d,2)
30        s = numpy.sum(d2)
31        if s > 1e-6:
32            s = d2/s
33        else:
34            s = 1.0
35        self.R_squared = s # percentage of total variance explained by individual components
36
37def Centering(vector, m = None, inverse=0):
38    assert(len(numpy.shape(vector))==1) # this must be a vector
39    if m == None:
40        m = numpy.average(vector)
41    if inverse==0:
42        return (vector-m,m)
43    else:
44        return vector+m
45
46def MaxScaling(vector, param = None):
47    if param == None:
48        (v,m) = Centering(vector)
49        s = max(abs(v))
50        if s > 1e-6:
51            s = 1.0/s
52    else:
53        (m,s) = param
54        (v,m_) = Centering(vector,m)
55    return (v*s,(m,s))
56
57def VarianceScaling(vector,param=None,inverse=0):
58    if param == None:
59        (v,m) = Centering(vector)
60        s = numpy.sqrt(numpy.average(numpy.power(v,2)))
61        if s > 1e-6:
62            s = 1.0/s
63    else:
64        (m,s) = param
65        if inverse == 0:
66            (v,m_) = Centering(vector,m)
67        else:
68            v = Centering(vector,m,1)
69    if inverse == 0:
70        return (s*v,(m,s))
71    else:
72        return s/v
73
74def _BC(vector,lambd):
75    if lambd != 0.0:
76        return (numpy.power(vector,lambd)-1)/lambd
77    else:
78        return numpy.log(vector)
79
80class _BCskewness:
81    def __init__(self,vector):
82        self.v = vector
83    def __call__(self,lambd):
84        nv = _BC(self.v,lambd)
85        mean = numpy.average(nv)
86        cv = nv-mean
87        skewness = numpy.average(numpy.power(cv,3))/numpy.power(numpy.average(numpy.power(cv,2)),1.5)
88        # kurtosis = numpy.average(numpy.power(cv,4))/numpy.power(numpy.average(numpy.power(cv,2)),2)-3
89        return skewness**2
90
91def BoxCoxTransform(vector,lambd=None):
92    v = -min(vector)+1+vector
93    print "shifting by ",-min(vector)+1
94    if lambd==None:
95        # find the value of lambda that will minimize skew
96        lambd = mathutil.minimum(_BCskewness(v))
97        print "best-fitting lambda = ",lambd
98    return _BC(v,lambd)
99
100def RankConversion(vector,reverse=0):
101    assert(len(numpy.shape(vector))==1) # this must be a vector
102
103    newv = numpy.zeros(numpy.size(vector),numpy.float)
104    l = []
105    for x in xrange(len(vector)):
106        l.append((vector[x],x))
107    l.sort()
108    if reverse:
109        l.reverse()
110    pi = -1
111    pv = 'a'
112    idx = []
113    pr = 0
114    cr = 0
115    for (v,i) in l:
116        if v != pv:
117            r = pr+(cr-pr+1)/2.0
118            for j in idx:
119                newv[j] = r
120            idx = []
121            pr = cr
122            pv = v
123        cr += 1
124        idx.append(i)
125    r = pr+(cr-pr+1)/2.0
126    for j in idx:
127        newv[j] = r
128    return newv
129
130if __name__== "__main__":
131    v = numpy.array([6, 6, 6, 6, 4, 6, 12, 12, 12, 4, 4, 4, 6, 6, 8, 6, 8, 8, 8, 4, 4, 8, 8, 8, 6, 6, 6, 6, 6, 6, 8, 8, 6, 6, 8, 6, 6, 8, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 6, 6, 8, 6, 6, 4, 4, 8, 8, 8, 6, 6, 6, 6, 6, 6, 4, 6, 8, 8, 8, 8, 8, 8, 8, 8, 4, 6, 6, 6, 6, 6, 6, 4, 6, 4, 4, 6, 6, 6, 6, 8, 6, 6, 4, 6, 6, 6, 8, 8, 8, 5, 5, 6, 6, 10, 8, 12, 12, 12, 8, 6, 6, 8, 8, 6, 4, 8, 8, 6, 6, 6, 8, 8, 8, 8, 4, 4, 4, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 8, 8, 8, 8, 4, 8, 8, 4, 4, 4, 4, 4, 4, 3, 6, 6, 4, 8, 8, 4, 4, 4, 4, 4, 4, 4, 6, 6, 8, 6, 6, 6, 8, 8, 6, 6, 6, 4, 4, 8, 6, 8, 8, 8, 6, 6, 6, 4, 4, 4, 6, 6, 4, 4, 12, 8, 6, 8, 6, 6, 8, 8, 6, 6, 8, 8, 6, 8, 8, 6, 8, 8, 8, 8, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 6, 8, 6, 6, 6, 6, 8, 6, 8, 8, 4, 8, 8, 6, 6, 6, 4, 6, 4, 4, 4, 4, 4, 6, 6, 4, 6, 4, 6, 6, 6, 6, 4, 6, 4, 4, 8, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 4, 4, 6, 6, 6, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 6, 4, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 8, 6, 4, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 5, 6, 4, 5, 5, 5], numpy.float)
132    print "original:"
133    print v
134    print "rank-transformed:"
135    print RankConversion(v)
136    print "centered"
137    print Centering(v)
138    print "minmax scaled"
139    print MaxScaling(v)
140    print "variance scaling"
141    print VarianceScaling(v)
142    print "Box-Cox"
143    print BoxCoxTransform(v)
Note: See TracBrowser for help on using the repository browser.