目錄
一、數(shù)據(jù)統(tǒng)計
1、行列式的最大元素和最小元素
2、求向量的平均值和中值?
3、對矩陣做排序
?二、數(shù)據(jù)優(yōu)化(數(shù)據(jù)殘缺值和異常值的處理)
1、數(shù)據(jù)殘缺
①插值
②擬合
?③鄰近替換
④KNN算法填充
2、數(shù)據(jù)異常
①拉依達準則
②替換異常值
3、數(shù)據(jù)變換
①0-1標準化
②z-score標準化
③標準化的應(yīng)用
4、數(shù)據(jù)離散化
①等寬法
②等頻法
三、數(shù)據(jù)降維
1、主成分分析
①主成分分析簡介
②主成分分析計算步驟
③案例分析
?2、因子分析(FA)
①應(yīng)用場景
②步驟
③模型分析
?④代碼實現(xiàn)
一、數(shù)據(jù)統(tǒng)計
數(shù)據(jù)統(tǒng)計一般包括求矩陣最大、最小元素,求矩陣平均值和中值, 矩陣元素求和、求積,矩陣元素累加和與累乘積,求標準方差、相關(guān)系數(shù)、元素排序等。
直接舉例子說明
1、行列式的最大元素和最小元素
命令如下:
A=[12,45,58;25,60,-45;56,25,178;2,0,-13];
max(A,[],2) %求每行最大元素
ans =
58
60
178
2
max(A) %求每列最大元素
ans =
56 60 178
min(min(A)) %求整個矩陣的最小元素。也可用命令:min(A(:))
ans =
-45
2、求向量的平均值和中值?
命令如下:
x=[10,24,6,-8,0,-12]; %偶數(shù)個元素
mean(x) %求此向量的平均值
x =
10 24 6 -8 0 -12
ans =
3.3333
median(x) %求此向量的中值
ans =
3
3、對矩陣做排序
命令如下:
? ??A=[0,-11,5;1,15,7;16,9,-20];
sort(A)??????????????????? %對A的每列按升序排序
ans =
0?? ?-11 ?-20
???? ???1???? 9?? ?5
??? ???16??? 15?? ?7
-sort(-A,2)???????????????? %對A的每行按降序排列
ans =
5???? 0?? -11
??? ???15???? 7???? 1
??? ???16???? 9?? -20
[X,I]=sort(A)???? ??????????%對A按列排序,并將每個元素所在行號送矩陣I
X =
0?? ?-11?? -20
???? ??1???? 9???? 5
??? ??16??? 15???? 7
I =
1???? 1???? 3
???? ??2???? 3???? 1
???? ??3???? 2???? 2
?二、數(shù)據(jù)優(yōu)化(數(shù)據(jù)殘缺值和異常值的處理)
插值和擬合都是數(shù)據(jù)優(yōu)化的一種方法,當(dāng)實驗數(shù)據(jù)不夠多時經(jīng)常需要用到這種方法來畫圖。在MATLAB中都有特定的函數(shù)來完成這些功能。這兩種方法的確別在于:
當(dāng)測量值是準確的,沒有誤差時,一般用插值;
當(dāng)測量值與真實值有誤差時,一般用數(shù)據(jù)擬合。
1、數(shù)據(jù)殘缺
①插值
對于一維曲線的插值,一般用到的函數(shù)yi=interp1(X,Y,xi,method) ,其中method包括nearst,linear,spline,cubic。
對于二維曲面的插值,一般用到的函數(shù)zi=interp2(X,Y,Z,xi,yi,method),其中method也和上面一樣,常用的是cubic。
%產(chǎn)生原始數(shù)據(jù)
x=0:0.1:1;
y=(x.^2-3*x+7).*exp(-4*x).*sin(2*x);
subplot(2,2,1);
plot(x,y);
title('原始數(shù)據(jù)');
%線性插值
xx=0:0.01:1;
y1=interp1(x,y,xx,'linear');
%subplot(2,2,1)
%plot(x,y,'o',xx,y1);
%title('線性插值');
%最鄰近點插值
y2=interp1(x,y,xx,'nearest');
subplot(2,2,2)
plot(x,y,'o',xx,y2);
title('最鄰近點插值');
%三次插值
y3=interp1(x,y,xx,'pchip');
subplot(2,2,3)
plot(x,y,'o',xx,y3);
title('三次插值');
%三次樣條插值
y4=interp1(x,y,xx,'spline');
subplot(2,2,4)
plot(x,y,'o',xx,y4);
title('三次樣條插值');
經(jīng)典問題:利用給定的高度補充地圖
%插值基點為網(wǎng)格節(jié)點
clear all
y=20:-1:0;
x=0:20;
z=[0.2 0.2 0.2 0.2 0.2 0.2 0.4 0.4 0.3 0.2 0.3 0.2 0.1 0.2 0.2 0.4 0.3 0.2 0.2 0.2 0.2;
0.3 0.2 0.2 0.2 0.2 0.4 0.3 0.3 0.3 0.3 0.4 0.2 0.2 0.2 0.2 0.4 0.4 0.4 0.3 0.2 0.2;
0.2 0.3 0.3 0.2 0.3 1 0.4 0.5 0.3 0.3 0.3 0.3 0.2 0.2 0.2 0.6 0.5 0.4 0.4 0.2 0.2;
0.2 0.2 0.4 0.2 1 1.1 0.9 0.4 0.3 0.3 0.5 0.3 0.2 0.2 0.2 0.7 0.3 0.6 0.6 0.3 0.4;
0.2 0.2 0.9 0.7 1 1 1 0.7 0.5 0.3 0.2 0.2 0.2 0.6 0.2 0.8 0.7 0.9 0.5 0.5 0.4;
0.2 0.3 1 1 1 1.2 1 1.1 0.8 0.3 0.2 0.2 0.2 0.5 0.3 0.6 0.6 0.8 0.7 0.6 0.5;
0.2 0.4 1 1 1.1 1.1 1.1 1.1 0.6 0.3 0.4 0.4 0.2 0.7 0.5 0.9 0.7 0.4 0.9 0.8 0.3;
0.2 0.2 0.9 1.1 1.2 1.2 1.1 1.1 0.6 0.3 0.5 0.3 0.2 0.4 0.3 0.7 1 0.7 1.2 0.8 0.4;
0.2 0.3 0.4 0.9 1.1 1 1.1 1.1 0.7 0.4 0.4 0.4 0.3 0.5 0.5 0.8 1.1 0.8 1.1 0.9 0.3;
0.3 0.3 0.5 1.2 1.2 1.1 1 1.2 0.9 0.5 0.6 0.4 0.6 0.6 0.3 0.6 1.2 0.8 1 0.8 0.5;
0.3 0.5 0.9 1.1 1.1 1 1.2 1 0.8 0.7 0.5 0.6 0.4 0.5 0.4 1 1.3 0.9 0.9 1 0.8;
0.3 0.5 0.6 1.1 1.2 1 1 1.1 0.9 0.4 0.4 0.5 0.5 0.8 0.6 0.9 1 0.5 0.8 0.8 0.9;
0.4 0.5 0.4 1 1.1 1.2 1 0.9 0.7 0.5 0.6 0.3 0.6 0.4 0.6 1 1 0.6 0.9 1 0.7;
0.3 0.5 0.8 1.1 1.1 1 0.8 0.7 0.7 0.4 0.5 0.4 0.4 0.5 0.4 1.1 1.3 0.7 1 0.7 0.6;
0.3 0.5 0.9 1.1 1 0.7 0.7 0.4 0.6 0.4 0.4 0.3 0.5 0.5 0.3 0.9 1.2 0.8 1 0.8 0.4;
0.2 0.3 0.6 0.9 0.8 0.8 0.6 0.3 0.4 0.5 0.4 0.5 0.4 0.2 0.5 0.5 1.3 0.6 1 0.9 0.3;
0.2 0.3 0.3 0.7 0.6 0.6 0.4 0.2 0.3 0.5 0.8 0.8 0.3 0.2 0.2 0.8 1.3 0.9 0.8 0.8 0.4;
0.2 0.3 0.3 0.6 0.3 0.4 0.3 0.2 0.2 0.3 0.6 0.4 0.3 0.2 0.4 0.3 0.8 0.6 0.7 0.4 0.4;
0.2 0.3 0.4 0.4 0.2 0.2 0.2 0.3 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.5 0.7 0.4 0.4 0.3 0.3;
0.2 0.2 0.3 0.2 0.2 0.3 0.2 0.2 0.2 0.2 0.2 0.1 0.2 0.4 0.3 0.6 0.5 0.3 0.3 0.3 0.2;
0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.4 0.7 0.4 0.2 0.4 0.5 0.5];
%未插值直接畫圖
figure(1) %創(chuàng)建圖形窗口1,并激活
surf(x,y,z);
shading flat %用shading flat命令,使曲面變的光滑
title('未插值地形圖')
xlabel('橫坐標')
ylabel('縱坐標')
zlabel('高度')
%三次插值后畫圖
%畫地形圖
figure(2)
xi=0:0.05:20;
yi=20:-0.05:0;
zi=interp2(x,y,z,xi',yi,'cubic'); %'cubic'三次插值
surfc(xi,yi,zi); %底面帶等高線
shading flat
title('插值后地形圖')
xlabel('橫坐標')
ylabel('縱坐標')
zlabel('高度')
%畫立體等高線圖
figure(3)
contour3(xi,yi,zi);
title('立體等高線圖')
xlabel('橫坐標')
ylabel('縱坐標')
zlabel('高度')
%畫等高線圖
figure(4)
[c,h]=contour(xi,yi,zi);
clabel(c,h); %用于為2維等高線添加標簽
colormap cool %冷色調(diào)
title('平面等高線圖')
xlabel('橫坐標')
ylabel('縱坐標')
②擬合
對于一維曲線的擬合,一般用到的函數(shù)p=polyfit(x,y,n)和yi=polyval(p,xi),這個是最常用的最小二乘法的擬合方法。
對于二維曲面的擬合,有很多方法可以實現(xiàn),這里運用Spline Toolbox里面的函數(shù)功能。
x = 0:0.1:1;
y = [-0.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2];
A = polyfit(x,y,2) %A為擬合出來的函數(shù)
z = polyval(A,x); %求多項式在x處的值z
plot(x,y,'k+',x,z,'r')
?③鄰近替換
前/后一個非缺失值將其替換
最近的非缺失值替換
相鄰的非離群值線性插值填充
test_data1=fillmissing(test_data,'previous');
test_data1=fillmissing(test_data,'next');
test_data1=fillmissing(test_data,'nearest');
test_data1=fillmissing(test_data,'linear');
④KNN算法填充
from sklearn.metrics import nan_euclidean_distances
import numpy as np
from sklearn.impute import KNNImputer
X = [[1, 2, np.nan], [3, 4, 3], [np.nan, 6, 5], [8, 8, 7]]
# python的nan_euclidean_distances函數(shù)可計算含空值的距離矩陣
nan_euclidean_distances(X, X)
# python用KNNImputer進行空值填充
X = [[1, 2, np.nan], [3, 4, 3], [np.nan, 6, 5], [8, 8, 7]]
imputer = KNNImputer(n_neighbors=2)
a = imputer.fit_transform(X)
print(a)
2、數(shù)據(jù)異常
①拉依達準則
拉依達準則是用來發(fā)現(xiàn)數(shù)據(jù)異常值
x=[1, 1.1, 1.2, 1.3, 1.4, 2, 1.2, 1.3, 1.5, 0.9, 0.8, 1.1, 11];
inlier = [];outlier = [];
len = length(x);
average1 = mean(x); % x中所有元素的均值
standard1 = std(x); % x的標準差
for i = 1:len % 遍歷x向量,判斷是否為偏離點,不是偏離點則存入inline
if abs(x(i)-average1)<standard1*3
inlier = [inlier x(i)];
end
end
average2 = mean(inlier);
standard2 = std(inlier);
for i = 1:len % 遍歷x向量,判斷是否為偏離點,不是偏離點則存入outline
if abs(x(i)-average2) >= standard2*3
outlier = [outlier x(i)];
end
end
②替換異常值
替換方法跟缺失值的替換一致,我們可以直接將其看作缺失值進行處理,替換方法如上。
3、數(shù)據(jù)變換
①0-1標準化
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# matplotlib inline
# 數(shù)據(jù)標準化
# (1)0-1標準化
df = pd.DataFrame({"value1":np.random.rand(10)*20,
'value2':np.random.rand(10)*100})
print(df.head())
print('------')
# 創(chuàng)建數(shù)據(jù)
def data_norm(df,*cols):
df_n = df.copy()
for col in cols:
ma = df_n[col].max()
mi = df_n[col].min()
df_n[col + '_n'] = (df_n[col] - mi) / (ma - mi)
return(df_n)
# 創(chuàng)建函數(shù),標準化數(shù)據(jù)
df_n = data_norm(df, 'value1', 'value2')
print(df_n.head())#標準化數(shù)據(jù)
②z-score標準化
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({"value1": np.random.rand(10) * 100,
'value2': np.random.rand(10) * 100})
print(df.head())
print('------')
# 創(chuàng)建數(shù)據(jù)
def data_Znorm(df, *cols):
df_n = df.copy()
for col in cols:
u = df_n[col].mean()
std = df_n[col].std()
df_n[col + '_Zn'] = (df_n[col] - u) / std # 平均值/標準差
return (df_n)
# 創(chuàng)建函數(shù),標準化數(shù)據(jù)
df_z = data_Znorm(df, 'value1', 'value2')
u_z = df_z['value1_Zn'].mean()
std_z = df_z['value1_Zn'].std()
print(df_z)
print('標準化后value1的均值為:%.2f, 標準差為:%.2f' % (u_z, std_z))
# 標準化數(shù)據(jù)
# 經(jīng)過處理的數(shù)據(jù)符合標準正態(tài)分布,即均值為0,標準差為1
# 什么情況用Z-score標準化:
# 在分類、聚類算法中,需要使用距離來度量相似性的時候,Z-score表現(xiàn)更好
③標準化的應(yīng)用
# 八類產(chǎn)品的兩個指標value1,value2,其中value1權(quán)重為0.6,value2權(quán)重為0.4
# 通過0-1標準化,判斷哪個產(chǎn)品綜合指標狀況最好
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({"value1": np.random.rand(10) * 30,
'value2': np.random.rand(10) * 100},
index=list('ABCDEFGHIJ'))
# print(df.head())
# print('------')
# 創(chuàng)建數(shù)據(jù)"
def data_norm(df, *cols):
df_n = df.copy()
for col in cols:
ma = df_n[col].max()
mi = df_n[col].min()
df_n[col + '_n'] = (df_n[col] - mi) / (ma - mi)
return df_n
df_n1 = data_norm(df, 'value1', 'value2')
# 進行標準化處理
df_n1['f'] = df_n1['value1_n'] * 0.6 + df_n1['value2_n'] * 0.4
df_n1.sort_values(by='f', inplace=True, ascending=False)
df_n1['f'].plot(kind='line', style='--.k', alpha=0.8, grid=True)
print(df_n1)
# 查看綜合指標狀況
4、數(shù)據(jù)離散化
①等寬法
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 等寬法 → cut方法
ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]
# 有一組人員年齡數(shù)據(jù),希望將這些數(shù)據(jù)劃分為“18到25”,“26到35”,“36到60”,“60以上”幾個面元,分成4個區(qū)間。
bins = [18, 25, 35, 60, 100]
cats = pd.cut(ages, bins)
print(cats)
print(type(cats))
print('____')
print(cats.codes, type(cats.codes)) # 0-3對應(yīng)分組后的四個區(qū)間,用代號來注釋數(shù)據(jù)對應(yīng)區(qū)間,結(jié)果為ndarray;可以查看里邊的等級
print(cats.categories, type(cats.categories)) # 四個區(qū)間,結(jié)果為index
print(pd.value_counts(cats)) # 按照區(qū)間計數(shù)
print('-------')
# cut結(jié)果含有一個表示不同分類名稱的層級數(shù)組以及一個年齡數(shù)據(jù)進行標號的代號屬性
print(pd.cut(ages, [18, 26, 36, 61, 100], right=False))
print('-------')
# 通過right函數(shù)修改閉端,默認為True
group_names = ['Youth', 'YoungAdult', 'MiddleAged', 'Senior']
print(pd.cut(ages, bins, labels=group_names))
print('-------')
# 可以設(shè)置自己的區(qū)間名稱,用labels參數(shù)
df = pd.DataFrame({'ages': ages})
group_names = ['Youth', 'YoungAdult', 'MiddleAged', 'Senior']
s = pd.cut(df['ages'], bins) # 也可以 pd.cut(df['ages'],5),將數(shù)據(jù)等分為5份
df['label'] = s
cut_counts = s.value_counts(sort=False)
print(df)
print(cut_counts)
# 對一個Dataframe數(shù)據(jù)進行離散化,并計算各個區(qū)間的數(shù)據(jù)計數(shù)
plt.scatter(df.index, df['ages'], cmap='Reds', c=cats.codes)
plt.grid()
# 用散點圖表示,其中顏色按照codes分類
# 注意codes是來自于Categorical對象
②等頻法
# 等頻法 → qcut方法
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = np.random.randn(1000)
s = pd.Series(data)
cats = pd.qcut(s,4) # 按四分位數(shù)進行切割,可以試試 pd.qcut(data,10)
print(cats.head())
print(pd.value_counts(cats))
print('------')
# qcut → 根據(jù)樣本分位數(shù)對數(shù)據(jù)進行面元劃分,得到大小基本相等的面元,但并不能保證每個面元含有相同數(shù)據(jù)個數(shù)
# 也可以設(shè)置自定義的分位數(shù)(0到1之間的數(shù)值,包含端點) → pd.qcut(data1,[0,0.1,0.5,0.9,1])
plt.scatter(s.index,s,cmap = 'Greens',c = pd.qcut(data,4).codes)
plt.xlim([0,1000])
plt.grid()
# 用散點圖表示,其中顏色按照codes分類
# 注意codes是來自于Categorical對象
三、數(shù)據(jù)降維
1、主成分分析
①主成分分析簡介
主成分分析是一種降維算法,它能將多個指標轉(zhuǎn)換為少數(shù)幾個主成分,這些主成分是原始變量的線性組合,且彼此之間互不相關(guān),其能反映出原始數(shù)據(jù)的大部分信息。一般來說,當(dāng)研究的問題涉及到多變量且變量之間存在很強的相關(guān)性時,我們可考慮使用主成分分析的方法來對數(shù)據(jù)進行簡化。
②主成分分析計算步驟
標準化處理
計算標準化樣本的協(xié)方差矩陣
計算R的特征值和特征向量
計算主成分貢獻率以及累計貢獻率
寫出主成分
根據(jù)系數(shù)分析主成分代表的意義
③案例分析
主成分分析指標解釋案例
主成分分析的一大難點是指標意義模糊,難以解釋,下面這個例子可以輔助理解。
上表的累計貢獻率 = 當(dāng)前項貢獻率 + 之前的累計貢獻率。當(dāng)累計貢獻率 > 80%時,剩下的特征向量可以舍棄。
上面的分析需要一定的語言組織能力,也需要一定運氣成分,若難以解釋,或者強行解釋,或者換方法。
案例參考文章:原文鏈接:https://blog.csdn.net/qq1198768105/article/details/119898545
clear;clc
% load data1.mat % 主成分聚類
load data2.mat % 主成分回歸
[n,p] = size(x); % n是樣本個數(shù),p是指標個數(shù)
%% 第一步:對數(shù)據(jù)x標準化為X
X=zscore(x); % matlab內(nèi)置的標準化函數(shù)(x-mean(x))/std(x)
%% 第二步:計算樣本協(xié)方差矩陣
R = cov(X);
%% 注意:以上兩步可合并為下面一步:直接計算樣本相關(guān)系數(shù)矩陣
R = corrcoef(x);
disp('樣本相關(guān)系數(shù)矩陣為:')
disp(R)
%% 第三步:計算R的特征值和特征向量
% 注意:R是半正定矩陣,所以其特征值不為負數(shù)
% R同時是對稱矩陣,Matlab計算對稱矩陣時,會將特征值按照從小到大排列哦
% eig函數(shù)的詳解見第一講層次分析法的視頻
[V,D] = eig(R); % V 特征向量矩陣 D 特征值構(gòu)成的對角矩陣
%% 第四步:計算主成分貢獻率和累計貢獻率
lambda = diag(D); % diag函數(shù)用于得到一個矩陣的主對角線元素值(返回的是列向量)
lambda = lambda(end:-1:1); % 因為lambda向量是從小大到排序的,我們將其調(diào)個頭
contribution_rate = lambda / sum(lambda); % 計算貢獻率
cum_contribution_rate = cumsum(lambda)/ sum(lambda); % 計算累計貢獻率 cumsum是求累加值的函數(shù)
disp('特征值為:')
disp(lambda') % 轉(zhuǎn)置為行向量,方便展示
disp('貢獻率為:')
disp(contribution_rate')
disp('累計貢獻率為:')
disp(cum_contribution_rate')
disp('與特征值對應(yīng)的特征向量矩陣為:')
% 注意:這里的特征向量要和特征值一一對應(yīng),之前特征值相當(dāng)于顛倒過來了,因此特征向量的各列需要顛倒過來
% rot90函數(shù)可以使一個矩陣逆時針旋轉(zhuǎn)90度,然后再轉(zhuǎn)置,就可以實現(xiàn)將矩陣的列顛倒的效果
V=rot90(V)';
disp(V)
%% 計算我們所需要的主成分的值
m =input('請輸入需要保存的主成分的個數(shù): ');
F = zeros(n,m); %初始化保存主成分的矩陣(每一列是一個主成分)
for i = 1:m
ai = V(:,i)'; % 將第i個特征向量取出,并轉(zhuǎn)置為行向量
Ai = repmat(ai,n,1); % 將這個行向量重復(fù)n次,構(gòu)成一個n*p的矩陣
F(:, i) = sum(Ai .* X, 2); % 注意,對標準化的數(shù)據(jù)求了權(quán)重后要計算每一行的和
end
?2、因子分析(FA)
①應(yīng)用場景
減少分析變量個數(shù)
通過對變量間相關(guān)關(guān)系的探測,將原始變量分組,即將相關(guān)性高的變量分為一組,用共性因子來代替該變量
使問題背后的業(yè)務(wù)因素的意義更加清晰呈現(xiàn)
②步驟
1、選擇分析的變量
2、計算所選原始變量的相關(guān)系數(shù)矩陣
3、提取公共因子
4、因子旋轉(zhuǎn)
5、計算因子得分
③模型分析
?以廢氣排放為例說明主成分降維處理過程
1、評價標準體系的構(gòu)建
2、因子分析
因子分析首先將原始數(shù)據(jù)標準化處理,建立相關(guān)系數(shù)矩 陣并計算其特征值和特征向量,接著從中選擇特征值大于等 于1的特征值個數(shù)為公共因子數(shù),或者根據(jù)因子對X的累計貢獻 率大于80%來確定公共因子,求得因子載荷矩陣, 后計算公因子得分和綜合得分。
?觀察相關(guān)系數(shù)矩陣表 2,可以發(fā)現(xiàn)所選取指標之間存在著一定的相關(guān)關(guān)系,其中 X3 和 X6、X4 和
X7、 X7 和 X8 分別存在著較強的相關(guān)性,相關(guān)系數(shù)分別為 0.96、 0.96、0.91,這進一步驗證了對所選指標做因子分析的科學(xué)性和必要性。計算相關(guān)系數(shù)矩陣的特征值、貢獻率及累計貢獻率如
所示:
?確定提取的主成分個數(shù)可綜合考慮 3 個方面:
(1)提取的所有特征值大于某一特定特征值,一般特定值設(shè)為 1,本文同樣以 1 為標準;
(2) 提取的主成分的累計貢獻率要大于 85%,即所提取的主成分要能夠概括原有指標的絕大部分信息; 由表 3 可知,前 3 個主成分的累計貢獻率已經(jīng)達到了94.01%,滿足按照累計貢獻率大于 85% 確定主成分個數(shù)的原則;
(3) 以做主成分分析時生成的碎石圖 (Scree Plot) 做參考,碎石圖是按照特征值大小排列的,以特征值為縱坐標、因子數(shù)為橫坐標生成的主成分散點圖,有明顯的拐點,一般取拐點前所有的因子及拐點后第一個因子作為主成分 。
觀察圖 4 可得,第一、第二個主成分的特征值較大,其余幾個均較小,碎石圖在第三個特征值出現(xiàn)
拐點。
根據(jù)上述分析,在本研究中選取前 3 個主成分對河南省水資源使用情況進行動態(tài)分析,從表 3
和 4,我們可以看出前 3 個主成分已經(jīng)能夠概括絕大部分的原始信息,因此提取 3 個主成分因子是
合理的. 提取 3 個主成分用于概括原有 10 個指標的絕大部分信息,這既達到了降維、簡化的目的,又在一定程度上保證了后續(xù)研究結(jié)果能準確有效地反映出河南省水資源使用情況動態(tài)變化的基本特征。計算主成分的載荷矩陣, 主成分載荷是指提取的 3 大主成分與各變量指標之間的相關(guān)系數(shù)如表4:文章來源:http://www.zghlxwxcb.cn/news/detail-429205.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-429205.html
?④代碼實現(xiàn)
clc,clear
r=[1.000 0.577 0.509 0.387 0.462
0.577 1.000 0.599 0.389 0.322
0.509 0.599 1.000 0.436 0.426
0.387 0.389 0.436 1.000 0.523
0.462 0.322 0.426 0.523 1.000];
%下面利用相關(guān)系數(shù)矩陣求主成分解,val的列為r的特征向量,即主成分的系數(shù)
[vec,val,con]=pcacov(r);%val為r的特征值,con為各個主成分的貢獻率
f1=repmat(sign(sum(vec)),size(vec,1),1); %構(gòu)造與vec同維數(shù)的元素為±1的矩陣
vec=vec.*f1; %修改特征向量的正負號,每個特征向量乘以所有分量和的符號函數(shù)值
f2=repmat(sqrt(val)',size(vec,1),1);
a=vec.*f2 %構(gòu)造全部因子的載荷矩陣
a1=a(:,1) %提出一個因子的載荷矩陣
tcha1=diag(r-a1*a1') %計算一個因子的特殊方差
a2=a(:,[1,2]) %提出兩個因子的載荷矩陣
tcha2=diag(r-a2*a2') %計算兩個因子的特殊方差
ccha2=r-a2*a2'-diag(tcha2) %求兩個因子時的殘差矩陣
gong=cumsum(con) %求累積貢獻率
clc,clear
load data.txt; %把原始數(shù)據(jù)保存在純文本文件data.txt中
n=size(data,1);
x=data(:,1:4); y=data(:,5); %分別提出自變量x和因變量y的值
——————————————————————————————————
如果不需要檢驗,則不需要把y列入原始數(shù)據(jù)中,把矩陣x的大小改變一下,以及下文中的m,m為原始數(shù)據(jù)中變量的個數(shù)。
——————————————————————————————————
m=4;%m為變量的個數(shù)
x=zscore(x); %數(shù)據(jù)標準化
r=cov(x); %求標準化數(shù)據(jù)的協(xié)方差陣,即求相關(guān)系數(shù)矩陣
[vec,val,con]=pcacov(r); %進行主成分分析的相關(guān)計算
c=cumsum(con);
i=1;
while ((c(i)<90)&(con(i+1)>10))
i=i+1;
end
num=i;
f1=repmat(sign(sum(vec)),size(vec,1),1);
vec=vec.*f1; %特征向量正負號轉(zhuǎn)換
f2=repmat(sqrt(val)',size(vec,1),1);
a=vec.*f2; %求初等載荷矩陣
am=a(:,1:num); %提出num個主因子的載荷矩陣
[b,t]=rotatefactors(am,'method', 'varimax'); %旋轉(zhuǎn)變換,b為旋轉(zhuǎn)后的載荷陣
bt=[b,a(:,num+1:end)]; %旋轉(zhuǎn)后全部因子的載荷矩陣
contr=sum(bt.^2); %計算因子貢獻
rate=contr(1:num)/sum(contr); %計算因子貢獻率
fprintf('綜合因子得分公式:F=');
for i=1:num
fprintf('+%f*F%d',rate(i),i);
end
fprintf('\n');
coef=inv(r)*b; %計算得分函數(shù)的系數(shù)
coef=coef';
for i=1:num
fprintf('各個因子得分函數(shù)為F%d=',i);
for j=1:m
fprintf('+(%f)*x_%d',coef(i,j),j);
end
fprintf('\n');
end
%如果僅僅因子分析,程序到此為止
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
score=x*coef';%計算各個因子的得分
weight=rate/sum(rate); %計算得分的權(quán)重
Tscore=score*weight'; %對各因子的得分進行加權(quán)求和,即求各企業(yè)綜合得分
[STscore,ind]=sort(Tscore,'descend'); %對企業(yè)進行排序
display=[score(ind,:)';STscore';ind']; %顯示排序結(jié)果
fprintf('排序結(jié)果如下:');
for i=1:num
fprintf('第%d行為F%d得分,',i,i);
end
fprintf('第%d行為綜合因子得分,第%d為原序列\(zhòng)n',num+1,num+2);
disp(display);
[ccoef,p]=corrcoef([Tscore,y]); %計算F與資產(chǎn)負債的相關(guān)系數(shù)
[d,dt,e,et,stats]=regress(Tscore,[ones(n,1),y]);%計算F與資產(chǎn)負債的方程
fprintf('因子分析法的回歸方程為:F=%f+(%f*y)',d(1),d(2));
if (stats(3)<0.05)%判斷是否通過顯著性檢驗的結(jié)果
fprintf('\n在顯著性水平0.05的情況下,通過了假設(shè)檢驗。\n');
else
fprintf('\n在顯著性水平0.05的情況下,通不過假設(shè)檢驗。\n');
end該MATLAB源代碼的displsy為最終排序結(jié)果。
到了這里,關(guān)于數(shù)學(xué)建模--數(shù)據(jù)預(yù)處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!