Python 2x2矩阵中元素的所有组合,行和列总和等于指定值
背景 我正试图编写Fisher精确检验(见:),特别是针对2 x 2列联表(矩阵)。但是我在一个特定的步骤上陷入了困境:在给定非负整数的观测矩阵的情况下生成替代矩阵,其中替代矩阵的行和列和必须等于原始矩阵。有一个所有步骤的描述,但下面我将详细说明我卡住的位Python 2x2矩阵中元素的所有组合,行和列总和等于指定值,python,c,r,matrix,combinations,Python,C,R,Matrix,Combinations,背景 我正试图编写Fisher精确检验(见:),特别是针对2 x 2列联表(矩阵)。但是我在一个特定的步骤上陷入了困境:在给定非负整数的观测矩阵的情况下生成替代矩阵,其中替代矩阵的行和列和必须等于原始矩阵。有一个所有步骤的描述,但下面我将详细说明我卡住的位 问题 为了实现2 x 2列联表的Fisher精确检验,我得到了一个2 x 2矩阵,其元素是表示观测值的非负整数,即观测矩阵 其中一个步骤要求我生成2 x 2矩阵的所有组合,即备选矩阵,其非负整数元素受以下条件限制: 所有备选矩阵的维数均为
问题 为了实现2 x 2列联表的Fisher精确检验,我得到了一个2 x 2矩阵,其元素是表示观测值的非负整数,即观测矩阵 其中一个步骤要求我生成2 x 2矩阵的所有组合,即备选矩阵,其非负整数元素受以下条件限制:
- 所有备选矩阵的维数均为2 x 2,即等于观测矩阵
- 备选矩阵每行的总和必须等于观测矩阵每行的相应总和xm,即观测矩阵第2行的总和c==备选矩阵每行第2行的总和
- 备选矩阵每列的总和必须等于观测矩阵每列的相应总和李>
示例 对于2×2检验的一个示例应用,假设X是一本杂志,比如数学杂志或科学杂志,Y是这些杂志中某一期中出现的关于数学和生物学主题的文章数量。如果《数学》杂志有五篇关于数学的文章和一篇关于生物学的文章,而《科学》杂志没有关于数学的文章和四篇关于生物学的文章,那么相关的矩阵应该是: 所有可能的替代矩阵将为:
相关帖子
这其实很容易。您只需从所有可能的组合中选择符合条件的组合即可 以下是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
我用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})
我们没有“做我的作业”服务!恐怕你得自己做。你应该多学一些语言。尝试在Brainfuck@Olaf,为了避免不必要的问题,我将集中在“自己动手”上,我将编辑问题以包含我的尝试。我对组合数学这个例子很感兴趣,因为我隐藏的怀疑是,最有效的解决方案类似于解决数独问题。