• No results found

We demonstrate the usage of R package : pcaL1 on “Micorbiome data”. A 496 × 34 in size, has bacteria profile of subjects (in this case humans) i.e. each bar in figure 2.5 shows the percentage of different bacteria in each subject’s sample. The colors of different bacterias has been manually identified to analyze these colored clusters for relationships amongst them. All of the methods in R package are used on this data and the results are plotted, with the help of rgl [6] (an R Package for 3d plots), and discussed to show the different results from different L1-PCA algorithms.

The samples of bacteria are collected at different clinics and is sent to mi-crobiology lab from there to look for the bacterias under study. The results from the lab then undergo DNA sequencing to associate DNA of various bacte-ria. At this point, each subject has about 20-30,000 DNA sequences associated with him/her. These sequences are put in percentage form after identifying the bacteria and the data is set up for analysis. A pictorial representation of data collection is shown in Fig 2.6.

The first column of data is manually identified labels, so we put the values of this label in a separate vector which are used later to color code the points in 3-D plots. The code for that is shown below:

mydata <- read.table("clpcode/exec/microbiometypes.txt") mylabels <- mydata[,1]

mypcadata <- mydata[,-c(1)]

The code for calling pcaL1 functions and results on R are shown below:

R> mykwak <- pcal1(mypcadata,projDim=3,score=TRUE, var=TRUE) R> mykwak$PCs

[,1] [,2] [,3]

[1,] 0.2456316461 -4.122662e-01 -0.420780990 [2,] 0.6922667374 4.532892e-01 0.474504660 [3,] 0.4868120050 2.043177e-01 -0.656833206 [4,] 0.4235189959 -7.595785e-01 0.324092902 [5,] 0.1096279853 4.394477e-03 -0.153313731 [6,] 0.0759128653 5.124354e-02 -0.083999800

. . .

. . .

. . .

[27,] 0.0029555109 1.570871e-03 -0.002690254 [28,] 0.0022701248 1.753319e-03 -0.002962853 [29,] 0.0020519217 1.475746e-03 -0.001779449 [30,] 0.0018875863 1.538587e-03 -0.002830030 [31,] 0.0017154425 7.478593e-05 -0.002334359 [32,] 0.0008679204 6.843594e-04 -0.001272212 [33,] 0.0949796432 -1.513827e-02 -0.078562795

R> mykwak$PropL1Dispersion

[1] 0.3442172 0.3095441 0.3030566

R> myl1pcastar <- l1pcastar(mypcadata,projDim=3, getScore=TRUE, getProjPoints=TRUE, propVar=TRUE)

R> myl1pcastar$PCs

[,1] [,2] [,3]

[1,] -0.0071982563 1.015766e-01 -6.641151e-01 [2,] 0.0012351239 9.894476e-01 1.319859e-01 [3,] 0.0080964628 -8.959534e-02 7.217552e-01 [4,] -0.9969178902 8.043031e-05 1.901229e-02 [5,] -0.0488186528 -2.574058e-03 -4.499122e-02 [6,] -0.0407661533 9.624811e-04 -9.847082e-02 [7,] 0.0076607688 3.075361e-02 3.672275e-02 [8,] 0.0212358508 -1.484202e-02 2.073030e-02

. . .

. . .

. . .

[28,] 0.0006744257 1.307122e-04 5.791225e-04 [29,] 0.0003653182 3.169510e-04 -5.010227e-04 [30,] 0.0066456248 3.086885e-03 1.011392e-02 [31,] 0.0000918366 6.337891e-04 -1.065300e-03 [32,] -0.0002221122 -1.676717e-04 5.908053e-06 [33,] -0.0137127842 -9.519876e-03 9.274510e-04

R> myl1pcastar$PropL1Dispersion [1] 0.3721951 0.3509983 0.2396433

R> myl1pca <- l1pca(mypcadata,projdim=3, iteration=20, center=TRUE, getScore=TRUE, getProjPoints=TRUE, dispersionExp=TRUE)

R> myl1pca$PC

[,1] [,2] [,3]

[1,] -7.962093e-01 8.139833e-06 2.229826e-02 [2,] 9.441704e-04 6.046040e-01 0.000000e+00 [3,] 8.466538e-04 1.230737e-03 5.538430e-05 [4,] 2.439095e-06 -1.136296e-05 0.000000e+00 [5,] 3.320618e-05 1.125490e-04 1.966058e-05 [6,] 1.121303e-04 -1.301779e-03 0.000000e+00 [7,] 0.000000e+00 3.903256e-05 9.863718e-06 [8,] -5.484967e-05 1.814891e-05 0.000000e+00

. . .

. . .

. . .

[28,] 6.322365e-03 1.239196e-03 0.000000e+00 [29,] 0.000000e+00 2.845630e-04 9.739368e-04 [30,] -1.007259e-05 5.641093e-06 0.000000e+00 [31,] 3.271044e-05 0.000000e+00 3.977633e-04 [32,] 0.000000e+00 0.000000e+00 0.000000e+00 [33,] 0.000000e+00 7.957306e-05 2.937403e-03

> myl1pca$PropL1Dispersion

[1] 0.3280341 0.3048935 0.3024189

From the results, we can notice that the maximum L1-dispersion explained along the first three principal components is captured by PCA-L1, then L1-PCA. Table 2.7 compares the proportion of L1 dispersion explained by each method for first three PCs. The total L1-dispersion explained by L1-PCA is

PC PCA-L1 L1-PCA L1-PCA 1 0.3442172 0.3721951 0.3280341 2 0.3095441 0.3509983 0.3048935 3 0.3030566 0.2396433 0.3024189 TOTAL 0.9568179 0.9628367 0.9353465

Table 2.7: Proportion of L1 dispersion explained by first 3 PCs

maximum among the three methods for microbiome data with L1-PCA explain-ing the least proportion.

The scatter plots using scores for each method, including L2-PCA, are shown in the Fig 2.7. Each dot represent a person with color denoting the type of bacteria with maximum percentage for that person. The clusters obtained from scatter plots can help in inferring the relationships between people colonized with (traditionally considered) healthy, less healthy and unhealthy bacterias.

The results of relationships between different bacterias will be used further in microbiome project to draw conclusions on the regional, genetic and ethnicity related occurrences of the bacteria.

Figure 2.5: Bacteria profiles of subjects

Figure 2.6: Steps of Data Collection

(a) L2-PCA (b) PCA-L1

(c) L1-PCA (d) L1-PCA

Figure 2.7: 3-D plots for different PCA methods.

Bibliography

[1] J.P. Brooks, J.H. Dul´a, and E.L. Boone. A pure l1-norm principal compo-nent analysis. IEEE Transaction on Pattern Analysis and Machine Intel-ligence, 2010.

[2] N.A. Campbell. Robust procedures in multivariate analysis i: Robust co-variance estimation. Applied Statistics, 29:231–237, 1980.

[3] V. Choulakian. L1-norm projection pursuit principal component analysis.

Computational Statistics and Data Analysis, 50:1441–1451, 2006.

[4] V. Choulakian, J. Allard, and J. Almhana. Robust centroid method. Com-putational Statistics and Data Analysis, 51:737–746, 2006.

[5] V. Chv´atal. Linear Programming. Freeman, 1983.

[6] Duncan Mudroch Daniel Adler. rgl: 3d visualization device system. http:

//cran.r-project.org/web/packages/rgl/index.html, 2011.

[7] J.S. Galpin and D.M. Hawkins. Methods of l1 estimation of a covariance matrix. Computational Statistics and Data Analysis, 30:305–319, 1987.

[8] I.T. Jolliffe. Principal Component Analysis. Springer-Verlag, 2002.

[9] Q. Ke and T. Kanade. Robust l1 norm factorization in the presence of out-liers and missing data by alternative convex programming. In Proceedings

of the 2005 IEEE Computer Society Conference on Computer Vision and Recoginition, 2005.

[10] N. Kwak. Principal component analysis based on l1-norm maximiza-tion. IEEE Transaction on Pattern Analysis and Machine Intelligence, 30, September 2008.

[11] R.A. Maronna. Robust m-estimators of multivariate location and scatter.

The Annals of Statistics, 1:51–67, 1976.

[12] R.A. Maronna. Principal components and orthogonal regression based on robust scales. Technometrics, 47:264–273, Aug. 2005.

[13] R.A. Maronna and V.J. Yohai. Robust low-rank approximation of data matrices with elementwise contamination. Tecnometrics, 50:295–304, Aug.

2008.

[14] P.J. Rousseeuw. Least median of squares regression. Journal of American Statistical Association, 79:871–880, Dec. 1984.

[15] H.M. Wagner. Linear programming techniques for regression analysis. Jour-nal of American Statistical Association, 54:206–212, Mar. 1959.

[16] V.J. Yohai. High-breakdown point and high-efficiency estimates for regres-sion. The Annals of Statistics, 15:642–656, 1987.

Appendices

DESCRIPTION

DESCRIPTION Package : pcaL1

V e r s i o n : 0 . 0 5 Date : 2011−01−01

T i t l e : I m p l e m e n t a t i o n o f 3 PCA methods u s i n g L1 norm L i c e n s e : GPL−2

Author@R : c ( p e r s o n ( ” Sapan J o t ” , ” D e v e l o p e r ” , e m a i l=”

j o t s @ v c u . edu ” ) , p e r s o n ( ” J . P . Brooks ” , ” A d v i s o r ” ) ) Author : Sapan J o t <j o t s @ v c u . edu >, w i t h c o n t r i b u t i o n s from

J . P . Brooks <jpbrooks@vcu , edu >.

M a i n t a i n e r : Sapan J o t <j o t s @ v c u . edu>

D e s c r i p t i o n : T h i s p a c k a g e p r o v i d e s 3 d i f f e r e n t p r i n c i p a l component a n a l y s i s methods u s i n g L1 norm . F i r s t i s L1−

PCA∗ by Dr . J . P . Brooks , Dr . Dula and Dr . Boone . Second i s PCA−L1 by N. Kwak and t h i r d i s L1−PCA by Ke and Kanade .

Packaged : 2011−04−08 1 9 : 0 0 : 3 4 UTC; j p b r o o k s

NAMESPACE

NAMESPACE e x p o r t P a t t e r n ( ” ˆ [ ˆ \ \ . ] ” )

UseDynLib ( pcaL1 , PcaL1 R , l 1 p c a , l 1 p c a s t a r )

C Code

type.h

src/type.h

#include ” C l p C I n t e r f a c e . h”

#include <s y s / t i m e s . h>

#include <s t d i o . h>

#include < a s s e r t . h>

#include <f l o a t . h>

#define PATHLENGTH 500 /∗ l e n g t h o f p a t h name d e s c r i b i n g l o c a t i o n o f d a t a f i l e ∗/

#define OBJ INIT 1 0 0 0 0 0 0 0 . 0 /∗ i n i t i a l i n c u m b e n t v a l u e ∗/

#define VERBOSITY 0 /∗ 1− p r i n t p r o j d i m , r o t a t i o n m a t r i x , a v e r a g e e r r o r , l 3− p r o j e c t e d p o i n t s i n t e r m s o f o r i g i n a l c o o r d s , 4−CPX s c r e e n o u t p u t on , a l l o b j e c t i v e

v a l u e s , b e s t b e t a s , p r o j e c t e d p o i n t s a t e a c h

i t e r a t i o n , o r t h o g o n a l d i r e c t i o n , columns o f r o t a t i o n m a t r i x a t e a c h i t e r a t i o n , i n i t i a l SVD i n f o 5 − CPLEX l o g f i l e , 6− w r i t e s u b p r o b l e m t o a f i l e , 7 − w r i t e p o i n t s t o s c r e e n ∗/

#define NBMAX 64 /∗ maximum p o s s i b l e b l o c k s i z e , s e e d g e q r f . f i n LAPACK ∗/

#define PROJPTS 0 /∗ i f 1 , g e t p r o j e c t e d q−dim p o i n t s i n t e r m s o f o r i g i n a l c o o r d i n a t e s ∗/

#define SCORES 0 /∗ i f 1 , g e t s c o r e s , p r o j e c t e d p o i n t s i n new c o o r d i n a t e s ∗/

#define PREV 0 /∗ i f 1 , g e t p r o d u c t o f Vˆ k m a t r i c e s ∗/

#define PREVBETA 1 /∗ i f 1 , g e t p r o d u c t o f (Vˆ k Beta ) m a t r i c e s ∗/

#define EPSILON 0 . 0 0 0 0 0 0 1 /∗ c h e c k i f o b j e c t i v e i s 0 , c h e c k i f wT == wTold ∗/

/∗ i n p u t d a t a ∗/

s t r u c t e n t i t y i n f o {

i n t n u m e n t i t i e s ; /∗# o f rows i n y o u r d a t a ∗/

i n t n u m a t t r i b u t e s ; /∗# o f columns ∗/

i n t k ;

double ∗PCs ; /∗ a l l t h e w ’ s ∗/

#include <math . h>

s t a t u s = i n i t i a l i z e ( e n t i t y i n f o , p r o b l e m i n f o ) ;

xSum=s q r t ( xSum ) ;

p o l a r i t y [ i ] = 1 . 0 ;

}

p r o b l e m i n f o . wTOld = NULL ; p r o b l e m i n f o . PCs = PCs ;

e n t i t y i n f o . n u m e n t i t i e s = dataDim [ 1 ] ; e n t i t y i n f o . n u m a t t r i b u t e s = dataDim [ 0 ] ;

p r o b l e m i n f o . q = ∗q ; /∗ d e s i r e d number o f PCs∗/

e n t i t y i n f o . p o i n t s = p o i n t s ; /∗ t r a n s p o s e o f d a t a m a t r i x

∗/

s t a t u s = allocateMemoryPcaL1 (& e n t i t y i n f o , &p r o b l e m i n f o ) ;

i f ( s t a t u s ) {

f p r i n t f ( s t d e r r , ” Unable t o a l l o c a t e memory\n” ) ; goto TERMINATE;

}

s t a t u s = s o l v e P c a L 1 (& e n t i t y i n f o , &p r o b l e m i n f o ) ; i f ( s t a t u s ) {

f p r i n t f ( s t d e r r , ” Unable t o s o l v e . T e r m i n a t i n g . . . ; o r done \n” ) ;

goto TERMINATE;

}

TERMINATE:

/∗ f r e e a n d n u l l ( ( c h a r ∗ ∗ ) &e n t i t y i n f o . p o i n t s ) ; ∗/

f r e e a n d n u l l ( ( char ∗ ∗ ) &p r o b l e m i n f o . p o l a r i t y ) ; f r e e a n d n u l l ( ( char ∗ ∗ ) &p r o b l e m i n f o .wT) ;

f r e e a n d n u l l ( ( char ∗ ∗ ) &p r o b l e m i n f o . wTOld ) ; /∗ f r e e a n d n u l l ( ( c h a r ∗ ∗ ) &p r o b l e m i n f o . PCs ) ; ∗/

}

s t a t i c void

f r e e a n d n u l l ( char ∗∗ p t r ) {

i f ( ∗ p t r != NULL) { f r e e ( ∗ p t r ) ;

∗ p t r = NULL;

} }

i n t allocateMemoryPcaL1 ( ENTITYINFOptr e n t i t y i n f o ,

PROBLEMINFOptr p r o b l e m i n f o ) {

void dgemm ( char t r a n s a , char t r a n s b , i n t m, i n t n , i n t k

C l p s e t D u a l O b j e c t i v e L i m i t ( s o l v e r i n f o −>model ,

m i n o b j e c t i v e = p r o b l e m i n f o −>o b j e c t i v e ;

o r done \n” ) ;

columns o f preVjT d e f i n e t h e new s u b s p a c e ∗/

r h s [ i ] = 0 . 0 ;

matbeg [ numcols ] = n z c n t ;

C l p l o a d P r o b l e m ( s o l v e r i n f o −>model , numcols , r c n t ,

matbeg , matind , matval , p r o b l e m i n f o −>l b , p r o b l e m i n f o

−>ub , obj , rhs , r h s ) ;

return 0 ;

} /∗ end l o a d C l p P r o b l e m ∗/

i n t changeBounds ( SOLVERINFOptr s o l v e r i n f o , PROBLEMINFOptr p r o b l e m i n f o , i n t l ) {

i n t j = p r o b l e m i n f o −>j ;

i n t p r o j d i m = p r o b l e m i n f o −>p r o j d i m ; i n t ∗ b e t a i n d = p r o b l e m i n f o −>b e t a i n d ; f o r ( j = 0 ; j < ( p r o j d i m + 1 ) ; ++j ) {

p r o b l e m i n f o −>l b [ b e t a i n d [ j ]]= −(COIN DBL MAX) ; p r o b l e m i n f o −>ub [ b e t a i n d [ j ] ] =COIN DBL MAX ; }

p r o b l e m i n f o −>l b [ b e t a i n d [ l ] ] = − 1 . 0 ; p r o b l e m i n f o −>ub [ b e t a i n d [ l ] ] = − 1 . 0 ;

Clp chgColumnLower ( s o l v e r i n f o −>model , p r o b l e m i n f o −>l b ) ; Clp chgColumnUpper ( s o l v e r i n f o −>model , p r o b l e m i n f o −>ub ) ; /∗ C l p w r i t e M p s ( s o l v e r i n f o −>model , ” t e s t . mps ” ) ; ∗/

return 0 ;

} /∗ end changeBounds ∗/

i n t o p t i m i z e ( SOLVERINFOptr s o l v e r i n f o , PROBLEMINFOptr p r o b l e m i n f o ) {

i n t s t a t u s = p r o b l e m i n f o −>s t a t u s ; i n t s o l s t a t = p r o b l e m i n f o −>s o l s t a t ; s t a t u s=C l p d u a l ( s o l v e r i n f o −>model , 0 ) ; i f ( s t a t u s ) {

/∗ f p r i n t f ( s t d o u t , ” e r r o r s o l v i n g d u a l s i m p l e x \n ” ) ; r e t u r n 1 ; ∗/

}

s o l s t a t=C l p s t a t u s ( s o l v e r i n f o −>model ) ;

i f ( s o l s t a t != 0 ) {

/∗ f p r i n t f ( s t d o u t , ” s o l s t a t %d \n ” , s o l s t a t ) ; r e t u r n 1 ; ∗/

}

p r o b l e m i n f o −>o b j e c t i v e = C l p g e t O b j V a l u e ( s o l v e r i n f o −>

model ) ;

i f ( (VERBOSITY) >= 4 ) {

f p r i n t f ( s t d o u t , ” o b j e c t i v e v a l u e %f \n” , p r o b l e m i n f o

−>o b j e c t i v e ) ; f f l u s h ( s t d o u t ) ; }

return 0 ;

} /∗ end o p t i m i z e ∗/

i n t g e t B e t a ( SOLVERINFOptr s o l v e r i n f o , ENTITYINFOptr e n t i t y i n f o , PROBLEMINFOptr p r o b l e m i n f o , i n t l ) {

i n t i = p r o b l e m i n f o −>i ;

/∗ i n t s t a t u s = p r o b l e m i n f o −>s t a t u s ; ∗/

i n t n u m f a c t o r s = p r o b l e m i n f o −>n u m f a c t o r s ;

p r o b l e m i n f o −>b e t a = C l p g e t C o l S o l u t i o n ( s o l v e r i n f o −>

model ) ;

i f ( (VERBOSITY) >= 4 ) {

f o r ( i = 0 ; i < n u m f a c t o r s ; ++i ) {

f p r i n t f ( s t d o u t , ” b e t a [%d ] %f \n” , i , p r o b l e m i n f o −>

b e t a [ i ] ) ; f f l u s h ( s t d o u t ) ; }

}

return 0 ;

} /∗ end g e t B e t a ∗/

i n t g e t P r o j e c t e d P o i n t s ( ENTITYINFOptr e n t i t y i n f o , PROBLEMINFOptr p r o b l e m i n f o ) {

i n t n u m a t t r i b u t e s = e n t i t y i n f o −>n u m a t t r i b u t e s ; i n t n u m e n t i t i e s = e n t i t y i n f o −>n u m e n t i t i e s ; double ∗ p o i n t s = e n t i t y i n f o −>p o i n t s ; i n t i = p r o b l e m i n f o −>i ;

i n t j = p r o b l e m i n f o −>j ;

i n t s t a t u s = p r o b l e m i n f o −>s t a t u s ;

∗/

xpluslambda2 , p r o j d i m + 1 , 1 . 0 , p r o b l e m i n f o −>

p r o j p o i n t s , n u m a t t r i b u t e s ) ; /∗ g e t p r o j e c t e d p o i n t s i n o r i g i n a l c o o r d i n a t e s by m u l t i p l y i n g preVjT by x p l u s l a m b d a , p r o j e c t e d p o i n t s a r e columns ∗/

} }

dgemv ( ’N ’ , n u m a t t r i b u t e s , p r o j d i m + 1 , 1 . 0 , p r o b l e m i n f o −>preVjT , n u m a t t r i b u t e s , a , 1 , 1 . 0 , tempPC , 1 ) ; /∗ m u l t i p l y o l d VjT ’ s by a , t o g e t

p r o j d i m ˆ t h PC ∗/

f o r ( j = 0 ; j <n u m a t t r i b u t e s ; ++j ) {

p r o b l e m i n f o −>b [ n u m a t t r i b u t e s ∗ p r o j d i m + j ] = tempPC [ j ] ;

}

/∗ new VBeta t i m e s p r e v i o u s VBeta ∗/

f o r ( i = 0 ; i < n u m a t t r i b u t e s ∗ ( p r o j d i m + 1 ) ; ++i ) { temppreVBeta [ i ] = 0 . 0 ;

}

f o r ( i = 0 ; i < p r o j d i m ; ++i ) {

f o r ( j = 0 ; j < p r o j d i m + 1 ; ++j ) { i f ( j != b e s t d i r [ p r o j d i m ] ) {

p r o b l e m i n f o −>VBeta [ p r o j d i m ∗ j + i ] = p r o b l e m i n f o

−>VjT [ ( p r o j d i m + 1 ) ∗ i + j ] + p r o b l e m i n f o −>

VjT [ ( p r o j d i m + 1 ) ∗ i + b e s t d i r [ p r o j d i m ] ] ∗ b e t a [ j ] ;

} e l s e {

p r o b l e m i n f o −>VBeta [ p r o j d i m ∗ j + i ] = 0 . 0 ; }

} }

dgemm ( ’N ’ , ’N ’ , projdim , n u m a t t r i b u t e s , p r o j d i m + 1 , 1 . 0 , p r o b l e m i n f o −>VBeta , projdim , p r o b l e m i n f o −>

preVBeta , p r o j d i m + 1 , 0 . 0 , temppreVBeta , p r o j d i m ) ; /∗ g e t preVBeta − p r o j d i m by n u m a t t r i b u t e s ∗/

f o r ( i = 0 ; i < n u m a t t r i b u t e s ∗ p r o j d i m ; ++i ) { p r o b l e m i n f o −>preVBeta [ i ] = temppreVBeta [ i ] ; }

/∗ p r e v i o u s VjT ’ s t i m e s VjT ∗/

f o r ( i = 0 ; i < n u m a t t r i b u t e s ∗ ( p r o j d i m + 1 ) ; ++i ) { temppreVjT [ i ] = 0 . 0 ;

}

dgemm ( ’N ’ , ’N ’ , n u m a t t r i b u t e s , projdim , p r o j d i m + 1 , 1 . 0 , p r o b l e m i n f o −>preVjT , n u m a t t r i b u t e s , p r o b l e m i n f o

−>VjT , p r o j d i m + 1 , 1 . 0 , temppreVjT , n u m a t t r i b u t e s ) ; /∗ g e t preVjT − n u m a t t r i b u t e s by p r o j d i m ∗/

f o r ( i = 0 ; i < n u m a t t r i b u t e s ∗ p r o j d i m ; ++i ) { p r o b l e m i n f o −>preVjT [ i ] = temppreVjT [ i ] ;

}

i f ( p r o j d i m == 1 ) { /∗ g e t 1 s t PC ∗/

f o r ( i = 0 ; i < n u m a t t r i b u t e s ; ++i ) {

p r o b l e m i n f o −>b [ i ] = p r o b l e m i n f o −>preVjT [ i ] ; }

}

f o r ( i = 0 ; i < p r o j d i m ∗ n u m e n t i t i e s ; ++i ) { e n t i t y i n f o −>p o i n t s [ i ] = 0 . 0 ;

}

dgemm ( ’T ’ , ’N ’ , projdim , n u m e n t i t i e s , p r o j d i m + 1 , 1 . 0 , p r o b l e m i n f o −>VjT , p r o j d i m + 1 , xpluslambda2 , p r o j d i m + 1 , 1 . 0 , e n t i t y i n f o −>p o i n t s , p r o j d i m ) ; /∗

g e t new p o i n t s i n new c o o r d i n a t e s by m u l t i p l y i n g Vj ( t r a n s p o s e o f VjT ) by x p l u s l a m b d a ∗/

/∗ g e t s c o r e s − p r o j e c t e d p o i n t s i n t e r m s o f new c o o r d i n a t e s ∗/

i f ( ( p r o b l e m i n f o −>g e t S c o r e s == 1 ) && ( p r o j d i m == q ) ) { f o r ( i = 0 ; i < n u m e n t i t i e s ; ++i ) {

f o r ( j = 0 ; j < p r o j d i m ; ++j ) {

p r o b l e m i n f o −>s c o r e s [ i ∗ p r o j d i m + j ] = e n t i t y i n f o

−>p o i n t s [ i ∗ p r o j d i m + j ] ; }

} }

return 0 ;

} /∗ end g e t P r o j e c t e d P o i n t s ∗/

i n t d g e s vd ( char jobu , char j o b v t , i n t m, i n t n , double ∗ A, i n t l d a , double ∗S , double ∗VT, i n t ldu , double ∗ Umat , i n t l d v t , double ∗ work , i n t l w o r k ) { /∗ SVD ∗/

extern void d g e s v d ( const char ∗ jobup , const char ∗ j o b v t p , const i n t ∗mp, const i n t ∗np , double ∗A, i n t

∗ ldap , double ∗S , double ∗U, const i n t ∗ ldup ,

double ∗Umat , i n t ∗ l d v t p , double ∗ work , i n t ∗ lworkp , i n t ∗ i n f o p ) ;

i n t i n f o ;

d g e s v d (& jobu , &j o b v t , &m, &n , A, &l d a , S , VT, &ldu , Umat , &l d v t , work , &lwork , &i n f o ) ;

return i n f o ;

} /∗ end d g e s v d , SVD ∗/

void dgemm ( char t r a n s a , char t r a n s b , i n t m, i n t n , i n t k , double alpha , double ∗A, i n t l d a , double ∗B , i n t ldb , double beta , double ∗C, i n t l d c ) { /∗ m u l t i p l y A ∗B

= C ∗/

extern void dgemm ( const char ∗ t r a n s a p , const char ∗ t r a n s b p , const i n t ∗mp, const i n t ∗np , const i n t ∗kp , double ∗ alphap , double ∗A, const i n t ∗ ldap , double

∗B, const i n t ∗ ldbp , const double ∗ betap , double ∗C , const i n t ∗ l d c p ) ;

dgemm (& t r a n s a , &t r a n s b , &m, &n , &k , &alpha , A, &l d a , B , &ldb , &beta , C, &l d c ) ;

} /∗ end dgemm , m u l t i p l y A∗B ∗/

void dgemv ( char t r a n s , i n t m, i n t n , double alpha , double ∗A, i n t l d a , double ∗x , i n t i n c x , double beta , double ∗y , i n t i n c y ) { /∗ m u l t i p l y Ax = y ∗/

extern void dgemv ( const char ∗ t r a n s p , const i n t ∗mp, const i n t ∗np , double ∗ alphap , double ∗A, const i n t

∗ ldap , double ∗x , const i n t ∗ incxp , const double ∗ betap , double ∗y , const i n t ∗ i n c y p ) ;

dgemv (& t r a n s , &m, &n , &alpha , A, &l d a , x , &i n c x , &

beta , y , &i n c y ) ;

} /∗ end dgemv , m u l t i p l y Ax ∗/

src/l1pcaStar R.c

#include ” C l p C I n t e r f a c e . h”

#include < s t d l i b . h>

#include <s t d i o . h>

#include < s t r i n g . h>

#include <R . h>

#include <Rmath . h>

#include ” t y p e . h”

i n t a l l o c a t e M e m o r y ( ENTITYINFOptr e n t i t y i n f o ,

SOLVERINFOptr s o l v e r i n f o , PROBLEMINFOptr p r o b l e m i n f o ) ; i n t s o l v e p r o b l e m ( ENTITYINFOptr e n t i t y i n f o , SOLVERINFOptr

s o l v e r i n f o , PROBLEMINFOptr p r o b l e m i n f o ) ; /∗ i n t s o l v e P c a L 1 ( IOINFOptr i o i n f o , ENTITYINFOptr

e n t i t y i n f o , PROBLEMINFOptr p r o b l m e i n f o ) ; ∗/

s t a t i c void

f r e e a n d n u l l ( char ∗∗ p t r ) ;

void l 1 p c a S t a r ( double ∗ p o i n t s , i n t ∗ dataDim , i n t ∗q , i n t

∗ g e t S c o r e s , i n t ∗ g e t P r o j P o i n t s , double ∗PCs , double ∗ S c o r e s , double ∗ p r o j p o i n t s )

{

ENTITYINFO e n t i t y i n f o ; SOLVERINFO s o l v e r i n f o ; PROBLEMINFO p r o b l e m i n f o ;

i n t s t a t u s = p r o b l e m i n f o . s t a t u s ; s t a t u s = 0 ;

s o l v e r i n f o . model = NULL ;

p r o b l e m i n f o . q = ∗q ; /∗ d e s i r e d number o f PCs∗/

f r e e a n d n u l l ( ( char ∗ ∗ ) &p r o b l e m i n f o . VjT ) ;

i n t n u m a t t r i b u t e s = e n t i t y i n f o −>n u m a t t r i b u t e s ;

p r o b l e m i n f o −>matbeg = ( i n t ∗ ) m a l l o c ( ( n u m f a c t o r s + 2∗

p r o b l e m i n f o −>temppreVjT = ( double ∗ ) m a l l o c (

i f ( s t a t u s ) {

return 0 ;

i n t n z c n t = p r o b l e m i n f o −>n z c n t ;

matind [ n z c n t ] = xindb [ j ] ;

f p r i n t f ( s t d o u t , ” s o l s t a t %d\n” , s o l s t a t ) ;

i n t ∗∗ rowind = p r o b l e m i n f o −>rowind ;

f o r ( j = 0 ; j < n u m a t t r i b u t e s ; ++j ) {

return 0 ;

j ] ∗ ( 1 / s q r t ( nv [ i ] ) ) ;

f o r ( k = 0 ; k < q ; ++k ) {

return i n f o ;

} /∗ end d g e s v d , SVD ∗/

src/l1pca R.c

#include < s t d l i b . h>

#include <s t d i o . h>

#include < s t r i n g . h>

#include ” t y p e . h”

i n t a l l o c a t e M e m o r y 2 ( ENTITYINFOptr e n t i t y i n f o ,

SOLVERINFOptr s o l v e r i n f o , PROBLEMINFOptr p r o b l e m i n f o ) ; i n t s o l v e L 1 P c a ( ENTITYINFOptr e n t i t y i n f o , SOLVERINFOptr

s o l v e r i n f o , PROBLEMINFOptr p r o b l e m i n f o ) ; /∗ i n t s o l v e P c a L 1 ( IOINFOptr i o i n f o , ENTITYINFOptr

e n t i t y i n f o , PROBLEMINFOptr p r o b l m e i n f o ) ; ∗/

s t a t i c void

f r e e a n d n u l l ( char ∗∗ p t r ) ;

void l 1 p c a ( double ∗ p o i n t s , i n t ∗ dataDim , i n t ∗q , double

∗ t o l e r a n c e , i n t ∗ i t e r a t i o n s , double ∗ i n i t V , i n t ∗ g e t S c o r e s , double ∗PCs , double ∗ S c o r e s )

{

ENTITYINFO e n t i t y i n f o ; SOLVERINFO s o l v e r i n f o ; PROBLEMINFO p r o b l e m i n f o ;

i n t s t a t u s = p r o b l e m i n f o . s t a t u s ; i n t i = p r o b l e m i n f o . i ;

s t a t u s = 0 ;

e n t i t y i n f o . p o i n t s = p o i n t s ; e n t i t y i n f o . n u m e n t i t i e s = dataDim [ 1 ] ; e n t i t y i n f o . n u m a t t r i b u t e s= dataDim [ 0 ] ; s o l v e r i n f o . modelU = NULL ; s o l v e r i n f o . modelV = NULL ;

p r o b l e m i n f o . q = ∗q ;

p r o b l e m i n f o . i n i t V = i n i t V ;

f p r i n t f ( s t d o u t , ” i n i t V %p p r o b l e m i n f o . i n i t V %p\n” , i n i t V , p r o b l e m i n f o . i n i t V ) ;

p r o b l e m i n f o . g e t S c o r e s = ∗ g e t S c o r e s ;

p r o b l e m i n f o . t o l e r a n c e = ∗ t o l e r a n c e ;

f r e e a n d n u l l ( ( char ∗ ∗ ) &p r o b l e m i n f o . rhsL ) ;

}

r c n t = n u m e n t i t i e s ∗ n u m a t t r i b u t e s ; /∗ number o f rows

return 0 ;

} /∗ end a l l o c a t e M e m o r y ∗/

R Code

PCA-L1

R/InterfacePcaL1.R

p c a l 1 <− function (X, projDim = 1 , c e n t e r=FALSE, s c o r e = FALSE , d i s p e r s i o n E x p = FALSE)

{

i f ( c l a s s (X) != ” m a t r i x ” ) {

i f ( c l a s s (X) == ” d a t a . frame ” ) X <− as . matrix (X)

e l s e

X <− matrix (X, ncol = 1 ) }

i f ( c e n t e r ) {

mymedian <− apply (X, 2 , median )

myMedMat <− matrix ( rep ( mymedian , nrow(X) ) , ncol = ncol (X) , byrow=TRUE)

X <− X−myMedMat }

A <− t (X)

X <− X[ apply ( abs (X) , 1 ,sum) > 0 , ] # g e t r i d o f o r i g i n p o i n t s f o r a l g o r i t h m

X <− t (X)

pcLen <− projDim ∗ (nrow(X) )

s o l <− .C( ” PcaL1 R” , as . double (X) , as . integer (dim(X) ) , as . integer ( projDim ) , PCs = double ( pcLen ) , PACKAGE=”

PCA3” )

PCS <− s o l [ [ ”PCs” ] ]

dim(PCS) <− c (nrow(X) , projDim ) f i n a l <− l i s t ( PCs =PCS)

SCORE = t (A) %∗% PCS i f ( s c o r e ) {

f i n a l [ ” S c o r e ” ] <− l i s t ( S c o r e = SCORE)

}

)

mymedian <− apply (X, 2 , median )

index . return=TRUE)

s o l u t i o n $ S c o r e s <− s o l u t i o n $ S c o r e s [ , s o $ i x ] s o l u t i o n $PC <− s o l u t i o n $PC [ , s o $ i x ]

s o l u t i o n $ P r o p L 1 D i s p e r s i o n <− s o r t ( s o l u t i o n $ P r o p L 1 D i s p e r s i o n , d e c r e a s i n g=TRUE)

as . l i s t ( s o l u t i o n ) }

Related documents