我想生成一个随机方阵,使行归一化为一,对角线元素是其列的最大值。如果有一种有效的方法来统一采样这些矩阵?
矩阵很容易创建。第一列是通过从中采样两个独立的制服并将最大值移动到第一个条目而生成的。然后第二列是第一列的补码。我在更高维度上遵循类似过程的尝试感觉非常特别,最麻烦的是,最终补充列的分布与其他列的分布非常不同。某种类型的拒绝抽样是我最好的选择吗?
动机是生成似然矩阵,行是世界的状态,列是观察到的信号。每个信号最有可能在其相应的状态下出现,但不一定是该状态下最有可能出现的信号。
编辑:确切的分布并不重要,除了看起来很自然。不过,我想避免对角线对于行也是最大的。
这是我自己以前的 ah-hoc 尝试。
gen.likelihood.matrix <- function(T){
# T: Number of states
mat <- matrix(runif(T^2), nrow=T) # Intialize with uniform variates
diag(mat) <- 1 # To guarantee diag is max in column
candidate.mat <- matrix(nrow=T, ncol=T)
# Loop to check for constraint satisfaction
for(k in 1:100){
weights <- runif(T-1)
weights <- weights / sum(weights)
for(i in 1:T){
# Rescale columns
candidate.mat[i,-T] <- mat[i,-T] * weights
# Replace last column with complement to meet row constraint
candidate.mat[i,T] <- 1 - sum(candidate.mat[i,-T])
}
# Does the last column meet the maximality constraint?
if(candidate.mat[T,T] > max(candidate.mat[-T,T])){
# Shuffle to minimize the distortion from last column
reorder <- sample(1:T,T)
return(candidate.mat[reorder,reorder])
}
}
# Recurse to get new initial values if necessary
return(genLikeliMatrix(T))
}
这可以有效地为我提供矩阵,但由于我处理最后一列的方式,我在对角线上得到了一个奇怪的双峰分布。