文章目錄
本篇分別有主成分分析,層次分析,聚類分析,因子分析的簡單介紹以及在MATLAB(2018a)上使用的簡單介紹 ( 附源碼 )
主成分分析
主成分分析-百度百科
簡單講:主成分分析就是取出幾個較少的變量盡可能多地反映原來變量的信息
(只看主要對結果有影的幾個變量)
主成分分析適用于數學建模中篩選出少量變量對結果造成主要影響并用函數關系表征的情況
%% 主成分分析 (降維)
clc, clearload example_1.txt %數據導入(數據要求:前幾列為自變量,最后一列為因變量)
data = example_1;[m, n] = size(data);
num = 3; % 選取的主成分的個數mu = mean(data);
sigma = std(data); %標準差
%z-score標準化方法適用于屬性A的最大值和最小值未知的情況,或有超出取值范圍的離群數據的情況
%標準化的新數據=(原數據-均值)/標準差
std_data = zscore(data);
b = std_data(: , 1:end-1); % 四個變量x1, x2, x3, x4
r = cov(b); % 變量的協方差矩陣% 運用協方差矩陣進行PCA
[PC, latent, explained] = pcacov(r); %返回主成分(PC)、協方差矩陣X的特征值 (latent)和每個特征向量表征在觀測量總方差中所占的百分數(explained)
% 新的主成分z1 = PC(1,1)*x1 + PC(2,1)*x2 + PC(3,1)*x3 + PC(4,1)*x4 , z2 = ...
f = repmat(sign(sum(PC)), size(PC, 1), 1); %sum(PC)表示對矩陣PC的列求和
PC = PC .* f;%1.普通的最小二乘法回歸
regress_args_b = [ones(m, 1), b] \ std_data(:, end); %標準化數據的回歸方程系數
bzh = mu ./ sigma;
% 原始數據的常數項
ch10 = mu(end) - bzh(1:end-1) * regress_args_b(2:end) * sigma(end);
fr_1 = regress_args_b(2:end); fr_1 = fr_1';
% 原始數據的自變量的系數
ch1 = fr_1 ./ sigma(1:end-1) * sigma(end);
% 此時模型為 y = ch10 + ch1[1]*x1 + ch1[2] * x2 + ch1[3] * x3 + ch1[4] * x4
% 計算均方誤差
check1 = sqrt(sum( (data(:, 1:end-1) * ch1' + ch10 - data(:, end)) .^2 ) / (m - n))%2.主成分回歸模型
pca_val = b * PC(:, 1:num);
%主成分數據的回歸方程系數
regress_args_pca = [ones(m, 1), pca_val] \ std_data(:, end);
beta = PC(:, 1:num) * regress_args_pca(2:num+1); %標準化數據的回歸方程系數
% 原始數據的常數項
ch20 = mu(end) - bzh(1:end-1) * beta * sigma(end);
fr_2 = beta';
% 原始數據的自變量的系數
ch2 = fr_2 ./ sigma(1:end-1) * sigma(end);
% 此時模型為 y = ch20 + ch2[1]*x1 + ch2[2] * x2 + ch2[3] * x3 + ch2[4] * x4
% 計算均方誤差
check2 = sqrt(sum( (data(:, 1:end-1) * ch2' + ch20 - data(:, end)) .^2 ) / (m - num - 1))
層次分析
層次分析-百度百科
簡單講:就是自己將兩兩影響因素作重要性對比得出判斷矩陣,然后得出各個影響因素的權重
層次分析適用于數學建模多個變量對結果不同影響程度并用函數關系表征的情況
%層次分析法(AHP)
disp('請輸入判斷矩陣A(n階)');
A = input('A=');
[n,n] = size(A);
x = ones(n,100);
y = ones(n,100);
m = zeros(1,100);
m(1) = max(x(:,1));
y(:,1) = x(:,1);
x(:,2) = A*y(:,1);
m(2) = max(x(:,2));
y(:,2) = x(:,2)/m(2);
p=0.0001; i=2; k=abs(m(2)-m(1));
while k>pi=i+1;x(:,i) = A*y(:,i-1);m(i) = max(x(:,i));y(:,i) = x(:,i)/m(i);k=abs(m(i)-m(i-1));
end
a = sum(y(:,i));
w = y(:,i)/a;
t = m(i);
disp(w);
%一致性檢驗
CI = (t-n)/(n-1);
RI = [0 0 0.52 0.89 1.12 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59];
CR = CI/RI(n);
if CR<0.10disp('此矩陣一致性可以接受!');disp('CI=');disp(CI);disp('CR=');disp(CR);
end
聚類分析
聚類分析-百度百科
簡單講:就是多個影響因素按不同聯系程度分類
%聚類分析
X; %X為導入數據的名稱(類型:數值矩陣)
X=X'; %將矩陣X轉置,按情況看是否需要此語句
Y=pdist(X); %X為要聚類的數組
SF=squareform(Y);
Z=linkage(Y,'average');
dendrogram(Z,0);
T=cluster(Z,'maxclust',3);
因子分析
因子分析-百度百科
可看作是主成分分析的推廣,涉及的計算與主成分分析很類似
%因子分析
clc,clear
load ssgs.txt %把原始數據保存在純文本文件ssgs.txt中
n=size(ssgs,1);
x=ssgs(:,[1:4]); y=ssgs(:,5); %分別提出自變量x1...x4和因變量x的值
x=zscore(x); %數據標準化
r=corrcoef(x) %求相關系數矩陣
[vec1,val,con1]=pcacov(r) %進行主成分分析的相關計算
f1=repmat(sign(sum(vec1)),size(vec1,1),1);
vec2=vec1.*f1; %特征向量正負號轉換
f2=repmat(sqrt(val)',size(vec2,1),1);
a=vec2.*f2 %求初等載荷矩陣
num=input('請選擇主因子的個數:'); %交互式選擇主因子的個數
am=a(:,[1:num]); %提出num個主因子的載荷矩陣
[bm,t]=rotatefactors(am,'method', 'varimax') %am旋轉變換,bm為旋轉后的載荷陣
bt=[bm,a(:,[num+1:end])]; %旋轉后全部因子的載荷矩陣,前兩個旋轉,后面不旋轉
con2=sum(bt.^2) %計算因子貢獻
check=[con1,con2'/sum(con2)*100]%該語句是領會旋轉意義,con1是未旋轉前的貢獻率
rate=con2(1:num)/sum(con2) %計算因子貢獻率
coef=inv(r)*bm %計算得分函數的系數
score=x*coef %計算各個因子的得分
weight=rate/sum(rate) %計算得分的權重
Tscore=score*weight' %對各因子的得分進行加權求和,即求各企業綜合得分
[STscore,ind]=sort(Tscore,'descend') %對企業進行排序
display=[score(ind,:)';STscore';ind'] %顯示排序結果
[ccoef,p]=corrcoef([Tscore,y]) %計算F與資產負債的相關系數
[d,dt,e,et,stats]=regress(Tscore,[ones(n,1),y]);%計算F與資產負債的方程
d,stats %顯示回歸系數,和相關統計量的值
總結
以上是生活随笔為你收集整理的数学建模MATLAB之分析法(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。