2016-11-05 5 views
2

ФоновыхВсех комбинаций элементов в матрице 2х2, с строками и столбцами суммами, равными указанных значениями

Я пытаюсь код точного критерия Фишера (см: wiki), в частности, в течение 2 х 2 таблиц сопряженности (матрицы). Но я застрял на одном конкретном шаге:для генерации альтернативных матриц с учетом наблюдаемой матрицы неотрицательных целых чисел, где суммы строк и столбцов альтернативных матриц должны быть равны исходной матрице.This page (Wolphram) имеет описание всех этапов, но ниже я расскажу о бит, на котором я застрял.


Вопрос

Для осуществления точного критерия Фишера для 2 х 2 таблиц сопряженности я даюсь матрица 2 х 2, элементы которого является неотрицательными целыми числами, указывающим наблюдения, то наблюдается матрицы ,

Одним из шагов требует от меня, чтобы генерировать все комбинации 2 х 2 матриц, то альтернативные матрицы, чьи неотрицательные целые элементы ограничены следующими условиями:

  • размеры всех альтернативных матрицы 2 x 2, т. е. равны наблюдаемой матрице.
  • Сумма каждой строки альтернативных матриц должна быть равна соответствующей сумме каждой строки наблюдаемой матрицы m, т. Е. Сумма строки 2 в наблюдаемой матрице == сумма строки 2 в каждой из альтернативных матриц.
  • Сумма каждого столбца альтернативных матриц должна быть равна соответствующей сумме каждого столбца наблюдаемой матрицы.

Для меня наиболее очевидным способом генерации альтернативных матриц является грубая сила всех возможных комбинаций чисел в матрице 2 x 2, значения которой меньше или равны суммам строк/столбцов наблюдаемой матрицы , Затем повторите эти комбинации, отфильтровывая комбинации, которые не удовлетворяют вышеуказанным условиям.

Отредактировано: Какой самый быстрый алгоритм для генерации всех комбинаций элементов в матрице 2х2 (альтернативных матриц), с строками и столбцами сумм равен таковыми из наблюдало матрицу?

Оригинал: Как мы можем реализовать это на любом из следующих языков: R, Python, C/C++, Matlab?


Пример

Для примера применения теста 2 × 2, пусть X будет журнал, скажем, либо математический журнал или наука, и пусть Y будет ряд статей по темам математики и биологии, возникающих в данном выпуске одного из этих журналов.Если математический журнал имеет пять статей по математике и один на биологии, и наука не имеет ни по математике и четыре по биологии, то соответствующая матрица будет:

enter image description here

и все возможные альтернативные матрицы будут тогда:

enter image description herew


Похожие сообщения

+1

У нас нет услуги «сделай мою домашнюю работу»! Боюсь, вы должны сделать это сами. И вы должны были нанести еще несколько языков. Попробуйте реализовать в Brainfuck – Olaf

+0

@Olaf, чтобы избежать ненужных ситуаций. Я сосредоточусь на «сделай сам», я отредактирую вопрос, чтобы включить мою попытку. Меня интересует этот случай комбинаторики, потому что мое скрытое подозрение в том, что наиболее эффективное решение похоже на решение для судоку. –

ответ

1

У меня есть ответ, используя SymPy. Идея одна и та же: Решите линейную систему уравнений, которую вы получаете от суммы ваших матричных элементов, являющихся номером строки и столбца. Это жестко закодировано в M. s - это в основном ваша матрица. linsolve дает вам бесконечно много решений, а остальное ограничивает их положительными целыми числами.

from sympy import * 
from sympy.solvers.solveset import linsolve 
from sympy.sets.fancysets import Naturals0 
from sympy.solvers.inequalities import reduce_inequalities 

M = Matrix([[1,1,0,0],[0,0,1,1],[1,0,1,0],[0,1,0,1]]) 
s = Matrix([5,5,6,4]) 

a,b,c,d = symbols('a, b, c, d') 
solution = linsolve((M,s), [a,b,c,d]) 

solution_eq = [x >= 0 for x in list(list(solution)[0])] 
possible_values = reduce_inequalities(solution_eq, x.free_symbols) 

for d_fixed in Intersection(possible_values.as_set(), Naturals0()): 
    print solution.subs({d : d_fixed}) 
0

Это на самом деле довольно легко. Вам просто нужно выбрать из всех возможных комбинаций те, которые соответствуют условию.

Вот решение в Python:

# [[i, j] 
# [k, l]] 

def findAlternativeMatrices(c): 
    # arg c = cont. matrix 
    # this only works for integers 
    alt = [] 
    # no single value inside an alternative matrix 
    # can be bigger than the largest row/column-sum 
    N = max([c[0][0]+c[1][0],c[0][1]+c[1][1],c[0][0]+c[0][1], c[1][0]+c[1][1]]) 
    # loop over all matrix entries 
    for i in range(N): 
     for j in range(N): 
      for k in range(N): 
       for l in range(N): 
        #check if the respective sums equal 
        if( (i+k == (c[0][0]+c[1][0])) 
         and (j+l == (c[0][1]+c[1][1])) 
         and (i+j == (c[0][0]+c[0][1])) 
         and (k+l == (c[1][0]+c[1][1]))): 

         if [[i,j],[k,l]] != c: 
          # append the matrix 
          # if it isn't the given cont. matrix 
          alt.append([[i,j],[k,l]]) 

    return alt 


c = [[5,0],[1,4]] 
alt = findAlternativeMatrices(c) 

for a in alt: 
    print a