IDL只能通过调用envi的二次接口做图像的变换,但是对于普通的数据没有提供函数。根据主成分变换的原理,用IDL写出来了,这样就不用每次再去用matlab的princomp去做了。主成分变化的基本过程:
(1)把原始数据中每个样本用一个向量表示,然后把所有样本组合起来构成一个矩阵。当然了,为了避免样本的单位的影响,样本集需要标准化。
(2)求该矩阵的协防差矩阵
(3)求步骤2中得到的协方差矩阵的特征值和特征向量。
(4)将求出的特征向量按照特征值的大小进行组合形成一个映射矩阵。
(5)用步骤4的映射矩阵对标准化后的原始数据进行映射。
 
IDL代码:
;+
; :AUTHOR: Cao zhigang
; :Copyright:CAS-NIGLAS
; :email:zhigang_niglas@163.com
; :blog:blog.sina.com.cn/ahnucao
;-
 
 
PRO PRINCOMP,IN_DATA = in_data,LOADINGS = loadings,SCORES = scores,LATENT = latent
 
  ; Principal component analysis (PCA) on data
  ; 
  ; IN_DATA: n*p matrix as input,n-observations, p-variables.
  ; LOADINGS is a p-by-p matrix
  ; LATENT: a vector containing the eigenvalues of the covariance matrix of IN_DATA
  ; SCORES: the principal component scores
 
  ; Attention: the structure of array in IDL is: col * row, must transpose the matrix according to actual situation.
  ;
  ;
  ; To determin the deminsions of in_data
 
  IF N_ELEMENTS(SIZE(in_data,/dimension)) NE 2 THEN BEGIN
    PRINT,'Input data must be 2-d form.'
    RETURN
  ENDIF
  ;
  ; Get the col and row
  ;
  dims = SIZE(in_data,/dimensions)
  col = dims[0]
  row = dims[1]
  ;------------------------PCA----------------------------------------------
  ;
  ;1. Normalize the data,i.e., to minus the mean of every column
 
  avg = FLTARR(col)
  avg = MEAN(in_data,dimension = 2); Get the mean values of every column
 
  nor_data = FLTARR(col,row)
  ; Normalize
  FOR i=0,col-1 DO BEGIN
    nor_data[i,*] = in_data[i,*] - avg[i]
  ENDFOR
 
  ;2 Get covariance matrix
  cov = IMSL_COVARIANCES(TRANSPOSE(nor_data))
 
  ;3 Calc eigvalues and eig-vector by IMSL Advanced Math and Statistics
  eig = IMSL_EIG(cov,vector = eig_matrix)
  ; 
  scores = nor_data##FLOAT(eig_matrix)
  ;
  latent = FLOAT(eig)
  loadings =FLOAT(eig_matrix)
END
 
测试:
 
PRO TEST_PRINCOMP
  ;
  x1 = [2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1]
  x2 = [2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9]
  x = [[x1],[x2]]
  PRINCOMP,in_data = TRANSPOSE(x),loadings = loadings,scores= scores,latent= latent
  HELP,loadings,scores,latent
  PRINT,loadings,STRING(13b)
  PRINT,scores,STRING(13b)
  PRINT,latent,STRING(13b)
END
输出结果:
0.677873     0.735179
     0.735179    -0.677873
 
 
     0.827970     0.175115
     -1.77758    -0.142857
     0.992198    -0.384375
     0.274210    -0.130417
      1.67580     0.209498
     0.912949    -0.175282
   -0.0991096     0.349825
     -1.14457   -0.0464174
    -0.438046   -0.0177647
     -1.22382     0.162675
 
 
      1.28403    0.0490834
和matlab的结果对比,基本一样。但是大量数据的测试还未进行。

IDL实现主成分变化(PCA)的更多相关文章

  1. 【笔记】求数据的对应主成分PCA(第一主成分)

    求数据的第一主成分 (在notebook中) 将包加载好,再创建出一个虚拟的测试用例,生成的X有两个特征,特征一为0到100之间随机分布,共一百个样本,对于特征二,其和特征一有一个基本的线性关系(为什 ...

  2. IDL 实现PCA算法

    在多元统计分析中,主成分分析(Principal components analysis,PCA)是一种分析.简化数据集的技术.主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特 ...

  3. 13机器学习实战之PCA(1)

    降维技术 对数据进行降维有如下一系列的原因: 使得数据集更容易使用 降低很多算法的计算开销 去除噪音 使得结果易懂 在以下3种降维技术中, PCA的应用目前最为广泛,因此本章主要关注PCA. 主成分分 ...

  4. Spark2 oneHot编码--标准化--主成分--聚类

    1.导入包 import org.apache.spark.sql.SparkSession import org.apache.spark.sql.Dataset import org.apache ...

  5. 机器学习:PCA(人脸识别中的应用——特征脸)

    一.思维理解 X:原始数据集: Wk:原始数据集 X 的前 K 个主成分: Xk:n 维的原始数据降维到 k 维后的数据集: 将原始数据集降维,就是将数据集中的每一个样本降维:X(i) . WkT = ...

  6. 机器学习(七) PCA与梯度上升法 (上)

    一.什么是PCA 主成分分析 Principal Component Analysis 一个非监督学的学习算法 主要用于数据的降维 通过降维,可以发现更便于人类理解的特征 其他应用:可视化:去噪 第一 ...

  7. PCA 在手写数字数据集上的应用

    在 skilearn 的手写数据集中,每个数据点都是 0 到 9 之间手写数字的一张 8*8 灰度图像.用 PCA 将其降维到二维,并可视化数据点,如下: 1.digits 数据演示: from sk ...

  8. 4.pca与梯度上升法

    (一)什么是pca pca,也就是主成分分析法(principal component analysis),主要是用来对数据集进行降维处理.举个最简单的例子,我要根据姓名.年龄.头发的长度.身高.体重 ...

  9. 【笔记】求数据前n个主成分以及对高维数据映射为低维数据

    求数据前n个主成分并进行高维数据映射为低维数据的操作 求数据前n个主成分 先前的将多个样本映射到一个轴上以求使其降维的操作,其中的样本点本身是二维的样本点,将其映射到新的轴上以后,还不是一维的数据,对 ...

随机推荐

  1. yum版本新增包的一般步骤

    在Jekins的自动构建环境中,有时会有在构建出的ISO中添加新应用app需求,对于采用rpm包源代码管理方式的构建环境来说,基本步骤如下: 1.下载app的src.rpm包 2.解压src.rpm包 ...

  2. python【第九篇】多线程、多进程

    内容提要 paramiko模块 进程.与线程区别 python GIL全局解释器锁 多线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生 ...

  3. 【算法】简单选择排序 O(n^2) 不稳定的 C语言

    简单选择排序 一.算法描述 假设序列中有N个元素: 第1趟找到第1到N个元素之间最小的一个,与第1个元素进行交换 第2趟找到第2到N个元素之间最小的一个,与第2个元素进行交换 第3趟找到第3到N个元素 ...

  4. ConnectifyHotspotInstaller3.7注册码

    ConnectifyHotspotInstaller3.7注册码 邮箱: wcxu21@126.com 密 钥:QEX4HR-9VLS2N-AXFA3A-K8CD8M-1DQ7Q1-CCDDTB-KL ...

  5. eclipse中tomcat内存溢出问题,报PermGen space

    场景 最近在eclipse中的tomcat服务器下放三个不同的应用程序,其中两个应用程序用到了各自的第三方jar包.刚开始时把这三个应用程序分别部署到各自的tomcat服务器运行,没问题.后来想通过第 ...

  6. 快学Scala第一部分

    转载: 1.变量声明 val answer = 8 * 5 + 2; //常量 var counter = 0;    //变量 //在必要的时候 ,可以指定类型 val greeting:Strin ...

  7. 从ulimit命令看socket的限制

      从ulimit命令看socket的限制 在Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题,比如还有Squid做代理,当文 ...

  8. 【转】中兴G718C卡刷刷机教程(青漾2 4G)--不错

    原文网址:http://www.zterom.com/guide/2278.html 刷机包 B11纯净版 适合长久使用_B11_lite_0130.zip 刷机用了20多分钟. 在和大家分享过中兴G ...

  9. select的使用(一)

    单表操作 select Name,Major,InDate from T_Employee as 计算结果 select Name as 姓名,Major,InDate from T_Employee ...

  10. poj 2408 Apple Tree

    http://poj.org/problem?id=2486 典型的回溯题目:特别是状态方程用三维的来标记是否要走回路. 题意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走 ...