数据挖掘—主成分分析法降维和最小最大规范化

  • 算法步骤:
  • 1)将原始数据按列组成n行m列矩阵X
  • 2)特征中心化。即每一维的数据都减去该维的均值,使每一维的均值都为0
  • 3)求出协方差矩阵
  • 4)求出协方差矩阵的特征值及对应的特征向量
  • 5)将特征向量按对应的特征值大小从上往下按行排列成矩阵,取前k行组成矩阵p
  • 6)Y=PX 即为降维到k维后的数据

PCA


/*
 * 算法步骤:
 * 1)将原始数据按列组成n行m列矩阵X
 * 2)特征中心化。即每一维的数据都减去该维的均值,使每一维的均值都为0
 * 3)求出协方差矩阵
 * 4)求出协方差矩阵的特征值及对应的特征向量
 * 5)将特征向量按对应的特征值大小从上往下按行排列成矩阵,取前k行组成矩阵p
 * 6)Y=PX 即为降维到k维后的数据
 */
public class PCA {
   
    public static DenseMatrix64F runPCA(DenseMatrix64F src,int k) {
   

        DenseMatrix64F rs = new DenseMatrix64F(src.numRows,k);

        //计算输入矩阵每个元素和特征值平均的差值矩阵
        DenseMatrix64F norm_X = new DenseMatrix64F(src.numRows,src.numCols);

        for(int i =0;i<src.numCols;i++) {
   
            double tmp=0;
            for(int j=0;j<src.numRows;j++) {
   
                tmp+=src.get(j, i);
            }
            tmp /=src.numRows;
            for(int j=0;j<src.numRows;j++) {
   
                norm_X.set(j,i, src.get(j, i)-tmp);
            }
        }


        //计算协方差矩阵
        DenseMatrix64F norm_X_T = new DenseMatrix64F(src.numCols,src.numRows);

        CommonOps.transpose(norm_X, norm_X_T);

        DenseMatrix64F scatter_matrix = new DenseMatrix64F(src.numCols,src.numCols);

        CommonOps.mult(norm_X_T,norm_X,scatter_matrix);


        //特征向量分解
        EDInfo ed = JacobiCount(new DenseMatrix64F(scatter_matrix),0.001,1000);
        //选取前k个特征
        DenseMatrix64F feature = new DenseMatrix64F(k,src.numCols);

        for(int i=0;i<k;i++) {
   
            for(int j=0;j<src.numCols;j++) {
   
                feature.set(i, j, ed.getValues().get(j, i));
            }
        }


        DenseMatrix64F feature_T = new DenseMatrix64F(src.numCols,k);

        CommonOps.transpose(feature, feature_T);


        CommonOps.mult(norm_X,feature_T,rs);

        return rs;
    }
    public static EDInfo JacobiCount(DenseMatrix64F src, double diff, int iter) {
   

        DenseMatrix64F values = new DenseMatrix64F(src.numRows,src.numCols);

        for(int i=0;i<src.numRows;i++) {
   
            for(int j=0;j<src.numCols;j++) {
   
                if(i == j) {
   
                    values.set(i, j, 1);
                }else {
   
                    values.set(i, j, 0);
                }
            }
        }

        int nCount = 0;

        while(true)
        {
   

            double dbMax = Double.MIN_VALUE;
            int nRow = 0;
            int nCol = 1;

            for(int i=0;i<src.numRows;i++) {
   
                for(int j=0;j<src.numCols;j++) {
   
                    if(i != j && Math.abs(src.get(i, j)) &g
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值