Alink's Talk (20): анализ исходного кода критерия хи-квадрат
[ToC]
0x00 сводка
Alink — это платформа алгоритмов машинного обучения нового поколения, разработанная Alibaba на основе вычислительного движка реального времени Flink, и первая в отрасли платформа машинного обучения, которая поддерживает как пакетные, так и потоковые алгоритмы. В этой статье вы проанализируете реализацию теста хи-квадрат в Alink.
Поскольку общедоступная информация Alink слишком мала, нижеследующее - все предположения, и обязательно будут упущения и ошибки. Я надеюсь, что все укажут, и я обновлю их в любое время.
0x01 Фоновая концепция
проблема: Сяомин на юге собирается учиться в Пекине Родители Сяомина беспокоятся, сможет ли он привыкнуть к жизни на севере? Можно ли есть только лапшу? Они выдвинули в своем уме много-много предположений, все ли они нуждаются в проверке?
1.1 Проверка гипотез
Статистические предположения относятся к нашим догадкам или суждениям о населении, например, популярное географическое деление Китая, едят ли северяне макароны? Все Цзянсу и Чжэцзян любят есть сладкое? Девочки в Цзяннане добродушные? Все мальчики на севере большие?
Чтобы доказать или быть абсолютно уверенным в том, что определенная гипотеза верна или неверна, нам нужны абсолютные знания, а это означает, что нам нужно проверить все образцы, например, спросить всех северян, едят ли они макароны, или спросить Цзянсу и Чжэцзян. Девочки никогда не дерутся?
Но мы не можем сосчитать все образцы.
Проверка гипотез была создана для решения этой проблемы с использованием случайной выборки для определения правдоподобности гипотезы.
Это исходит из основной идеи, то есть статистика должна вывести совокупность из ограниченной выборки. Поскольку нам невозможно знать все выборки, иными словами, нам невозможно знать статистические свойства совокупности, то мы можем возиться только с ограниченной выборкой.
Проверка гипотез основана на принципе малой вероятности событий. Маловероятное событие — это вероятность наступления события, которое из-за своей малой вероятности практически невозможно произойти в одном испытании. Например, если взять в качестве примера наш жизненный опыт, шансы выиграть в лотерею, просто купив лотерейный билет, очень малы, поэтому я не видел сообщений о покупке лотерейного билета и выигрыше в лотерею время от времени.
1.2 Что такое H0 и H1?
Верны ли предположения родителей Сяо Мина? Правильно — это один результат, неправильно — это другой. При проверке гипотез у нас также есть две части: одна называется H0, а другая — H1.
Н — первая буква английского слова «гипотеза», Н0 — нулевая гипотеза, а Н1 — альтернативная гипотеза. Другими словами, мы хотим выбрать одну из двух гипотез, хотя этот «выбор» не является «выбором одной» в обычном смысле.
- Нулевая гипотеза H0 также называется нулевой гипотезой.Вообще говоря, мы называем гипотезу, против которой мы хотим собрать доказательства, гипотезой 0. Например, солнце вращается вокруг земли, а птицы не могут летать. H0 Сяо Мина здесь - «на севере нет риса», чего родители Сяо Мина не хотели и хотели отказаться.
- H1 также называют альтернативной гипотезой.Вообще говоря, мы все надеемся, что альтернативная гипотеза верна, то есть H1 верна.Например, родители Сяо Мина надеются, что север тоже ест.
H0 и H1 не взаимозаменяемы, но выбранный принцип H0H0 должна быть гипотезой, которую можно отвергнуть.. Для задачи проверки гипотез, еслиH1 — гипотеза, которую нельзя отвергнуть., то H0 и H1 не взаимозаменяемы.
Какая гипотеза H1 не может быть отвергнута? Например, следующий вопрос: общий балл — это тестовые баллы всех учащихся класса одновременно, исходная гипотеза состоит в том, что Н0 — средний балл всего класса — 80 баллов, а Н1 — средний балл всего класса. класс не 80 баллов. В этой структуре H0 — это гипотеза, которую можно отвергнуть, а H1 — гипотеза, которую нельзя отвергнуть.
Почему ты это сказал? Если H0 выбирает быть одноклассником, чья средняя оценка не 80 баллов, то даже если вы знаете оценки почти всех в классе, вы можете также думать, что средняя оценка составляет 80 баллов. оценки одного человека, то вам важно знать оценки других.Отказ от H0 не помогает. Только когда у человека ровно 80 баллов, нулевая гипотеза не устанавливается, у человека 81 или 79, нулевая гипотеза устанавливается. С другой точки зрения, также можно считать, что, когда H0 является гипотезой, которую нельзя отвергнуть, H0 слишком широк, чтобы быть неотличимым от H1.
В целом результаты проверки гипотез выглядят следующим образом:
- H0 неправильно, H1 правильно (в профессиональном плане это означает принятие H1 и отклонение H0, потому что образцов достаточно для поддержки H1. Например, родители Сяомина опросили 5 или 6 человек, которые уехали учиться на север, и все они сказали что в столовке лапша очень вкусная.Есть рис.Можно сказать что север тоже ест).
- H1 неверен (в профессиональном плане H0 не отвергается, потому что недостаточно доказательств. Родители Сяомина спросили 5 человек, которые уехали учиться на север, и 1 сказал, что в столовой есть и лапша, и рис. В столовой есть? .)
Следует отметить одну вещь: невозможность отвергнуть H0 не означает, что H0 истинна, но что у нас недостаточно доказательств для доказательства H1. Мы часто слышим в суде, что доказательств недостаточно и оправдательный приговор, но виновен этот человек или нет, все равно стоит вопросительный знак.
1.3 P-значение (P-значение)
P-значение, также известное как P-значение. Р-значение — это вероятность того, чтоВероятность того, что результат выборки будет получен при условии, что гипотеза H0 верна.. которыйp-значения рассчитываются на основе нулевой гипотезы.
Если P-значение мало, это означает, что при допущении, что нулевая гипотеза верна, вероятность появления результатов выборки очень мала, даже экстремальна, что, в свою очередь, показывает, что нулевая гипотеза, скорее всего, ошибочна.
С другой точки зрения, p-значение — это также вероятность отбрасывания истинной ошибки.То есть, если это предположение выполняется, вероятность этого плохого результата, которая, конечно же, является вероятностью ошибки, если h0 будет отклонено в это время. Пока значение p достаточно мало, мы думаем, что h0 в этот момент отбрасывается, а вероятность ошибки очень мала, поэтому мы просто отбрасываем h0.
Обычно уровень значимости (альфа) устанавливается для сравнения со значением P. Если значение P
Если мы сравним, есть ли различия в пищевых вкусах мужчин и женщин в определенном регионе, то H0 будет «мужчины и женщины имеют одинаковые пищевые вкусы, и нет никакой разницы».
Наконец получилP=0.283> 0,05, нулевая гипотеза не отвергается при уровне α=0,05, то есть нельзя считать, что пищевые вкусы мужчин и женщин в регионе различны.
1.4 Кросс-таблица
В статистике перекрестная таблица представляет собой таблицу в матричном формате, которая отображает (многомерное) частотное распределение переменной.
Объект Crosstab — это сетка, которая возвращает значения на основе заданных критериев. Данные отображаются в сжатых строках и столбцах. Этот формат позволяет легко сравнивать данные и выявлять тенденции. Он состоит из трех элементов: строка/столбец/поле сводки.
Проиллюстрируем на примере:
предводитель конной армии | начальник пехоты | |
---|---|---|
Эрлонгшан | 1 | 6 |
Гора Шаохуа | 3 | 0 |
- Строки в кросс-таблице простираются горизонтально (из стороны в сторону). В приведенном выше примере «Гора Эрлонг» — это одна строка.
- Столбцы кросс-таблицы располагаются вертикально (вверх и вниз). В приведенном выше примере «Командир конной армии» — это столбец.
- Поля сводки находятся на пересечении строк и столбцов. Значение на каждом пересечении представляет собой сводку (сумму, количество и т. д.) записей, удовлетворяющих условиям как строки, так и столбца. В приведенном выше примере значение на пересечении «Гора Эрлонг» и «Лидер Маджун» равно 1, что соответствует количеству лидеров Маджун на горе Эрлонг.
Приведенная выше перекрестная таблица основана на перекрестной классификации двух переменных. Таблица сопряженности называется двумерной таблицей сопряженности. Если она перекрестно классифицируется по трем переменным, результирующая таблица сопряженности называется трехмерной таблицей сопряженности. , и так далее. Таблицу непредвиденных обстоятельств с тремя измерениями и выше обычно называют «многомерной таблицей непредвиденных обстоятельств» или «таблицей непредвиденных обстоятельств с большим числом измерений», а одномерную таблицу непредвиденных обстоятельств называют таблицей частотного распределения.
1,5 хи-квадрат
Таблица, полученная перекрестной классификацией, называется "таблицей сопряженности", и для статистического вывода (теста) следует использовать метод анализа таблицы сопряженности - критерий хи-квадрат.
Критерий хи-квадрат в основном используется для проверки степени отклонения между фактически наблюдаемым значением статистической выборки и теоретически выведенным значением, илипроверить, соответствует ли пакет данных теоретическому распределению.
В документе Alink дается следующее: критерий независимости хи-квадрат — это вопрос о том, влияют ли два фактора (каждый из двух или более категорий) друг на друга, и нулевая гипотеза состоит в том, что эти два фактора независимы друг от друга.
1.5.1 Формула
Значение хи-квадратиспользуется в тесте хи-квадратСтатистика испытаний, чем больше значение хи-квадрат, тем больше отклонение между наблюдаемым значением и теоретическим значением, и, наоборот, тем меньше отклонение между ними. В практических приложениях значение P можно рассчитать на основе значения хи-квадрат, чтобы отклонить или принять нулевую гипотезу.
Формула выглядит следующим образом:
1.5.2 Основная идея
Самая основная идея теста хи-квадрат состоит в том, чтобы определить, верна ли теория, наблюдая отклонение между фактическим значением и теоретическим значением.
При этом часто предполагается, что две переменные действительно независимы (на жаргоне это называется «нулевой гипотезой»), а затем наблюдают фактическое значение (также называемое наблюдаемым значением) и теоретическое значение (это теоретическое значение означает « если они действительно независимы", степень отклонения от значения, которое должно быть).
- Если отклонение достаточно мало, мы считаем ошибку естественной ошибкой выборки, вызванной неточными методами измерения или случайностью, и они действительно независимы, и в это время принимается нулевая гипотеза.
- Если систематическая ошибка достаточно велика, чтобы такая ошибка вряд ли была вызвана случайностью или неточным измерением, мы считаем, что эти два факта на самом деле связаны, то есть отклоняем нулевую гипотезу и принимаем альтернативную гипотезу.
1.5.3 Процесс реализации
Методы анализа хи-квадрат:
- Предположим, что две переменные независимы и не связаны друг с другом. Это статистически называется нулевой гипотезой;
- Для данных двух переменных, полученных в ходе обследования, используйте таблицу для представления их распределения (частоты и процента), где частота называется частотой наблюдения, а эта таблица называется таблицей сопряженности;
- Если нулевая гипотеза верна, в соответствии с этой предпосылкой вы можете рассчитать, какой должна быть частота каждой сетки в приведенной выше таблице непредвиденных обстоятельств, которая называется ожидаемой частотой;
- Сравните разницу между наблюдаемой частотой и ожидаемой частотой.Если разница между ними больше, это указывает на то, что фактическая ситуация далека от исходной гипотезы; чем меньше разница, тем ближе фактическая ситуация к исходной гипотезе. Эта разница представлена статистикой хи-квадрат;
- Проверьте значение хи-квадрат.Если результат теста хи-квадрат незначителен, нулевая гипотеза не может быть отклонена, то есть две переменные независимы и не связаны друг с другом.Если результат теста хи-квадрат значима, нулевая гипотеза отклоняется, то есть между двумя переменными существует определенная связь, и то, как она связана, зависит от распределения данных в таблице сопряженности.
Конкретный процесс реализации:
- Согласно шагам проверки гипотезы, сначала нам нужно определить нулевую гипотезу H0 (нулевую гипотезу): нулевая гипотеза состоит в том, что переменные независимы, а фактическая наблюдаемая частота согласуется с теоретической частотой.
- Во-вторых, мы находим теоретическую таблицу соединений в соответствии с таблицей соединений фактического наблюдения, статистическое значение хи-квадрата: X2, записанное как статистика;
- Затем выберите соответствующую степень достоверности (обычно 95%) и определите критическое значение вместе со степенью свободы и сравните статистическое значение хи-квадрат и критическое значение:
- Если статистика >= критическое значение: считается, что переменная влияет на результат, нулевая гипотеза отклоняется, и переменная не является независимой.
- Если статистика
1.6 Степени свободы
** Степени свободы: ** Количество переменных с неограниченными значениями.
Как понять это простое предложение? Имея набор данных, давайте вычислим другую статистику, чтобы увидеть, как изменяются степени свободы. Эти данные представляют собой числа 1 2 4 6 8,5 соответственно.
Давайте сначала найдем среднее.Эти данные можно произвольно изменить на другие данные, и мы все еще можем их усреднить, и их средние значения также изменятся. В это время степень свободы равна 5, что означает наличие нескольких степеней свободы данных.
Степени свободы для критерия хи-квадрат:
1) Если это тест на независимость, то степени свободы равны (a-1)*(b-1), а b представляет собой соответствующее количество классификаций двух тестовых условий.
2) Тест на пригодность, из числа категорий вычесть 1. Это эквивалентно только одному ограничению.
Критерий хи-квадрат использует только степени свободы при просмотре таблицы с помощью перьевых вычислений.При программном расчете не нужно беспокоиться об этой проблеме, но лучше понимать, что степени свободы представляют собой общее количество переменных за вычетом количества ограничений. .
0x02 Пример кода
Пример кода этой статьи выглядит следующим образом.Здесь следует отметить, что:
- «col1», «col2» — выбранные столбцы;
- «col4» — метка;
public class ChiSquareTestBatchOpExample {
public static void main(String[] args) throws Exception {
Row[] testArray =
new Row[]{
Row.of("a", 1.1, 1.2, 1),
Row.of("b", 0.9, 1.0, -2),
Row.of("c", -0.01, 1.0, 100),
Row.of("d", 100.9, 0.1, -99),
Row.of("a", 1.1, 1.2, 1),
Row.of("b", 0.9, 1.0, -2),
Row.of("c", -0.01, 0.2, 100),
Row.of("d", 100.9, 0.3, -99)
};
String[] colNames = new String[]{"col1", "col2", "col3", "col4"};
MemSourceBatchOp source = new MemSourceBatchOp(Arrays.asList(testArray), colNames);
ChiSquareTestBatchOp test = new ChiSquareTestBatchOp()
.setSelectedCols("col1","col2")
.setLabelCol("col4");
test.linkFrom(source).print();
}
}
Результат выглядит следующим образом:
col|chisquare_test
---|--------------
col1|{"comment":"chi-square test","df":9.0,"p":0.004301310843500827,"value":24.0}
col2|{"comment":"chi-square test","df":9.0,"p":0.004301310843500827,"value":24.0}
Преобразовал в схему для лучшего понимания:
col | chisquare_test |
---|---|
col1 | {"comment":"chi-square test","df":9.0,"p":0.004301310843500827,"value":24.0} |
col2 | {"comment":"chi-square test","df":9.0,"p":0.004301310843500827,"value":24.0} |
df — степень свободы, p — значение p, а value — значение хи-квадрат, о котором мы упоминали ранее, то есть
0x03 Общая логика
Общая логика обучения следующая:
- Используйте flatMap, чтобы свести данные к утроению. Пройдите входную строку, а затем сгладьте строку, чтобы получить тройку
. Например, в соответствии с вводом Row.of("b", 0.9, 1.0, -2), тогда row = {Row@9419} "b,0,9,-2", потому что col1, col2 являются признаками, а col4 — метка, тогда отправка двух троек — , ; - Используйте toTable для преобразования ранее обработанного набора данных для создания табличных данных. {"col", "feature", "label"} соответствует нашей предыдущей тройке;
- Вычислить кросс-таблицу и проверить данные по хи-квадрату;
- groupBy("col,feature,label") для классификации и сортировки;
- select("col,feature,label,count(1) as count2")), чтобы получить количество функций как count2;
- groupBy("col").reduceGroup Затем отсортируйте и объедините в соответствии с col;
- Получить
: "количество объектов" на этой карте; - Crosstab.convert(map) использует карту для создания перекрестных таблиц;
- Получить
- map(new ChiSquareTestFromCrossTable()) использует кросс-таблицу для построения теста хи-квадрат;
- Здесь вычисляется test(crossTabWithId), который вызывает org.apache.commons.math3.distribution.GammaDistribution.cumulativeProbability для расчета гаммы;
0x04 обучение
Все еще старая процедура, перейдите прямо к функции linkFrom ChiSquareTestBatchOp.
Код сокращен, но изначально он очень прост: получите «выбранный столбец» и «столбец Y», а затем используйте входные данные для обучения и тестирования.
Трудно смотреть глубже.
public ChiSquareTestBatchOp linkFrom(BatchOperator<?>... inputs) {
BatchOperator<?> in = checkAndGetFirst(inputs);
String[] selectedColNames = getSelectedCols();
String labelColName = getLabelCol();
this.setOutputTable(ChiSquareTestUtil.buildResult(
ChiSquareTestUtil.test(in, selectedColNames, labelColName),
selectedColNames,
getMLEnvironmentId()));
return this;
}
Наконец, вы войдете в ChiSquareTest.test, который является настоящей главой.
public static DataSet<Row> test(BatchOperator in,
String[] selectedColNames,
String labelColName) {
in = in.select(ArrayUtils.add(selectedColNames, labelColName));
return ChiSquareTest.test(in.getDataSet(), in.getMLEnvironmentId());
}
4.1 ChiSquareTest
Вход и выход его тестовой функции:
- Входные данные: последний столбец in — это метка, а остальные столбцы — это столбцы выбранных признаков;
- Вывод: есть три столбца, 1-й — colId, 2-й — pValue, 3-й — значение хи-квадрат;
Общая логика здесь такая:
- Используйте flatMap, чтобы свести данные к утроению. Пройдите входную строку, а затем сгладьте строку, чтобы получить тройку
; - Используйте toTable для преобразования ранее обработанного набора данных для создания табличных данных. {"col", "feature", "label"} соответствует нашей предыдущей тройке;
- Вычислить кросс-таблицу и проверить данные по хи-квадрату;
Конкретный код выглядит следующим образом:
protected static DataSet<Row> test(DataSet<Row> in, Long sessionId) {
//flatting data to triple.
//这里就是遍历输入Row,然后把Row给flat了,得到三元组<idx in row, value in row, y-label>
//比如 对应输入 Row.of("b", 0.9, 1.0, -2),则row = {Row@9419} "b,0,9,-2",因为col1, col2是特征,col4是 label,则发送两个三元组是 <0, b, -2>, <1, 0.9, -2>
DataSet<Row> dataSet = in
.flatMap(new FlatMapFunction<Row, Row>() {
@Override
public void flatMap(Row row, Collector<Row> result) {
int n = row.getArity() - 1;
String nStr = String.valueOf(row.getField(n));
for (int i = 0; i < n; i++) {
Row out = new Row(3);
out.setField(0, i);
out.setField(1, String.valueOf(row.getField(i)));
out.setField(2, nStr);
result.collect(out);
}
}
});
// 把前面处理的dataSet再进行转换,生成一张表。{"col", "feature", "label"} 就对应着我们之前的三元组
Table data = DataSetConversionUtil.toTable(
sessionId,
dataSet,
new String[]{"col", "feature", "label"},
new TypeInformation[]{Types.INT, Types.STRING, Types.STRING});
// 对 data 进行 计算交叉表 和 卡方校验
//calculate cross table and chiSquare test.
return DataSetConversionUtil.fromTable(sessionId, data
.groupBy("col,feature,label") //分类排序
.select("col,feature,label,count(1) as count2")) // 为了得出 feature 的个数作为count2
.groupBy("col").reduceGroup( // 再根据col排序
new GroupReduceFunction<Row, Tuple2<Integer, Crosstab>>() {
@Override
public void reduce(Iterable<Row> iterable, Collector<Tuple2<Integer, Crosstab>> collector) {
Map<Tuple2<String, String>, Long> map = new HashMap<>();
int colIdx = -1;
for (Row row : iterable) {
// 假如有如下,row = {Row@9684} "0,a,1,2",他对应了两个 Row.of("a", 1.1, 1.2, 1), 就是 <col,feature,label,count(1)>, 就是 <'a'是第0列,'a',对应 y-label是 1, 'a' 有两个>
map.put(Tuple2.of(row.getField(1).toString(),
row.getField(2).toString()),
(long) row.getField(3));
colIdx = (Integer) row.getField(0);
}
// 得到 <feature, y-label> : "count of feature" 这个map
map = {HashMap@9676} size = 4
{Tuple2@9688} "(a,1)" -> {Long@9689} 2
{Tuple2@9690} "(b,-2)" -> {Long@9689} 2
{Tuple2@9691} "(d,-99)" -> {Long@9689} 2
{Tuple2@9692} "(c,100)" -> {Long@9689} 2
// 利用map来做交叉表
collector.collect(new Tuple2<>(colIdx, Crosstab.convert(map)));
}
})
.map(new ChiSquareTestFromCrossTable()); // 构建卡方检验
}
4.2 Crosstab
В приведенном выше коде используйтеcollector.collect(new Tuple2<>(colIdx, Crosstab.convert(map)));
построить перекрестную таблицу.
Кросс-таблица — это кросс-таблица, отражающая взаимосвязь между двумя переменными. То есть с ключом карты в качестве горизонтальной оси, вертикальной оси и значением в качестве значения это пересечение между объектом и меткой.
public static Crosstab convert(Map<Tuple2<String, String>, Long> maps) {
Crosstab crosstab = new Crosstab();
//get row tags and col tags
Set<Tuple2<String, String>> sets = maps.keySet();
Set<String> rowTags = new HashSet<>(); // 拿到行,列
Set<String> colTags = new HashSet<>();
for (Tuple2<String, String> tuple2 : sets) {
rowTags.add(tuple2.f0);
colTags.add(tuple2.f1);
}
crosstab.rowTags = new ArrayList<>(rowTags);
crosstab.colTags = new ArrayList<>(colTags);
int rowLen = crosstab.rowTags.size();
int colLen = crosstab.colTags.size();
//compute value
crosstab.data = new long[rowLen][colLen];
for (Map.Entry<Tuple2<String, String>, Long> entry : maps.entrySet()) {
int rowIdx = crosstab.rowTags.indexOf(entry.getKey().f0);
int colIdx = crosstab.colTags.indexOf(entry.getKey().f1);
crosstab.data[rowIdx][colIdx] = entry.getValue();
}
return crosstab;
}
Здесь вход и выход следующие
// 输入如下
maps = {HashMap@9676} size = 4
{Tuple2@9688} "(a,1)" -> {Long@9689} 2
{Tuple2@9690} "(b,-2)" -> {Long@9689} 2
{Tuple2@9691} "(d,-99)" -> {Long@9689} 2
{Tuple2@9692} "(c,100)" -> {Long@9689} 2
// 交叉表如下
crosstab = {Crosstab@9703}
colTags = {ArrayList@9720} size = 4
0 = "1" 1 = "100" 2 = "-2" 3 = "-99"
rowTags = {ArrayList@9721} size = 4
0 = "a" 1 = "b" 2 = "c" 3 = "d"
data = {long[4][]@9713}
0 = {long[4]@9722} 0 = 2 1 = 0 2 = 0 3 = 0
1 = {long[4]@9723} 0 = 0 1 = 0 2 = 2 3 = 0
2 = {long[4]@9724} 0 = 0 1 = 2 2 = 0 3 = 0
3 = {long[4]@9725} 0 = 0 1 = 0 2 = 0 3 = 2
Кросс-таблица строится следующим образом:
1 | 100 | -2 | -99 | |
---|---|---|---|---|
a | 2 | |||
b | 2 | |||
c | 2 | |||
d | 2 |
4.3 Построение теста хи-квадрат
В 4.1 есть.map(new ChiSquareTestFromCrossTable());
, здесь на основеcollector.collect(new Tuple2<>(colIdx, Crosstab.convert(map)));
Кросс-таблица строит критерий хи-квадрат.
/**
* calculate chi-square test value from cross table.
*/
public static class ChiSquareTestFromCrossTable implements MapFunction<Tuple2<Integer, Crosstab>, Row> {
@Override
public Row map(Tuple2<Integer, Crosstab> crossTabWithId) throws Exception {
Tuple4 tuple4 = test(crossTabWithId);
// f0 is id of cross table, f1 is pValue, f2 is chi-square Value, f3 is df
Row row = new Row(4);
row.setField(0, tuple4.f0);
row.setField(1, tuple4.f1);
row.setField(2, tuple4.f2);
row.setField(3, tuple4.f3);
return row;
}
}
test(crossTabWithId) — это ключевой момент, в котором функция распределения.cumulativeProbability, наконец, вызывает org.apache.commons.math3.distribution.GammaDistribution.cumulativeProbability.
можно увидеть здесь
- Определение df: (double)(rowLen - 1) * (colLen - 1), то есть (row - 1) * (column - 1).
- Значение хи-квадрат строится точно по определению.
- Значение p вызывается в org.apache.commons.math3.distribution.GammaDistribution.cumulativeProbability.
/**
* @param crossTabWithId: f0 is id, f1 is cross table
* @return tuple4: f0 is id which is id of cross table, f1 is pValue, f2 is chi-square Value, f3 is df
*/
protected static Tuple4<Integer, Double, Double, Double> test(Tuple2<Integer, Crosstab> crossTabWithId) {
int colIdx = crossTabWithId.f0;
Crosstab crosstab = crossTabWithId.f1;
int rowLen = crosstab.rowTags.size();
int colLen = crosstab.colTags.size();
//compute row sum and col sum 计算出列的数值和,行的数值和
double[] rowSum = crosstab.rowSum();
double[] colSum = crosstab.colSum();
double n = crosstab.sum();
//compute statistic value 计算统计值
double chiSq = 0;
for (int i = 0; i < rowLen; i++) {
for (int j = 0; j < colLen; j++) {
double nij = rowSum[i] * colSum[j] / n;
double temp = crosstab.data[i][j] - nij;
chiSq += temp * temp / nij; // 就是按照定义来构建卡方值
}
}
//set result
double p;
if (rowLen <= 1 || colLen <= 1) {
p = 1;
} else {
ChiSquaredDistribution distribution =
new ChiSquaredDistribution(null, (rowLen - 1) * (colLen - 1));
p = 1.0 - distribution.cumulativeProbability(Math.abs(chiSq));
}
// return tuple4: f0 is id which is id of cross table, f1 is pValue, f2 is chi-square Value, f3 is df
return Tuple4.of(colIdx, p, chiSq, (double)(rowLen - 1) * (colLen - 1));
}
// runtime是
tuple4 = {Tuple4@9842} "(0,0.004301310843500827,24.0,9.0)"
f0 = {Integer@9843} 0
f1 = {Double@9844} 0.004301310843500827
f2 = {Double@9847} 24.0
f3 = {Double@9848} 9.0
0xEE Личная информация
★★★★★★Думая о жизни и технологиях★★★★★★
Публичный аккаунт WeChat:мысли Росси
Если вы хотите получать своевременные новости о статьях, написанных отдельными лицами, или хотите видеть технические материалы, рекомендованные отдельными лицами, обратите внимание.
ссылка 0xFF
Тест хи-квадрат (Chi_square_test): принцип и реализация на питоне
T-тест, критерий хи-квадрат и p-значение
Степени свободы для теста хи-квадрат
Кросс-таблица и критерий хи-квадрат
Значение критерия хи-квадрат преобразовано в значение P
Как понять гамма-распределение?
Базовый алгоритм Spark MLlib [корреляционный анализ, критерий хи-квадрат, суммирование]
анализ исходного кода spark(1.1) mllib (1) - критерий хи-квадрат
Кросс-таблица и критерий хи-квадрат
Допущения H0 и H1 в статистике (1)
Как появились допущения H0 и H1 в статистике? Почему H0 не H1 и H1 не H0?
В чем именно заключается смысл p-значения в проверке статистических гипотез?