PCA 주성분 분석 및 인자 분석 노트수학 모델링 시리즈

22118 단어 수학 모범
PCA 주성분 분석 및 인자 분석 노트수학 모델링 시리즈
이곳의 주성분 분석과 인자 분석은 두 가지 차원을 낮추는 방법이다.
언제 비트를 내려야 합니까?
한 견본에 집중된 견본을 정렬해야 할 때 여러 차원에서 이 견본들을 평가할 수 있으나 차원이 너무 많으면 변하지 않기 때문에 우리는 더욱 적은 차원으로 평가하고 평가의 정확도 손실을 최대한 줄일 수 있기를 바란다.
주성분 분석은 간단하게 말하면 평가 결과에 대한 기여도가 비교적 높은 몇 가지 차원을 직접 선택하거나 평가 결과에 대한 기여도가 비교적 낮은 몇 가지 차원을 직접 제거하는 것이다.(공식 참고) 인자분석은 이미 알고 있는 모든 차원을 바탕으로 수량이 더 적은 새로운 차원을 창조하여 평가하는 것이다.먼저 원시적인 한 그룹의 차원에 대해 관련성 분석을 하고 관련성이 높고 보존 관련성이 낮은 것을 합병한다.또는 원 차원 그룹을 대표할 수 있는 새로운 차원을 찾아내고 새로운 차원 그룹이 포함하지 않은 특색 부분을 보존할 수 있다.(방정식 참조)
1. 주성분 분석(PCA):
1) in R
데이터 요구: m∗n(표두 제외)의 행렬, 샘플 집합 크기는 m, 속성 개수는 n;또는 m개의 평가 목표가 있고 평가 인자 개수는 n이다.각 열의 헤더는 인자/속성 이름이고 각 줄의 헤더는 하나의 목표/샘플이 집중된 샘플이며 각 줄의 내용은 각 인자가 이 목표(의 어떤 평가)에 대한 기여값/이 샘플의 각 속성 값이다.
##      ##
industryData .csv("*C:\\Users\\lenovo\\Desktop\\1.csv*", header = TRUE, sep = ",")
X 1]

##             、     ##
industry.cor X)
industry.cor
industry.eig .cor)
industry.eig

##            ##
industry.pr X, cor = TRUE)
summary(industry.pr, loadings = TRUE)

##    ##
screeplot(industry.pr, type = "lines") #     
biplot(industry.pr, choices = 1:2) #     1     2       

##       ##
field = as.character(industryData[, 1]) #         
result = cbind(field, as.data.frame(scale(X))) #            
numOfCharacter 3 #      
industry.predict .pr) #        
result = cbind(result, industry.predict[,1:numOfCharacter]) #                      

##                  ##
varProportion in 1:length(varProportion))
{
  varProportion[i] .eig$values[i]/sum(industry.eig$values);
}

##            ##
totalScore .predict))
for (i in 1:length(totalScore))
{
  for (j in 1:length(varProportion))
  {
    totalScore[i] = totalScore[i] + varProportion[j] * industry.predict[i, j];
  }
}
result = cbind(result, totalScore) #           

##                ##
library(plyr)
resultDescent = arrange(result, desc(totalScore))
output .character(resultDescent$field), as.data.frame.numeric(resultDescent$totalScore))
names(output) "field", "total score")
output

2) in matlab
데이터 요구: m∗n(표두 제외)의 행렬, 샘플집 크기는 n, 속성 개수는 m;또는 n개의 평가 목표가 있고 평가 인자 개수는 m이다.
%    
x=xlsread(‘*data*’);

%     
sd=std(x);

%        
n=size(x,1);
jj=ones(n,1);
jj=jj*sd;
x=x./jj;

% x         
[t,score,r]=princomp(x);

%%       2 
%% 1
x=score(:,1:2);%       (   )
idx=kmeans(x,5);% k-means   (  5 )
%  
str=num2str([1:n]');
figure(1),clf
plot(x(:,1),x(:,2),'o')
text(x(:,1),x(:,2)+.5,str,'fontsize',12)
hold on
for i=1:n
    if idx(i)==1
        plot(x(i,1),x(i,2),'o','markerfacecolor','b')
    elseif idx(i)==2
        plot(x(i,1),x(i,2),'o','markerfacecolor','g')
    elseif idx(i)==3
        plot(x(i,1),x(i,2),'o','markerfacecolor','c')
    elseif idx(i)==4
        plot(x(i,1),x(i,2),'o','markerfacecolor','r')
    else
        plot(x(i,1),x(i,2),'o','markerfacecolor','m')
    end
end

%% 2
x=score(:,1:3);%       (   )
x(:,3)=x(:,3)-min(x(:,3));
idx=kmeans(x,4);
%  (3D)
str=num2str([1:n]');
figure(1),clf
plot3(x(:,1),x(:,2),x(:,3),'o')
stem3(x(:,1),x(:,2),x(:,3))
text(x(:,1),x(:,2),x(:,3)+.5,str,'fontsize',12)
hold on
for i=1:n
    if idx(i)==1
        plot3(x(i,1),x(i,2),x(i,3),'o','markerfacecolor','b')
    elseif idx(i)==2
        plot3(x(i,1),x(i,2),x(i,3),'o','markerfacecolor','g')
    elseif idx(i)==3
        plot3(x(i,1),x(i,2),x(i,3),'o','markerfacecolor','c')    
    else
        plot3(x(i,1),x(i,2),x(i,3),'o','markerfacecolor','m')
    end
end
xlabel('PC1'),ylabel('PC2'),zlabel('PC3')  

2. 인자 분석:
1) in R
##      ##
economicData read.csv("C:\\Users\\lenovo\\Desktop\\6.csv", header = TRUE, sep = ",")
X 1]

##          ##
economic.cor ##      ,        ##
library(psych)
scree(X)

##           ##
numOfFactor 2
fa.varimax "varimax", fm = "pa", scores = T)
fa.varimax

##       ##
field = as.character(economicData[, 1]) 
#         
result = cbind(field, as.data.frame(scale(X))) 
#    , 1        ,           

##            ##
weight #          
weight
for (k in 1:ncol(weight))
{
  totalScore for (i in 1:nrow(X))
  {
    for (j in 1:ncol(X))
    {
      totalScore[i] = totalScore[i] + weight[j, k] * result[i, j+1];
    }
  }
  result = cbind(result, totalScore);
  colnames(result)[1+ncol(X)+k] "y", as.character(k), sep = "");
}

##             ##
library(plyr)
output = cbind(result$field, result$y1) #y1           
output = as.data.frame(output)
colnames(output) "field", "y1") #field    , y1     
output = arrange(output, desc(y1)) #y1     
output

2) in matlab
%%                


%%        PHO
PHO = [1 0.79 0.36 0.76 0.25 0.51
0.79 1 0.31 0.55 0.17 0.35
0.36 0.31 1 0.35 0.64 0.58
0.76 0.55 0.35 1 0.16 0.38
0.25 0.17 0.64 0.16 1 0.63
0.51 0.35 0.58 0.38 0.63 1
];

%%  factoran               

%%         ,      ,      2,          0,       
[lambda,psi,T] = factoran(PHO,2,'xtype','covariance','delta',0,'rotate','none')

%      ,           
%  
head = {'  ', '  f1', '  f2'};
%   
varname = {'  ','  ','  ','   ','  ','  ','',''}';
Contribut = 100*sum(lambda.^2)/6; %      ,               
CumCont = cumsum(Contribut); %        
%      ,             ,      
result1 = num2cell([lambda; Contribut; CumCont]);
%        ,      
result1 = [head; varname, result1]


%%         ,      ,      2,          0,
%      (       )

[lambda,psi,T] =factoran(PHO,2,'xtype','covariance','delta',0)
Contribut = 100*sum(lambda.^2)/6 %     ,               
CumCont = cumsum(Contribut) %       


%%         ,      ,      3,          0,
%       (       )
[lambda,psi,T] = factoran(PHO,3,'xtype','covariance','delta',0)
Contribut = 100*sum(lambda.^2)/6 %      ,               
CumCont = cumsum(Contribut) %        

결과 1
lambda =

    1.0000   -0.0000
    0.7900   -0.0292
    0.3600    0.6574
    0.7600    0.0004
    0.2500    0.8354
    0.5100    0.6026


psi =

    0.0000
    0.3750
    0.4382
    0.4223
    0.2396
    0.3768


T =

     1     0
     0     1


result1 = 

    '  '         '  f1'       '  f2'       
    '  '         [ 1.0000]    [-2.1042e-06]
    '  '         [ 0.7900]    [    -0.0292]
    '  '         [ 0.3600]    [     0.6574]
    '   '        [ 0.7600]    [ 3.6695e-04]
    '  '         [ 0.2500]    [     0.8354]
    '  '         [ 0.5100]    [     0.6026]
    ''      [44.2317]    [    24.8999]
    ''    [44.2317]    [    69.1316]

결과 2
 lambda =

    0.9731    0.2304
    0.7755    0.1536
    0.1989    0.7226
    0.7395    0.1755
    0.0508    0.8705
    0.3574    0.7039

psi =

    0.0000
    0.3750
    0.4382
    0.4223
    0.2396
    0.3768


T =

    0.9731    0.2304
   -0.2304    0.9731


Contribut =

   37.7496   31.3820


CumCont =

   37.7496   69.1316

결과 3
lambda =

    0.2288    0.9151    0.3320
    0.1546    0.7554    0.1909
    0.7240    0.1431    0.1909
    0.1614    0.4768    0.8638
    0.8740    0.0584   -0.0103
    0.7010    0.3376    0.1226


psi =

    0.0000
    0.3690
    0.4188
    0.0005
    0.2325
    0.3795


T =

    0.2288    0.9151    0.3320
    0.9733   -0.2217   -0.0594
   -0.0192   -0.3367    0.9414


Contribut =

   31.3629   29.5540   15.7400


CumCont =

   31.3629   60.9169   76.6569

Reference
R부분: 여지 작성 matlab 부분 정리:http://www.ilovematlab.cn/thread-203081-1-1.html http://www.mianfeiwendang.com/doc/a750344524f07a2148591755
본문은 하문대학 여지대비대에서 편찬하였다.

좋은 웹페이지 즐겨찾기