主成分分析(PCA)及其可视化——matlab
本文所用為matlab2016a?
matlab安裝:待更新
matlab基礎(chǔ)知識(shí):待更新
如果本文內(nèi)容已學(xué)會(huì),可以看看python的哦
主成分分析(PCA)及其可視化——python_菜菜笨小孩的博客-CSDN博客
文章目錄
一、主成分分析的原理
二、主成分分析的基本思想
三、主成分分析步驟
1.主成分分析的步驟:
2.部分說明
(1)球形檢驗(yàn)(Bartlett)
(2)KMO(Kaiser-Meyer-Olkin)統(tǒng)計(jì)量
(3)主成分分析的邏輯框圖?
四、編程實(shí)現(xiàn)思路
1.主成分向量投射圖
2.算法步驟
1.數(shù)據(jù)標(biāo)準(zhǔn)化
2.數(shù)據(jù)為標(biāo)準(zhǔn)化
五、matlab主成分代碼實(shí)現(xiàn)
1.讀取數(shù)據(jù)
2.得到相關(guān)矩陣
(1)數(shù)據(jù)標(biāo)準(zhǔn)化做法
(2)數(shù)據(jù)未標(biāo)準(zhǔn)化做法
3.求相關(guān)矩陣的特征值和相對(duì)應(yīng)的特征向量(在此以協(xié)方差陣為例)
4.畫散點(diǎn)圖和折線圖
5.對(duì)特征值排序
6.求每個(gè)特征值的貢獻(xiàn)度
7.累計(jì)貢獻(xiàn)度??
8.選出主成分,并得出相對(duì)應(yīng)的矩陣
9.畫色塊矩陣圖
完整代碼:
總結(jié)及所遇到的問題解決辦法:
一、主成分分析的原理
????????主成分分析是利用降維的思想,在損失很少信息的前提下把多個(gè)指標(biāo)轉(zhuǎn)化為幾個(gè)綜合指標(biāo)的多元統(tǒng)計(jì)方法。通常把轉(zhuǎn)化生成的綜合指標(biāo)稱之為主成分,其中每個(gè)主成分都是原始變量的線性組合,且各個(gè)主成分之間互不相關(guān),這就使得主成分比原始變量具有某些更優(yōu)越的性能。這樣在研究復(fù)雜問題時(shí)就可以只考慮少數(shù)幾個(gè)主成分而不至于損失太多信息,從而更容易抓住主要矛盾,揭示事物內(nèi)部變量之間的規(guī)律性,同時(shí)使問題得到簡(jiǎn)化,提高分析效率。
?????????主成分分析正是研究如何通過原來變量的少數(shù)幾個(gè)線性組合來解釋原來變量絕大多數(shù)信息的一種多元統(tǒng)計(jì)方法。
二、主成分分析的基本思想
????????研究某一問題涉及的眾多變量之間有一定的相關(guān)性,就必然存在著起支配作用的共同因素,并根據(jù)這一點(diǎn),通過對(duì)原始變量相關(guān)矩陣或協(xié)方差矩陣內(nèi)部結(jié)構(gòu)關(guān)系的研究,利用原始變量的線性組合形成幾個(gè)綜合指標(biāo)(主成分),在保留原始變量主要信息的前提下起到降維與簡(jiǎn)化問題的作用,使得在研究復(fù)雜問題時(shí)更容易抓住主要矛盾。????????
利用主成分分析得到的主成分與原始變量之間有如下基本關(guān)系:
????????1.每一個(gè)主成分都是各原始變量的線性組合
????????2.主成分的數(shù)目大大少于原始變量的數(shù)目
????????3.主成分保留了原始變量絕大多數(shù)信息
????????4.各主成分之間互不相關(guān)
三、主成分分析步驟
1.主成分分析的步驟:
????????1.根據(jù)研究問題選取初始分析變量;
????????2.根據(jù)初始變量特性判斷由協(xié)方差陣求主成分還是由相關(guān)陣求主成分(數(shù)據(jù)標(biāo)準(zhǔn)化的話需要用系數(shù)相關(guān)矩陣,數(shù)據(jù)未標(biāo)準(zhǔn)化則用協(xié)方差陣);
????????3.求協(xié)差陣或相關(guān)陣的特征根與相應(yīng)標(biāo)準(zhǔn)特征向量;
????????4.判斷是否存在明顯的多重共線性,若存在,則回到第一步;
????????5.主成分分析的適合性檢驗(yàn)
????????6.得到主成分的表達(dá)式并確定主成分個(gè)數(shù),選取主成分;
????????7.結(jié)合主成分對(duì)研究問題進(jìn)行分析并深入研究。
2.部分說明
?????????一組數(shù)據(jù)是否可以用主成分分析,必須做適合性檢驗(yàn)。可以用球形檢驗(yàn)和KMO統(tǒng)計(jì)量檢驗(yàn)。
(1)球形檢驗(yàn)(Bartlett)
????????球形檢驗(yàn)的假設(shè):
?????????????????H0:相關(guān)系數(shù)矩陣為單位陣(即變量不相關(guān))
????????????????H1:相關(guān)系數(shù)矩陣不是單位陣(即變量間有相關(guān)關(guān)系)
(2)KMO(Kaiser-Meyer-Olkin)統(tǒng)計(jì)量
????????KMO統(tǒng)計(jì)量比較樣本相關(guān)系數(shù)與樣本偏相關(guān)系數(shù),它用于檢驗(yàn)樣本是否適于作主成分分析。
????????KMO的值在0,1之間,該值越大,則樣本數(shù)據(jù)越適合作主成分分析和因子分析。一般要求該值大于0.5,方可作主成分分析或者相關(guān)分析。
????????Kaiser在1974年給出了經(jīng)驗(yàn)原則:
????????????????0.9以上 ? ? ? 適合性很好
????????????????0.8~0.9 ? ? ? ?適合性良好
????????????????0.7~0.8 ? ? ? ?適合性中等
????????????????0.6~0.7 ? ? ? ?適合性一般
????????????????0.5~0.6 ? ? ? ?適合性不好
????????????????0.5以下 ? ? ? 不能接受的????????
(3)主成分分析的邏輯框圖?
四、編程實(shí)現(xiàn)思路
1.主成分向量投射圖
2.算法步驟
1.數(shù)據(jù)標(biāo)準(zhǔn)化
1.標(biāo)準(zhǔn)化的數(shù)據(jù)均值為0,標(biāo)準(zhǔn)差為1;就是原數(shù)據(jù)減去均值,再除以標(biāo)準(zhǔn)差(無偏估計(jì))
?2.求相關(guān)系數(shù)矩陣
3、求協(xié)方差矩陣C的特征值和相對(duì)應(yīng)的特征向量
u為C的特征向量,lamda為u的特征值
4、將特征向量按對(duì)應(yīng)特征值大小從上到下按行排列成矩陣,取前k列組成矩陣P
5、Y=PX即為降維到k維后的數(shù)據(jù)
2.數(shù)據(jù)為標(biāo)準(zhǔn)化
1、對(duì)所有指標(biāo)進(jìn)行中心化:去均值
2、求協(xié)方差矩陣C
其中μ為指標(biāo)的均值
3、求協(xié)方差矩陣C的特征值和相對(duì)應(yīng)的特征向量
u為C的特征向量,lamda為u的特征值
4、將特征向量按對(duì)應(yīng)特征值大小從上到下按行排列成矩陣,取前k列組成矩陣P
5、Y=PX即為降維到k維后的數(shù)據(jù)
五、matlab主成分代碼實(shí)現(xiàn)
1.讀取數(shù)據(jù)
此為讀取csv數(shù)據(jù),括號(hào)內(nèi)1,0;表示從第一行第一列讀取,matlab默認(rèn)以0行,0列開始讀取
X= csvread('文件路徑',1,0); %讀取數(shù)據(jù)文件,第一行不讀取在此舉例一個(gè)數(shù)據(jù) data 下面都是用此數(shù)據(jù)進(jìn)行做:
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]運(yùn)行結(jié)果:
2.得到相關(guān)矩陣
(1)數(shù)據(jù)標(biāo)準(zhǔn)化做法
? ? ? ? 進(jìn)行標(biāo)準(zhǔn)化:
z =zscore(data)運(yùn)行結(jié)果:
?計(jì)算相關(guān)系數(shù)矩陣:
C = corr(z,'type','Pearson')?運(yùn)行結(jié)果:
(2)數(shù)據(jù)未標(biāo)準(zhǔn)化做法
計(jì)算均值:
mapping.mean = mean(data, 1) %計(jì)算均值運(yùn)行結(jié)果:
進(jìn)行中心化不會(huì)改變協(xié)方差陣的值,中心化不是標(biāo)準(zhǔn)化哦!!:
data = data - repmat(mapping.mean, [size(data, 1) 1])%去均值?運(yùn)行結(jié)果:
?計(jì)算協(xié)方差陣:
C = cov(data) %協(xié)方差矩陣運(yùn)行結(jié)果:
3.求相關(guān)矩陣的特征值和相對(duì)應(yīng)的特征向量(在此以協(xié)方差陣為例)
[M, lambda] = eig(C) %求C矩陣特征向量及特征值運(yùn)行結(jié)果:
取出協(xié)方差陣所求的對(duì)角線上的特征值,這只是其中一種做法,下面還有第二種
y = diag(lambda) %取出特征值矩陣中的特征值運(yùn)行結(jié)果:
?1時(shí)計(jì)算得到行數(shù),2時(shí)計(jì)算得到列數(shù),一個(gè)補(bǔ)充小知識(shí)點(diǎn),嘻嘻嘻!!!
size(data,2) %讀取數(shù)據(jù)文件中的列數(shù)?運(yùn)行結(jié)果:
4.畫散點(diǎn)圖和折線圖
這里求得是x軸的值,上面取出的特征值即為y軸的值!!!
x = [size(data,2):-1:1] %表示變量個(gè)數(shù)并倒寫出它們作為x軸 如 4,3,2,1運(yùn)行結(jié)果:
?先畫的散點(diǎn)圖,x,y的值上面介紹了哦!!!
plot(x,y,'o') %繪制散點(diǎn)圖運(yùn)行結(jié)果:
顯示上圖中的格格線為 grid on ;關(guān)閉為 grid off
grid on; %顯示格線運(yùn)行結(jié)果:
?因?yàn)槲蚁朐谕粡垐D上畫散點(diǎn)圖和折線圖,所以調(diào)用 hold on
hold on; %不換畫布繼續(xù)在這張畫布上繪制?給坐標(biāo)軸取名 ,你隨意,哈哈哈哈!!!
xlabel('x'); %x軸名稱 ylabel('y'); %y軸名稱運(yùn)行結(jié)果:
?繪制折線圖,顏色為紅(’r‘) ,'lineWidth':線粗,這些基礎(chǔ)知識(shí),正在寫,后續(xù)發(fā)布
plot(x,y,'-','Color','r','lineWidth',1) %繪制折線圖運(yùn)行結(jié)果:
5.對(duì)特征值排序
在此求出的 lambda 即為上方的 x,ind 即為 上方的 y;descend 為降序,默認(rèn)升序
[lambda, ind] = sort(diag(lambda), 'descend') %排序運(yùn)行結(jié)果:
6.求每個(gè)特征值的貢獻(xiàn)度
即為每個(gè)特征值除以所有特征值的和,即占比
lambda=lambda./sum(lambda) %特征值的貢獻(xiàn)度?運(yùn)行結(jié)果:
7.累計(jì)貢獻(xiàn)度??
計(jì)算累計(jì)貢獻(xiàn)度
lambda=cumsum(lambda) %累計(jì)貢獻(xiàn)度運(yùn)行結(jié)果:
選出累計(jì)貢獻(xiàn)度小于 85%之前的指標(biāo)
為什么要選>85%呢?是為了方便后面的索引
k=find(lambda>0.85) %選出貢獻(xiàn)率達(dá)到85的指標(biāo)前K個(gè)?運(yùn)行結(jié)果:
?讓我們看一下k(1)等于多少???
k(1)運(yùn)行結(jié)果:
那 1:k(1) 呢,又是多少???
1:k(1)?運(yùn)行結(jié)果:
但我們看上面累計(jì)貢獻(xiàn)度時(shí)符合條件<85%的只有一個(gè),所以我們下方選主成分應(yīng)該有有變化?
8.選出主成分,并得出相對(duì)應(yīng)的矩陣
選出前K列的特征向量矩陣
M = M(:,ind(1:k(1)-1) %%取前k列 M = (-1)*M運(yùn)行結(jié)果:
?得到降維后的X
mappedX = data * M %降維后的X運(yùn)行結(jié)果:
9.畫色塊矩陣圖
通過此可以再次確定,下面畫圖需要設(shè)置的x,y的行數(shù)
mapping.M = M %映射的基運(yùn)行結(jié)果:
?設(shè)置色塊矩陣圖x,y軸所標(biāo)注的名稱
XVarNames={'A'}; %個(gè)數(shù)等于上面基的列數(shù) YVarNames={'A','B','C','D','E'}; %個(gè)數(shù)等于上面基的行數(shù)數(shù)值矩陣圖代碼:
matrixplot(M,'FillStyle','nofill','XVarNames',XVarNames,'YVarNames',YVarNames)運(yùn)行結(jié)果:
%色塊顏色表示 matrixplot(M,'XVarNames',XVarNames,'YVarNames',YVarNames,'DisplayOpt','off','FigSize','Auto','ColorBar','on');運(yùn)行結(jié)果:
完整代碼:
如不想每一步都有結(jié)果出現(xiàn),請(qǐng)?jiān)诿啃写a最后加上英文版 ;
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) %計(jì)算均值 data = data - repmat(mapping.mean, [size(data, 1) 1])%去均值 C = cov(data) %協(xié)方差矩陣 [M, lambda] = eig(C) %求C矩陣特征向量及特征值y = diag(lambda) %取出特征值矩陣中的特征值 size(data,2) %讀取數(shù)據(jù)文件中的列數(shù) x = [size(data,2):-1:1] %表示變量個(gè)數(shù)并倒寫出它們作為x軸 如 4,3,2,1 plot(x,y,'o') %繪制散點(diǎn)圖 grid on %顯示格線 hold on; %不換畫布繼續(xù)在這張畫布上繪制 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) %選出貢獻(xiàn)率達(dá)到95的指標(biāo)前K個(gè) 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');總結(jié)及所遇到的問題解決辦法:
因?yàn)槲易罱趯W(xué)主成分,就整理了一些matlab和python的主成分代碼,今天先發(fā)布matlab的,python的稍后發(fā)布(其實(shí)還沒開始,最近要考期末了,很難受!!!)
在此學(xué)習(xí)中,遇到最頭疼的的問題就行,?matrixplot 無法應(yīng)用,需要自己寫入這個(gè)庫才行,最終經(jīng)過不懈努力解決了;還有在寫色塊矩陣圖之前,我先寫的熱力圖,研究半天沒有學(xué)會(huì),它那個(gè)顯示的色塊一點(diǎn)也不好看,于是才有了matrixplot,源碼我先放文末,具體的解釋,我也會(huì)稍后發(fā)布,非常感謝大家的支持,但如果我的文章有錯(cuò)誤,請(qǐng)大家多多指出!!謝謝大家
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); % 對(duì)第一個(gè)輸入?yún)?shù)類型進(jìn)行判斷 if ~ismatrix(data) || ~isreal(data)error('輸入?yún)?shù)類型不匹配:第一個(gè)輸入?yún)?shù)應(yīng)為實(shí)值矩陣'); end% 解析成對(duì)出現(xiàn)的參數(shù)名/參數(shù)值 [FigShape,FigSize,FigStyle,FillStyle,DisplayOpt,TextColor,XVarNames,...YVarNames,ColorBar,GridOpt] = parseInputs(varargin{:});% 產(chǎn)生網(wǎng)格數(shù)據(jù) [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','請(qǐng)檢查您輸入的矩陣是否合適!');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軸方向變量名應(yīng)為字符串矩陣或字符串元胞數(shù)組,其長度與輸入矩陣的列數(shù)相同');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軸方向變量名應(yīng)為字符串矩陣或字符串元胞數(shù)組,其長度與輸入矩陣的行數(shù)相同');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); % 參考網(wǎng)格線 end hold on; axis equal; axis([-0.1,n+0.1,-0.1,m+0.1,-0.5,0.5]); view(2); % 設(shè)置X軸和Y軸刻度位置及標(biāo)簽 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% 顯示數(shù)值文本信息 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% 設(shè)置X軸和Y軸刻度標(biāo)簽的縮進(jìn)方式 MyTickLabel(gca,FigStyle);% 添加顏色條 if strncmpi(ColorBar,'On',2)if any(strncmpi(FigStyle,{'Auto','Triu'},4))colorbar('Location','EastOutside');elsecolorbar('Location','SouthOutside');end end end% --------------------------------------------------- % 調(diào)整坐標(biāo)軸刻度標(biāo)簽子函數(shù) % --------------------------------------------------- function MyTickLabel(ha,tag)% 根據(jù)顯示范圍自動(dòng)調(diào)整坐標(biāo)軸刻度標(biāo)簽的函數(shù) % ha 坐標(biāo)系句柄值 % tag 調(diào)整坐標(biāo)軸刻度標(biāo)簽的標(biāo)識(shí)字符串,可用取值如下: % 'Auto' --- 將x軸刻度標(biāo)簽旋轉(zhuǎn)90度,y軸刻度標(biāo)簽不作調(diào)整 % 'Tril' --- 將x軸刻度標(biāo)簽旋轉(zhuǎn)90度,并依次縮進(jìn),y軸刻度標(biāo)簽不作調(diào)整 % 'Triu' --- 將x軸刻度標(biāo)簽旋轉(zhuǎn)90度,y軸刻度標(biāo)簽依次縮進(jìn) % Example: % MyTickLabel(gca,'Tril'); if ~ishandle(ha)warning('MATLAB:warning2','第一個(gè)輸入?yún)?shù)應(yīng)為坐標(biāo)系句柄');return; endif ~strcmpi(get(ha,'type'),'axes')warning('MATLAB:warning3','第一個(gè)輸入?yún)?shù)應(yīng)為坐標(biāo)系句柄');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% --------------------------------------------------- % 根據(jù)散點(diǎn)數(shù)據(jù)繪制3維色塊圖子函數(shù) % --------------------------------------------------- function MyPatch(x,y,z,FigShape,FigSize) % 根據(jù)散點(diǎn)數(shù)據(jù)繪制3維色塊圖 % MyPatch(x,y,z,FigShape,FigSize) x,y,z是實(shí)值數(shù)組,用來指定色塊中心點(diǎn)三維 % 坐標(biāo)。FigShape是字符串變量,用來指定色塊形狀。 % FigSize是字符串變量,用來指定色塊大小。 % % Example: % x = rand(10,1); % y = rand(10,1); % z = rand(10,1); % MyPatch(x,y,z,'s','Auto'); %% 輸入?yún)?shù)類型判斷 if nargin < 3error('至少需要三個(gè)輸入?yún)?shù)'); end if ~isreal(x) || ~isreal(y) || ~isreal(z)error('前三個(gè)輸入應(yīng)為實(shí)值數(shù)組'); endn = numel(z); if numel(x) ~= n || numel(y) ~= nerror('坐標(biāo)應(yīng)等長'); endif strncmpi(FigSize,'Auto',3) && ~strncmpi(FigShape,'Ellipse',1)id = (z == 0);x(id) = [];y(id) = [];z(id) = []; end if isempty(z)return; end% 求色塊頂點(diǎn)坐標(biāo) 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 %-------------------------------------------------- % 求色塊頂點(diǎn)坐標(biāo)并繪制色塊的子函數(shù) %-------------------------------------------------- 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%-------------------------------------------------------------------------- % 解析輸入?yún)?shù)子函數(shù)1 %-------------------------------------------------------------------------- function [FigShape,FigSize,FigStyle,FillStyle,DisplayOpt,TextColor,...XVarNames,YVarNames,ColorBar,GridOpt] = parseInputs(varargin)if mod(nargin,2)~=0error('輸入?yún)?shù)個(gè)數(shù)不對(duì),應(yīng)為成對(duì)出現(xiàn)'); 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('形狀參數(shù)只能為Square, Circle, Ellipse, Hexagon, Dial 之一'); end if ~any(strncmpi(FigSize,{'Full','Auto'},3))error('圖形大小參數(shù)只能為Full, Auto 之一'); end if ~any(strncmpi(FigStyle,{'Auto','Tril','Triu'},4))error('圖形樣式參數(shù)只能為Auto, Tril, Triu 之一'); end if ~any(strncmpi(FillStyle,{'Fill','NoFill'},3))error('圖形填充樣式參數(shù)只能為Fill, NoFill 之一'); end if ~any(strncmpi(DisplayOpt,{'On','Off'},2))error('顯示數(shù)值參數(shù)只能為On,Off 之一'); end if ~any(strncmpi(ColorBar,{'On','Off'},2))error('顯示顏色條參數(shù)只能為On,Off 之一'); end if ~any(strncmpi(GridOpt,{'On','Off'},2))error('顯示網(wǎng)格參數(shù)只能為On,Off 之一'); end end%-------------------------------------------------------------------------- % 解析輸入?yún)?shù)子函數(shù)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總結(jié)
以上是生活随笔為你收集整理的主成分分析(PCA)及其可视化——matlab的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php post 丢失,php post
- 下一篇: quartus管脚分配后需要保存吗_电脑