Corrcoef.java

/*
 * $Id: Corrcoef.java,v 1.11 2008/04/13 23:43:23 koga Exp $
 * 
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 */
package org.mklab.tool.matrix;

import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.scalar.DoubleNumber;


/**
 * 相関係数を求めるクラスです。
 * 
 * <p> Correlation coefficients
 * 
 * @author koga
 * @version $Revision: 1.11 $
 * @see org.mklab.tool.matrix.Cov
 */
public class Corrcoef {

  /**
   * 全ての成分の相関係数を返します。
   * 
   * @param x 行列
   * @return 全ての成分の相関係数
   */
  public static DoubleNumber corrcoef(DoubleMatrix x) {
    return corrcoefColumnWise(x.reshape(1, x.getRowSize() * x.getColumnSize())).getElement(1, 1);
  }

  /**
   * [x y]の全ての成分の相関係数を返します。
   * 
   * @param x データ1
   * @param y データ2
   * @return 全ての成分の相関係数
   */
  public static DoubleNumber corrcoef(DoubleMatrix x, DoubleMatrix y) {
    DoubleMatrix z = Makecolv.makecolv(x).appendRight(Makecolv.makecolv(y));
    return corrcoefColumnWise(z.reshape(1, z.getRowSize() * z.getColumnSize())).getElement(1, 1);
  }

  /**
   * 行列<code>x</code>(列毎に各変数のデータ並ぶ)の成分の相関係数を返します。
   * 
   * @param x データ
   * @return 自己相関係数 (correlation coefficients)
   */
  public static DoubleMatrix corrcoefColumnWise(DoubleMatrix x) {
    DoubleMatrix cv = Cov.covColumnWise(x);

    DoubleMatrix dv = cv.diagonalToVector();
    DoubleMatrix cc = cv.divideElementWise(dv.multiply(dv.conjugateTranspose()).sqrtElementWise());
    return cc;
  }

  /**
   * <code>corrcoef_col([x y])</code>と同じです。
   * 
   * @param x データ1
   * @param y データ2
   * @return 相互相関係数 (correlation coefficients)
   */
  public static DoubleMatrix corrcoefColumnWise(DoubleMatrix x, DoubleMatrix y) {
    DoubleMatrix cv = Cov.covColumnWise(x, y);

    DoubleMatrix dv = cv.diagonalToVector();
    DoubleMatrix cc = cv.divideElementWise(dv.multiply(dv.conjugateTranspose()).sqrtElementWise());
    return cc;
  }

  /**
   * 行列<code>x</code>(行毎に各変数のデータ並ぶ)の成分の相関係数を返します。
   * 
   * @param x データ
   * @return 自己相関係数 (correlation coefficients)
   */
  public static DoubleMatrix corrcoefRowWise(DoubleMatrix x) {
    return corrcoefColumnWise(x.transpose()).transpose();
  }

  /**
   * <code>corrcoef_row([x y])</code>と同じです。
   * 
   * @param x データ1
   * @param y データ2
   * @return 相互相関係数 (correlation coefficients)
   */
  public static DoubleMatrix corrcoefRowWise(DoubleMatrix x, DoubleMatrix y) {
    return corrcoefColumnWise(x.transpose(), y.transpose()).transpose();
  }

}