Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find correlation between two integer arrays in java

I am searching a lot but could not find exactly what i need till now. I have two integer arrayas int[] x and int[] y. I want to find simple linear correlation between these two integer arrays and it should return the result as double. In java do you know any library function providing this or any code snippet?

like image 210
Surjya Narayana Padhi Avatar asked Feb 10 '15 09:02

Surjya Narayana Padhi


People also ask

How do you compare two arrays equal in Java?

Arrays. equals(Object[] a, Object[] a2) method returns true if the two specified arrays of objects are equal to one another. The two arrays are considered equal if both arrays contain the same number of elements, and all corresponding pairs of elements in the two arrays are equal.

How do you find the correlation between two variables in a set of data?

The Pearson's correlation coefficient is calculated as the covariance of the two variables divided by the product of the standard deviation of each data sample. It is the normalization of the covariance between the two variables to give an interpretable score.


2 Answers

There is nothing in core Java. There are libraries out there you can use. Apache Commons has a statistical project, check PearsonCorrelation class.

Sample code:

public static void main(String[] args) {
    double[] x = {1, 2, 4, 8};
    double[] y = {2, 4, 8, 16};
    double corr = new PearsonsCorrelation().correlation(y, x);

    System.out.println(corr);
}

prints out 1.0

like image 148
Hamed Moghaddam Avatar answered Oct 09 '22 03:10

Hamed Moghaddam


Correlation is quite easy to compute manually:

http://en.wikipedia.org/wiki/Correlation_and_dependence

  public static double Correlation(int[] xs, int[] ys) {
    //TODO: check here that arrays are not null, of the same length etc

    double sx = 0.0;
    double sy = 0.0;
    double sxx = 0.0;
    double syy = 0.0;
    double sxy = 0.0;

    int n = xs.length;

    for(int i = 0; i < n; ++i) {
      double x = xs[i];
      double y = ys[i];

      sx += x;
      sy += y;
      sxx += x * x;
      syy += y * y;
      sxy += x * y;
    }

    // covariation
    double cov = sxy / n - sx * sy / n / n;
    // standard error of x
    double sigmax = Math.sqrt(sxx / n -  sx * sx / n / n);
    // standard error of y
    double sigmay = Math.sqrt(syy / n -  sy * sy / n / n);

    // correlation is just a normalized covariation
    return cov / sigmax / sigmay;
  }
like image 29
Dmitry Bychenko Avatar answered Oct 09 '22 03:10

Dmitry Bychenko