
PCA如同一位智慧的摄影师:
整个过程展现了"删繁就简"的哲学,用数学方法实现数据本质特征的提取。
import org.apache.commons.math3.linear.*;
import java.util.Arrays;
public class PCA {
public static double[][] reduceDimension(double[][] data, int k) {
RealMatrix matrix = MatrixUtils.createRealMatrix(data);
// 1. 中心化数据
RealMatrix centered = center(matrix);
// 2. 计算协方差矩阵
RealMatrix covariance = centered.transpose().multiply(centered)
.scalarMultiply(1.0/(data.length-1));
// 3. 特征分解
EigenDecomposition eigen = new EigenDecomposition(covariance);
RealMatrix eigenvectors = eigen.getV();
// 4. 选取前k个特征向量
RealMatrix projection = eigenvectors.getSubMatrix(0, eigenvectors.getRowDimension()-1,
0, k-1);
// 5. 投影到新空间
return centered.multiply(projection).getData();
}
private static RealMatrix center(RealMatrix matrix) {
double[] means = new double[matrix.getColumnDimension()];
for(int i=0; i<matrix.getColumnDimension(); i++) {
means[i] = matrix.getColumnVector(i).getL1Norm() / matrix.getRowDimension();
}
return matrix.subtract(new Array2DRowRealMatrix(
Collections.nCopies(matrix.getRowDimension(), means).toArray(new double[0][])));
}
public static void main(String[] args) {
double[][] data = {{2.5, 2.4}, {0.5, 0.7}, {2.2, 2.9}, {1.9, 2.2}, {3.1, 3.0}};
double[][] reduced = reduceDimension(data, 1);
System.out.println("降维结果:" + Arrays.deepToString(reduced));
}
}指标 | 数值 | 说明 |
|---|---|---|
时间复杂度 | O(d²n + d³) | d:原始维度 n:样本数 |
空间复杂度 | O(d² + dn) | 存储协方差矩阵和原始数据 |
关键特性:
典型案例:
新手必练:
from sklearn.decomposition import PCA
pca = PCA(n_components=2).fit(X)高手进阶:
// 增量PCA核心逻辑
public class IncrementalPCA {
private RealMatrix components;
private int batchSize = 100;
public void partialFit(double[][] batch) {
RealMatrix batchMatrix = MatrixUtils.createRealMatrix(batch);
updateMean(batchMatrix);
updateComponents(batchMatrix);
}
private void updateMean(RealMatrix batch) {
// 增量更新均值
}
private void updateComponents(RealMatrix batch) {
// 增量更新协方差
}
}PCA教会我们:
当你能在基因组学数据中用PCA发现癌症亚型时,说明真正掌握了维度魔法的精髓——这不仅需要数学理解,更需要跨领域的洞察力。记住:PCA不是简单的降维工具,而是理解高维数据结构的钥匙,是打开数据奥秘之门的优雅之匙。