皮尔逊相关系数JAVA实现

来源:互联网 发布:studio2303a扫描软件 编辑:程序博客网 时间:2024/06/05 12:48
      经常需要计算皮尔森相关系数,在网上借鉴了算法和程序,不够理想,改进后,共享在这里,方便需要计算相关系数的使用。
import java.util.List;/** * 计算两个样本数据之间的皮尔逊相关系数 */public class PearsonCorrelation {public static void main(String[] args) {test();}private static void test(){/*用于测试*/double[] x = new double[] { 0.98, 0.96, 0.96, 0.94, 0.925, 0.9025, 0.875 };double[] y = new double[] { 1, 1, 1, 1, 0.961483893, 0.490591662, 0.837341784 };double score = getPearsonCorrelationScore(x, y);System.out.println(score);//0.6350393282549671}public static double getPearsonCorrelationScore(List x, List y) {if (x.size() != y.size())throw new RuntimeException("数据不正确!");double[] xData = new double[x.size()];double[] yData = new double[x.size()];for (int i = 0; i < x.size(); i++) {xData[i] = x.get(i);yData[i] = y.get(i);}return getPearsonCorrelationScore(xData,yData);}public static double getPearsonCorrelationScore(double[] xData, double[] yData) {if (xData.length != yData.length)throw new RuntimeException("数据不正确!");double xMeans;double yMeans;double numerator = 0;// 求解皮尔逊的分子double denominator = 0;// 求解皮尔逊系数的分母double result = 0;// 拿到两个数据的平均值xMeans = getMeans(xData);yMeans = getMeans(yData);// 计算皮尔逊系数的分子numerator = generateNumerator(xData, xMeans, yData, yMeans);// 计算皮尔逊系数的分母denominator = generateDenomiator(xData, xMeans, yData, yMeans);// 计算皮尔逊系数result = numerator / denominator;return result;}/** * 计算分子 *  * @param xData * @param xMeans * @param yData * @param yMeans * @return */private static double generateNumerator(double[] xData, double xMeans, double[] yData, double yMeans) {double numerator = 0.0;for (int i = 0; i < xData.length; i++) {numerator += (xData[i] - xMeans) * (yData[i] - yMeans);}return numerator;}/** * 生成分母 *  * @param yMeans * @param yData * @param xMeans * @param xData * @return 分母 */private static double generateDenomiator(double[] xData, double xMeans, double[] yData, double yMeans) {double xSum = 0.0;for (int i = 0; i < xData.length; i++) {xSum += (xData[i] - xMeans) * (xData[i] - xMeans);}double ySum = 0.0;for (int i = 0; i < yData.length; i++) {ySum += (yData[i] - yMeans) * (yData[i] - yMeans);}return Math.sqrt(xSum) * Math.sqrt(ySum);}/** * 根据给定的数据集进行平均值计算 *  * @param datas数据集 * @return 给定数据集的平均值 */private static double getMeans(double[] datas) {double sum = 0.0;for (int i = 0; i < datas.length; i++) {sum += datas[i];}return sum / datas.length;}}
原创粉丝点击