java實現(xiàn)獨立性檢驗

描述

用于兩個分類變量間的比較。

Demo

package com.math.demo;

import java.util.HashMap;
import java.util.Map;

import com.math.statistics.IndependenceTest;

public class IndependenceDemo {

    public static void main(String[] args) {
        Map<String, Double> map1=new HashMap<String, Double>();
        map1.put("a", 51.0);
        map1.put("b", 56.0);
        map1.put("c", 25.0);
        Map<String, Double> map2=new HashMap<String, Double>();
        map2.put("a", 39.0);
        map2.put("b", 21.0);
        map2.put("c", 8.0);
        IndependenceTest it=new IndependenceTest(map1,map2);
        System.out.println(it.getPValue());

    }

}

實現(xiàn)代碼

package com.math.statistics;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import JSci.maths.statistics.ChiSqrDistribution;
/***
 * @author miaoyibo
 *
 */
public class IndependenceTest {

    private Map<String, Double> map1;

    private Map<String, Double> map2;

    public IndependenceTest(Map<String, Double> map1, Map<String, Double> map2) {
        super();
        this.map1 = map1;
        this.map2 = map2;
    }

    public double getSum() {
        double sum1 = map1.values().stream().reduce(Double::sum).orElse((double) 0);
        double sum2 = map2.values().stream().reduce(Double::sum).orElse((double) 0);
        return sum1 + sum2;
    }

    public double getMap1Sum() {
        return map1.values().stream().reduce(Double::sum).orElse((double) 0);
    }

    public double getMap2Sum() {
        return map2.values().stream().reduce(Double::sum).orElse((double) 0);
    }

    /**
     * 2為map的數(shù)量
     * 
     * @return
     */
    public double getDegreesOfFreedom() {
        return (map1.keySet().size() - 1) * (2 - 1);
    }

    public Map<String, Double> getScale() {
        Set<String> keySet = map1.keySet();
        Map<String, Double> scale = new HashMap<String, Double>();
        for (String key : keySet) {
            scale.put(key, (map1.get(key) + map2.get(key)) / getSum());
        }
        return scale;
    }

    public double getPValue() {
        double map1Sum = getMap1Sum();
        double map2Sum = getMap2Sum();
        double x = 0;
        Map<String, Double> scale = getScale();
        Set<String> keySet = map1.keySet();
        for (String key : keySet) {
            double sampleValue1 = map1.get(key);
            double expectValue1 = map1Sum * scale.get(key);
            double map1KeyFre = ((sampleValue1 - expectValue1) * (sampleValue1 - expectValue1)) / expectValue1;

            double sampleValue2 = map2.get(key);
            double expectValue2 = map2Sum * scale.get(key);
            double map2KeyFre = ((sampleValue2 - expectValue2) * (sampleValue2 - expectValue2)) / expectValue2;

            x = x + map1KeyFre + map2KeyFre;

        }
        ChiSqrDistribution cd = new ChiSqrDistribution(getDegreesOfFreedom());
        return 1 - cd.cumulative(x);
    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 很難得江南水鄉(xiāng)飄來了雪精靈的愿望,絲絲點點,纖纖蕭蕭地滑進了大街小巷。昭示著冬天的訊息的雪兒們飄飛如柳絮的...
    幼瀾閱讀 296評論 0 0
  • 根據(jù)鎮(zhèn)委、鎮(zhèn)政府有關(guān)“全民禁毒工程”的工作要求,為切實加強禁毒巡查工作全面、深入的開展,有效遏制毒品的滲透蔓...
  • 人為什么要改掉缺點——因為你不知道,那些你習以為常的行為,什么時候突然就寒了某一個人的心
    煙水袖閱讀 228評論 0 0

友情鏈接更多精彩內(nèi)容