主成分分析(PCA)及其可视化——matlab
本文所用為matlab2016a?
matlab安裝:待更新
matlab基礎知識:待更新
如果本文內容已學會,可以看看python的哦
主成分分析(PCA)及其可視化——python_菜菜笨小孩的博客-CSDN博客
文章目錄
一、主成分分析的原理
二、主成分分析的基本思想
三、主成分分析步驟
1.主成分分析的步驟:
2.部分說明
(1)球形檢驗(Bartlett)
(2)KMO(Kaiser-Meyer-Olkin)統計量
(3)主成分分析的邏輯框圖?
四、編程實現思路
1.主成分向量投射圖
2.算法步驟
1.數據標準化
2.數據為標準化
五、matlab主成分代碼實現
1.讀取數據
2.得到相關矩陣
(1)數據標準化做法
(2)數據未標準化做法
3.求相關矩陣的特征值和相對應的特征向量(在此以協方差陣為例)
4.畫散點圖和折線圖
5.對特征值排序
6.求每個特征值的貢獻度
7.累計貢獻度??
8.選出主成分,并得出相對應的矩陣
9.畫色塊矩陣圖
完整代碼:
總結及所遇到的問題解決辦法:
一、主成分分析的原理
????????主成分分析是利用降維的思想,在損失很少信息的前提下把多個指標轉化為幾個綜合指標的多元統計方法。通常把轉化生成的綜合指標稱之為主成分,其中每個主成分都是原始變量的線性組合,且各個主成分之間互不相關,這就使得主成分比原始變量具有某些更優越的性能。這樣在研究復雜問題時就可以只考慮少數幾個主成分而不至于損失太多信息,從而更容易抓住主要矛盾,揭示事物內部變量之間的規律性,同時使問題得到簡化,提高分析效率。
?????????主成分分析正是研究如何通過原來變量的少數幾個線性組合來解釋原來變量絕大多數信息的一種多元統計方法。
二、主成分分析的基本思想
????????研究某一問題涉及的眾多變量之間有一定的相關性,就必然存在著起支配作用的共同因素,并根據這一點,通過對原始變量相關矩陣或協方差矩陣內部結構關系的研究,利用原始變量的線性組合形成幾個綜合指標(主成分),在保留原始變量主要信息的前提下起到降維與簡化問題的作用,使得在研究復雜問題時更容易抓住主要矛盾。????????
利用主成分分析得到的主成分與原始變量之間有如下基本關系:
????????1.每一個主成分都是各原始變量的線性組合
????????2.主成分的數目大大少于原始變量的數目
????????3.主成分保留了原始變量絕大多數信息
????????4.各主成分之間互不相關
三、主成分分析步驟
1.主成分分析的步驟:
????????1.根據研究問題選取初始分析變量;
????????2.根據初始變量特性判斷由協方差陣求主成分還是由相關陣求主成分(數據標準化的話需要用系數相關矩陣,數據未標準化則用協方差陣);
????????3.求協差陣或相關陣的特征根與相應標準特征向量;
????????4.判斷是否存在明顯的多重共線性,若存在,則回到第一步;
????????5.主成分分析的適合性檢驗
????????6.得到主成分的表達式并確定主成分個數,選取主成分;
????????7.結合主成分對研究問題進行分析并深入研究。
2.部分說明
?????????一組數據是否可以用主成分分析,必須做適合性檢驗。可以用球形檢驗和KMO統計量檢驗。
(1)球形檢驗(Bartlett)
????????球形檢驗的假設:
?????????????????H0:相關系數矩陣為單位陣(即變量不相關)
????????????????H1:相關系數矩陣不是單位陣(即變量間有相關關系)
(2)KMO(Kaiser-Meyer-Olkin)統計量
????????KMO統計量比較樣本相關系數與樣本偏相關系數,它用于檢驗樣本是否適于作主成分分析。
????????KMO的值在0,1之間,該值越大,則樣本數據越適合作主成分分析和因子分析。一般要求該值大于0.5,方可作主成分分析或者相關分析。
????????Kaiser在1974年給出了經驗原則:
????????????????0.9以上 ? ? ? 適合性很好
????????????????0.8~0.9 ? ? ? ?適合性良好
????????????????0.7~0.8 ? ? ? ?適合性中等
????????????????0.6~0.7 ? ? ? ?適合性一般
????????????????0.5~0.6 ? ? ? ?適合性不好
????????????????0.5以下 ? ? ? 不能接受的????????
(3)主成分分析的邏輯框圖?
四、編程實現思路
1.主成分向量投射圖
2.算法步驟
1.數據標準化
1.標準化的數據均值為0,標準差為1;就是原數據減去均值,再除以標準差(無偏估計)
?2.求相關系數矩陣
3、求協方差矩陣C的特征值和相對應的特征向量
u為C的特征向量,lamda為u的特征值
4、將特征向量按對應特征值大小從上到下按行排列成矩陣,取前k列組成矩陣P
5、Y=PX即為降維到k維后的數據
2.數據為標準化
1、對所有指標進行中心化:去均值
2、求協方差矩陣C
其中μ為指標的均值
3、求協方差矩陣C的特征值和相對應的特征向量
u為C的特征向量,lamda為u的特征值
4、將特征向量按對應特征值大小從上到下按行排列成矩陣,取前k列組成矩陣P
5、Y=PX即為降維到k維后的數據
五、matlab主成分代碼實現
1.讀取數據
此為讀取csv數據,括號內1,0;表示從第一行第一列讀取,matlab默認以0行,0列開始讀取
X= csvread('文件路徑',1,0); %讀取數據文件,第一行不讀取在此舉例一個數據 data 下面都是用此數據進行做:
data = [1,-0.2,0.3,0.8,-0.5-0.2,1,0.6,-0.7,0.20.3,0.6,1,0.5,-0.30.8,-0.7,0.5,1,0.7-0.5,0.2,-0.3,0.7,1]運行結果:
2.得到相關矩陣
(1)數據標準化做法
? ? ? ? 進行標準化:
z =zscore(data)運行結果:
?計算相關系數矩陣:
C = corr(z,'type','Pearson')?運行結果:
(2)數據未標準化做法
計算均值:
mapping.mean = mean(data, 1) %計算均值運行結果:
進行中心化不會改變協方差陣的值,中心化不是標準化哦!!:
data = data - repmat(mapping.mean, [size(data, 1) 1])%去均值?運行結果:
?計算協方差陣:
C = cov(data) %協方差矩陣運行結果:
3.求相關矩陣的特征值和相對應的特征向量(在此以協方差陣為例)
[M, lambda] = eig(C) %求C矩陣特征向量及特征值運行結果:
取出協方差陣所求的對角線上的特征值,這只是其中一種做法,下面還有第二種
y = diag(lambda) %取出特征值矩陣中的特征值運行結果:
?1時計算得到行數,2時計算得到列數,一個補充小知識點,嘻嘻嘻!!!
size(data,2) %讀取數據文件中的列數?運行結果:
4.畫散點圖和折線圖
這里求得是x軸的值,上面取出的特征值即為y軸的值!!!
x = [size(data,2):-1:1] %表示變量個數并倒寫出它們作為x軸 如 4,3,2,1運行結果:
?先畫的散點圖,x,y的值上面介紹了哦!!!
plot(x,y,'o') %繪制散點圖運行結果:
顯示上圖中的格格線為 grid on ;關閉為 grid off
grid on; %顯示格線運行結果:
?因為我想在同一張圖上畫散點圖和折線圖,所以調用 hold on
hold on; %不換畫布繼續在這張畫布上繪制?給坐標軸取名 ,你隨意,哈哈哈哈!!!
xlabel('x'); %x軸名稱 ylabel('y'); %y軸名稱運行結果:
?繪制折線圖,顏色為紅(’r‘) ,'lineWidth':線粗,這些基礎知識,正在寫,后續發布
plot(x,y,'-','Color','r','lineWidth',1) %繪制折線圖運行結果:
5.對特征值排序
在此求出的 lambda 即為上方的 x,ind 即為 上方的 y;descend 為降序,默認升序
[lambda, ind] = sort(diag(lambda), 'descend') %排序運行結果:
6.求每個特征值的貢獻度
即為每個特征值除以所有特征值的和,即占比
lambda=lambda./sum(lambda) %特征值的貢獻度?運行結果:
7.累計貢獻度??
計算累計貢獻度
lambda=cumsum(lambda) %累計貢獻度運行結果:
選出累計貢獻度小于 85%之前的指標
為什么要選>85%呢?是為了方便后面的索引
k=find(lambda>0.85) %選出貢獻率達到85的指標前K個?運行結果:
?讓我們看一下k(1)等于多少???
k(1)運行結果:
那 1:k(1) 呢,又是多少???
1:k(1)?運行結果:
但我們看上面累計貢獻度時符合條件<85%的只有一個,所以我們下方選主成分應該有有變化?
8.選出主成分,并得出相對應的矩陣
選出前K列的特征向量矩陣
M = M(:,ind(1:k(1)-1) %%取前k列 M = (-1)*M運行結果:
?得到降維后的X
mappedX = data * M %降維后的X運行結果:
9.畫色塊矩陣圖
通過此可以再次確定,下面畫圖需要設置的x,y的行數
mapping.M = M %映射的基運行結果:
?設置色塊矩陣圖x,y軸所標注的名稱
XVarNames={'A'}; %個數等于上面基的列數 YVarNames={'A','B','C','D','E'}; %個數等于上面基的行數數值矩陣圖代碼:
matrixplot(M,'FillStyle','nofill','XVarNames',XVarNames,'YVarNames',YVarNames)運行結果:
%色塊顏色表示 matrixplot(M,'XVarNames',XVarNames,'YVarNames',YVarNames,'DisplayOpt','off','FigSize','Auto','ColorBar','on');運行結果:
完整代碼:
如不想每一步都有結果出現,請在每行代碼最后加上英文版 ;
data = [1,-0.2,0.3,0.8,-0.5-0.2,1,0.6,-0.7,0.20.3,0.6,1,0.5,-0.30.8,-0.7,0.5,1,0.7-0.5,0.2,-0.3,0.7,1]% z =zscore(data) % C = corr(z,'type','Pearson')mapping.mean = mean(data, 1) %計算均值 data = data - repmat(mapping.mean, [size(data, 1) 1])%去均值 C = cov(data) %協方差矩陣 [M, lambda] = eig(C) %求C矩陣特征向量及特征值y = diag(lambda) %取出特征值矩陣中的特征值 size(data,2) %讀取數據文件中的列數 x = [size(data,2):-1:1] %表示變量個數并倒寫出它們作為x軸 如 4,3,2,1 plot(x,y,'o') %繪制散點圖 grid on %顯示格線 hold on; %不換畫布繼續在這張畫布上繪制 xlabel('x'); %x軸名稱 ylabel('y'); %y軸名稱 plot(x,y,'-','Color','r','lineWidth',1); %繪制折線圖[lambda, ind] = sort(diag(lambda), 'descend') %排序 lambda=lambda./sum(lambda) lambda=cumsum(lambda)k=find(lambda>0.85) %選出貢獻率達到95的指標前K個 M = M(:,ind(1:k(1)-1) %%取前k列 M = (-1)*M mappedX = data * M %降維后的Xmapping.M = M %映射的基 XVarNames={'A'}; YVarNames={'A','B','C','D','E'}; matrixplot(M,'FillStyle','nofill','XVarNames',XVarNames,'YVarNames',YVarNames); matrixplot(M,'XVarNames',XVarNames,'YVarNames',YVarNames,'DisplayOpt','off','FigSize','Auto','ColorBar','on');總結及所遇到的問題解決辦法:
因為我最近在學主成分,就整理了一些matlab和python的主成分代碼,今天先發布matlab的,python的稍后發布(其實還沒開始,最近要考期末了,很難受!!!)
在此學習中,遇到最頭疼的的問題就行,?matrixplot 無法應用,需要自己寫入這個庫才行,最終經過不懈努力解決了;還有在寫色塊矩陣圖之前,我先寫的熱力圖,研究半天沒有學會,它那個顯示的色塊一點也不好看,于是才有了matrixplot,源碼我先放文末,具體的解釋,我也會稍后發布,非常感謝大家的支持,但如果我的文章有錯誤,請大家多多指出!!謝謝大家
matrixplot源碼:
function matrixplot(data,varargin)[0.7,0.7,0.7],'FigShap','s','FigSize','Auto','ColorBar','on'); % matrixplot(x,'TextColor','k','FigShap','d','FigSize','Full','ColorBar','on','FigStyle','Triu'); % XVarNames = {'xiezhh','heping','keda','tust','tianjin'}; % matrixplot(x,'FigShap','e','FigSize','Auto','ColorBar','on','XVarNames',XVarNames,'YVarNames',XVarNames); % 對第一個輸入參數類型進行判斷 if ~ismatrix(data) || ~isreal(data)error('輸入參數類型不匹配:第一個輸入參數應為實值矩陣'); end% 解析成對出現的參數名/參數值 [FigShape,FigSize,FigStyle,FillStyle,DisplayOpt,TextColor,XVarNames,...YVarNames,ColorBar,GridOpt] = parseInputs(varargin{:});% 產生網格數據 [m,n] = size(data); [x,y] = meshgrid(0:n,0:m); data = data(:); maxdata = nanmax(data); mindata = nanmin(data); rangedata = maxdata - mindata; if isnan(rangedata)warning('MATLAB:warning1','請檢查您輸入的矩陣是否合適!');return; end z = zeros(size(x))+0.2; sx = x(1:end-1,1:end-1)+0.5; sy = y(1:end-1,1:end-1)+0.5;if strncmpi(FigStyle,'Tril',4)z(triu(ones(size(z)),2)>0) = NaN;sx(triu(ones(size(sx)),1)>0) = NaN; elseif strncmpi(FigStyle,'Triu',4)z(tril(ones(size(z)),-2)>0) = NaN;sx(tril(ones(size(sx)),-1)>0) = NaN; end sx = sx(:); sy = sy(:); id = isnan(sx) | isnan(data); sx(id) = []; sy(id) = []; data(id) = [];if isempty(XVarNames)XVarNames = strcat('X',cellstr(num2str((1:n)'))); elseif (iscell(XVarNames) && (numel(XVarNames) ~= n)) || (~iscell(XVarNames) && (size(XVarNames,1) ~= n))error('X軸方向變量名應為字符串矩陣或字符串元胞數組,其長度與輸入矩陣的列數相同');end end if isempty(YVarNames)YVarNames = strcat('Y',cellstr(num2str((1:m)'))); elseif (iscell(YVarNames) && (numel(YVarNames) ~= m)) || (~iscell(YVarNames) && (size(YVarNames,1) ~= m))error('Y軸方向變量名應為字符串矩陣或字符串元胞數組,其長度與輸入矩陣的行數相同');end end% 繪圖 figure('color','w',...'units','normalized',...'pos',[0.289165,0.154948,0.409956,0.68099]); axes('units','normalized','pos',[0.1,0.022,0.89,0.85]); if strncmpi(GridOpt,'On',2)mesh(x,y,z,...'EdgeColor',[0.7,0.7,0.7],...'FaceAlpha',0,...'LineWidth',1); % 參考網格線 end hold on; axis equal; axis([-0.1,n+0.1,-0.1,m+0.1,-0.5,0.5]); view(2); % 設置X軸和Y軸刻度位置及標簽 set(gca,'Xtick',(1:n)-0.5,...'XtickLabel',XVarNames,...'Ytick',(1:m)-0.5,...'YtickLabel',YVarNames,...'XAxisLocation','top',...'YDir','reverse',...'Xcolor',[0.7,0.7,0.7],...'Ycolor',[0.7,0.7,0.7],...'TickLength',[0,0]); axis off% 繪制填充色塊 if strncmpi(FillStyle,'Fill',3)MyPatch(sx',sy',data',FigShape,FigSize); end% 顯示數值文本信息 if strncmpi(DisplayOpt,'On',2)str = num2str(data,'%4.2f');scale = 0.1*max(n/m,1)/(max(m,n)^0.55);if strncmpi(TextColor,'Auto',3)ColorMat = get(gcf,'ColorMap');nc = size(ColorMat,1);cid = fix(mapminmax(data',0,1)*nc)+1;cid(cid<1) = 1;cid(cid>nc) = nc;TextColor = ColorMat(cid,:);for i = 1:numel(data)text(sx(i),sy(i),0.1,str(i,:),...'FontUnits','normalized',...'FontSize',scale,...'fontweight','bold',...'HorizontalAlignment','center',...'Color',TextColor(i,:));endelsetext(sx,sy,0.1*ones(size(sx)),str,...'FontUnits','normalized',...'FontSize',scale,...'fontweight','bold',...'HorizontalAlignment','center',...'Color',TextColor);end end% 設置X軸和Y軸刻度標簽的縮進方式 MyTickLabel(gca,FigStyle);% 添加顏色條 if strncmpi(ColorBar,'On',2)if any(strncmpi(FigStyle,{'Auto','Triu'},4))colorbar('Location','EastOutside');elsecolorbar('Location','SouthOutside');end end end% --------------------------------------------------- % 調整坐標軸刻度標簽子函數 % --------------------------------------------------- function MyTickLabel(ha,tag)% 根據顯示范圍自動調整坐標軸刻度標簽的函數 % ha 坐標系句柄值 % tag 調整坐標軸刻度標簽的標識字符串,可用取值如下: % 'Auto' --- 將x軸刻度標簽旋轉90度,y軸刻度標簽不作調整 % 'Tril' --- 將x軸刻度標簽旋轉90度,并依次縮進,y軸刻度標簽不作調整 % 'Triu' --- 將x軸刻度標簽旋轉90度,y軸刻度標簽依次縮進 % Example: % MyTickLabel(gca,'Tril'); if ~ishandle(ha)warning('MATLAB:warning2','第一個輸入參數應為坐標系句柄');return; endif ~strcmpi(get(ha,'type'),'axes')warning('MATLAB:warning3','第一個輸入參數應為坐標系句柄');return; end axes(ha); xstr = get(ha,'XTickLabel'); xtick = get(ha,'XTick'); xl = xlim(ha); ystr = get(ha,'YTickLabel'); ytick = get(ha,'YTick'); yl = ylim(ha); set(ha,'XTickLabel',[],'YTickLabel',[]); x = zeros(size(ytick)) + xl(1) - range(xl)/30; y = zeros(size(xtick)) + yl(1) - range(yl)/70; nx = numel(xtick); ny = numel(ytick);if strncmpi(tag,'Tril',4)y = y + (1:nx) - 1; elseif strncmpi(tag,'Triu',4)x = x + (1:ny) - 1; endtext(xtick,y,xstr,...'rotation',90,...'Interpreter','none',...'color','r',...'HorizontalAlignment','left'); text(x,ytick,ystr,...'Interpreter','none',...'color','r',...'HorizontalAlignment','right'); end% --------------------------------------------------- % 根據散點數據繪制3維色塊圖子函數 % --------------------------------------------------- function MyPatch(x,y,z,FigShape,FigSize) % 根據散點數據繪制3維色塊圖 % MyPatch(x,y,z,FigShape,FigSize) x,y,z是實值數組,用來指定色塊中心點三維 % 坐標。FigShape是字符串變量,用來指定色塊形狀。 % FigSize是字符串變量,用來指定色塊大小。 % % Example: % x = rand(10,1); % y = rand(10,1); % z = rand(10,1); % MyPatch(x,y,z,'s','Auto'); %% 輸入參數類型判斷 if nargin < 3error('至少需要三個輸入參數'); end if ~isreal(x) || ~isreal(y) || ~isreal(z)error('前三個輸入應為實值數組'); endn = numel(z); if numel(x) ~= n || numel(y) ~= nerror('坐標應等長'); endif strncmpi(FigSize,'Auto',3) && ~strncmpi(FigShape,'Ellipse',1)id = (z == 0);x(id) = [];y(id) = [];z(id) = []; end if isempty(z)return; end% 求色塊頂點坐標 rab1 = ones(size(z)); maxz = max(abs(z)); if maxz == 0maxz = 1; end rab2 = abs(z)/maxz; if strncmpi(FigShape,'Square',1)% 方形if strncmpi(FigSize,'Full',3)r = rab1;elser = sqrt(rab2);endSquareVertices(x,y,z,r); elseif strncmpi(FigShape,'Circle',1)% 圓形if strncmpi(FigSize,'Full',3)r = 0.5*rab1;elser = 0.5*sqrt(rab2);endCircleVertices(x,y,z,r); elseif strncmpi(FigShape,'Ellipse',1)% 橢圓形a = 0.48 + rab2*(0.57-0.48);b = (1-rab2).*a;EllipseVertices(x,y,z,a,b); elseif strncmpi(FigShape,'Hexagon',1)% 六邊形if strncmpi(FigSize,'Full',3)r = 0.5*rab1;elser = 0.5*sqrt(rab2);endHexagonVertices(x,y,z,r); else% 表盤形if strncmpi(FigSize,'Full',3)r = 0.45*rab1;elser = 0.45*sqrt(rab2);endDialVertices(x,y,z,r); end end %-------------------------------------------------- % 求色塊頂點坐標并繪制色塊的子函數 %-------------------------------------------------- function SquareVertices(x,y,z,r) % 方形 hx = r/2; hy = hx; Xp = [x-hx;x-hx;x+hx;x+hx;x-hx]; Yp = [y-hy;y+hy;y+hy;y-hy;y-hy]; Zp = repmat(z,[5,1]); patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor','flat'); endfunction CircleVertices(x,y,z,r) % 圓形 t = linspace(0,2*pi,30)'; m = numel(t); Xp = repmat(x,[m,1])+cos(t)*r; Yp = repmat(y,[m,1])+sin(t)*r; Zp = repmat(z,[m,1]); patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor','flat'); endfunction EllipseVertices(x,y,z,a,b) % 橢圓形 t = linspace(0,2*pi,30)'; m = numel(t); t0 = -sign(z)*pi/4; t0 = repmat(t0,[m,1]); x0 = cos(t)*a; y0 = sin(t)*b; Xp = repmat(x,[m,1]) + x0.*cos(t0) - y0.*sin(t0); Yp = repmat(y,[m,1]) + x0.*sin(t0) + y0.*cos(t0); Zp = repmat(z,[m,1]); patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor','flat'); endfunction HexagonVertices(x,y,z,r) % 六邊形 t = linspace(0,2*pi,7)'; m = numel(t); Xp = repmat(x,[m,1])+cos(t)*r; Yp = repmat(y,[m,1])+sin(t)*r; Zp = repmat(z,[m,1]); patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor','flat'); endfunction DialVertices(x,y,z,r) % 表盤形 % 繪制表盤扇形 maxz = max(abs(z)); t0 = z*2*pi/maxz-pi/2; t0 = cell2mat(arrayfun(@(x)linspace(-pi/2,x,30)',t0,'UniformOutput',0)); m = size(t0,1); r0 = repmat(r,[m,1]); Xp = [x;repmat(x,[m,1]) + r0.*cos(t0);x]; Yp = [y;repmat(y,[m,1]) + r0.*sin(t0);y]; Zp = repmat(z,[m+2,1]); patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor',[0,0,0]);% 繪制表盤圓周 t = linspace(0,2*pi,30)'; m = numel(t); Xp = repmat(x,[m,1])+cos(t)*r; Yp = repmat(y,[m,1])+sin(t)*r; Zp = repmat(z,[m,1]); Xp = [Xp;flipud(Xp)]; Yp = [Yp;flipud(Yp)]; Zp = [Zp;flipud(Zp)]; patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor',[0,0,0]); end%-------------------------------------------------------------------------- % 解析輸入參數子函數1 %-------------------------------------------------------------------------- function [FigShape,FigSize,FigStyle,FillStyle,DisplayOpt,TextColor,...XVarNames,YVarNames,ColorBar,GridOpt] = parseInputs(varargin)if mod(nargin,2)~=0error('輸入參數個數不對,應為成對出現'); end pnames = {'FigShape','FigSize','FigStyle','FillStyle','DisplayOpt',...'TextColor','XVarNames','YVarNames','ColorBar','Grid'}; dflts = {'Square','Full','Auto','Fill','On','k','','','Off','On'}; [FigShape,FigSize,FigStyle,FillStyle,DisplayOpt,TextColor,XVarNames,...YVarNames,ColorBar,GridOpt] = parseArgs(pnames, dflts, varargin{:});validateattributes(FigShape,{'char'},{'nonempty'},mfilename,'FigShape'); validateattributes(FigSize,{'char'},{'nonempty'},mfilename,'FigSize'); validateattributes(FigStyle,{'char'},{'nonempty'},mfilename,'FigStyle'); validateattributes(FillStyle,{'char'},{'nonempty'},mfilename,'FillStyle'); validateattributes(DisplayOpt,{'char'},{'nonempty'},mfilename,'DisplayOpt'); validateattributes(TextColor,{'char','numeric'},{'nonempty'},mfilename,'TextColor'); validateattributes(XVarNames,{'char','cell'},{},mfilename,'XVarNames'); validateattributes(YVarNames,{'char','cell'},{},mfilename,'YVarNames'); validateattributes(ColorBar,{'char'},{'nonempty'},mfilename,'ColorBar'); validateattributes(GridOpt,{'char'},{'nonempty'},mfilename,'Grid'); if ~any(strncmpi(FigShape,{'Square','Circle','Ellipse','Hexagon','Dial'},1))error('形狀參數只能為Square, Circle, Ellipse, Hexagon, Dial 之一'); end if ~any(strncmpi(FigSize,{'Full','Auto'},3))error('圖形大小參數只能為Full, Auto 之一'); end if ~any(strncmpi(FigStyle,{'Auto','Tril','Triu'},4))error('圖形樣式參數只能為Auto, Tril, Triu 之一'); end if ~any(strncmpi(FillStyle,{'Fill','NoFill'},3))error('圖形填充樣式參數只能為Fill, NoFill 之一'); end if ~any(strncmpi(DisplayOpt,{'On','Off'},2))error('顯示數值參數只能為On,Off 之一'); end if ~any(strncmpi(ColorBar,{'On','Off'},2))error('顯示顏色條參數只能為On,Off 之一'); end if ~any(strncmpi(GridOpt,{'On','Off'},2))error('顯示網格參數只能為On,Off 之一'); end end%-------------------------------------------------------------------------- % 解析輸入參數子函數2 %-------------------------------------------------------------------------- function [varargout] = parseArgs(pnames,dflts,varargin) % Copyright 2010-2011 The MathWorks, Inc. % $Revision: 1.1.6.2 $ $Date: 2011/05/09 01:27:26 $ % Initialize some variables nparams = length(pnames); varargout = dflts; setflag = false(1,nparams); unrecog = {}; nargs = length(varargin);dosetflag = nargout>nparams; dounrecog = nargout>(nparams+1);% Must have name/value pairs if mod(nargs,2)~=0m = message('stats:internal:parseArgs:WrongNumberArgs');throwAsCaller(MException(m.Identifier, '%s', getString(m))); end% Process name/value pairs for j=1:2:nargspname = varargin{j};if ~ischar(pname)m = message('stats:internal:parseArgs:IllegalParamName');throwAsCaller(MException(m.Identifier, '%s', getString(m)));endmask = strncmpi(pname,pnames,length(pname)); % look for partial matchif ~any(mask)if dounrecog% if they've asked to get back unrecognized names/values, add this% one to the listunrecog((end+1):(end+2)) = {varargin{j} varargin{j+1}};continueelse% otherwise, it's an errorm = message('stats:internal:parseArgs:BadParamName',pname);throwAsCaller(MException(m.Identifier, '%s', getString(m)));endelseif sum(mask)>1mask = strcmpi(pname,pnames); % use exact match to resolve ambiguityif sum(mask)~=1m = message('stats:internal:parseArgs:AmbiguousParamName',pname);throwAsCaller(MException(m.Identifier, '%s', getString(m)));endendvarargout{mask} = varargin{j+1};setflag(mask) = true; end% Return extra stuff if requested if dosetflagvarargout{nparams+1} = setflag;if dounrecogvarargout{nparams+2} = unrecog;end end end總結
以上是生活随笔為你收集整理的主成分分析(PCA)及其可视化——matlab的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php post 丢失,php post
- 下一篇: 整数线性规划实现(matlab分枝界定法