1. 程式人生 > >數據降維

數據降維

cor size mea 不常用 大於 play 特征向量 分數 sum

數據降維

分類

  • PCA(主成分分析降維)
  • 相關系數降維

PCA 降維(不常用)

實現思路

  • 對數據進行標準化
  • 計算出數據的相關系數矩陣(是方陣, 維度是nxn, n是特征的數量)
  • 計算出相關系數矩陣的特征值和特征向量(雖然這裏說的是向量, 但是是矩陣, 這個矩陣的每一列都是特征值或者特征向量, 是nxn), 特征值是每一個特征的特征值的集合, 但是在特征向量是每一個特征的特征向量的集合, 前者我們提到的特征值和特征向量是集合
  • 多特征值進行降序排序
  • 根據已經得到的特征值計算出貢獻率和累計貢獻率(主要看累計貢獻率, 單單一個貢獻率指的是一個主成分保存的原始特征的信息, 累計貢獻率是總共保存的原始特征信息)
  • 設置信息閾值T, 一般設置為0.9, 如果大於T, 則記錄下來當前的位置k(k也就是我們選擇的主成分的個數, 主成分就是特征, 也就是一列)
  • 根據k選擇主成分對應的特征向量
  • 將標準化之後的數據(矩陣)右乘在上一步中選擇出來的特征向量(在這一步得到的矩陣就是m x new_n維度的了), 得到的就是主成分的分數, 也就是降維之後的數據集合

偽代碼

X = load(‘data.xlsx‘, ‘B1:I11‘);
m = size(X, 1); % m 表示樣本的數量
n = size(X, 2); % n 表示特征的數量
% 數據標準化
for i = 1:m
    SX(:, i) = (X(:, i) - mean(X(:, i))) / std(X(:, i));
end

% 計算相關系數
CM = corrcoef(SX);
% V 是特征向量, D 是特征值
[V D] = eig(CM);

% 對D特征值進行降序排序, 將結果保存到DS的第一列
for i = 1:n
    DS(:, 1) = D(n + 1 - i, n + 1 - i);
end

% 計算貢獻率和累計貢獻率
for i = 1:n
    % 第二列為當前單個, 每一個, 主成分的貢獻率
    DS(:, 2) = D(i, 1) / sum(D(:, 1));
    % 第三列為到當前主成分的累計貢獻率
    DS(:, 3) = sum(D(1:i, 1)) / sum(D(:, 1));
end

% 選擇主成分
T = 0.9;
for i = 1:n
    if DS(:, i) > T
        k = i;
        break;
    end
end

% 獲取主成分對應的特征向量
for i = 1:n
    PV(:, i) = DS(:, n + 1 - i);
end

% 獲取新的特征樣本
X_new = SX * PV;

相關系數降維

  • 公式: \[r=\sum_{j=1}^{m}{{(x_{j}-\overline{x_{j}})({y_{j}-\overline{y_{j}}})}\over{std(x_{j})std(y_{j})}}\]
  • 如果|r|在[0.7, 1]時表示強線性關系, 說明x和y有很緊密的線性關系
  • 如果|r|在[0.5, 0.7]時表示中線性關系
  • 如果|r|在[0.2, 0.5]時表示低線性關系
  • 如果|r|在[0, 0.2]時表示沒有關系
  • r > 0表示正相關, r < 0表示負關系

數據降維