- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否有一种更优雅的方法可以根据二进制矩阵的填充和大小来计算其最大或最小变化率(CV)?考虑到所有行和列的总数必须不为零。例如
foo(n_col, n_row, fill){ get maximum possible CV }
m
的矩阵,其中所有列和行的总数均为
> 0
,但矩阵的填充量最少。
m <- matrix(rep(0,25), nrow = 5)
diag(m) <- 1
# [,1] [,2] [,3] [,4] [,5]
#[1,] 1 0 0 0 0
#[2,] 0 1 0 0 0
#[3,] 0 0 1 0 0
#[4,] 0 0 0 1 0
#[5,] 0 0 0 0 1
variability1 <- sd(colSums(m))/mean(colSums(m))
variability1
# [1] 0
# the maximum and minimum for this fill is zero
# considering that all column and row totals must be > 0
# find out which matrix elements are zeros
empty <- which(m < 1)
# vector for results
variability <- rep(NA, length(empty))
#
for(i in 1:length(variability)){
m[empty[[i]] ] <- 1
variability[[i]] <- sd(colSums(m))/mean(colSums(m))
}
# we get what should the maximum CV for each given level of matrix fill...
c(variability1, variability)
最佳答案
下面提供了问题的另一种表示形式,它是对二进制矩阵的列总和向量的选择进行优化,从而使给定fill
的可变性最大化。提供了有关该公式有效性的非正式论据以及解决该问题的算法。生成的算法与OP的断言一致
像这样逐列填充矩阵,以保持边际列总计的最大可变性
首先,通过fill
二进制矩阵1
将n_row
定义为n_col
中m
的数目。根据问题陈述的约束,m
是二进制矩阵,所有行和列之和都大于零,所以fill
是范围[max(n_row, n_col),n_row*n_col]
的整数。
然后问题是对于给定值fill
在范围[max(n_row, n_col),n_row*n_col]
中,找到最大值
sd(colSums(m))/mean(colSums(m))
m
上,使得
m
是具有
fill
个数
1
且所有行列总和都大于零的二进制矩阵。
m
的列总和的向量而不是
m
本身来指定此优化问题的范围。这是因为存在不同的
m
,它们具有相同的列和向量,因此具有相同的目标值。将列总和的向量表示为
x
,可以将上述优化问题重申为最大化之一:
sd(x)/mean(x)
x
的每个元素都是
[1, n_row]
范围内的整数,而
sum(x)
是
fill
。
sum(x)
被约束为等于
fill
,因此对于给定的
mean(x)
,分母项
x
在所有
fill
上都是恒定的。因此,最大化的等效目标函数就是
sd(x)
或等效地
x
的方差。
x
的方差,我们需要选择
x
,以使其值之间的差异最大,同时仍然满足
x
的约束。在这里,我们可以相对于
fill
归纳地考虑这个问题。假设对于给定的
fill
,我们有
x
的解决方案,可以在满足其约束的同时最大化
x
的方差。问题就变成了:当我们将
fill
增加到
fill + 1
时,新的
x
使它的方差最大化的是什么?因为我们有
sum(x)=fill
并且
x
中的每个元素都是整数的约束,所以递增
fill
意味着我们必须递增
x
的一个且仅一个元素。现在放宽对
x
中每个元素的上限约束(即
x[i] <= n_row
中所有
i
的
[1,n_col]
),然后问题就变成了:
x
中哪个元素要增加,从而最大程度地增加了。
x
的方差。对于这个问题的答案,我们可以看一下
var(x)
的泰勒级数展开式:
var(x + dx) = var(x) + gradient(var(x)) %*% dx + 1/2 * t(dx) %*% Hessian(var(x)) %*% dx
dx
是长度为
n_col
的向量,其中一个元素等于
1
,所有其他元素为
0
(即指示符向量)。由于
var(x)
在
x
中是平方的,因此二阶扩展就足够了。此外,由于
dx
是指示符向量,因此仅Hessian矩阵的对角线元素很重要。这些是由:
gradient(var(x))[i] = 2*(x[i]-mean(x))/(n_col-1), for all i in [1,n_col]
Hessian(var(x))[i,i] = 2/n_col , for all i in [1,n_col]
dx
的任何选择,泰勒级数的二阶项均相同。因此,只有一阶项在确定
x
中要递增哪个元素以使
x
的方差增加最大化时很重要。从梯度项来看,很明显,我们应该选择增加
i
中具有最大当前值
x
的
x[i]
个元素,以最大程度地增加
x
的方差。现在,我们在
x
的每个元素上重新引入上限约束。然后,最佳选择是增加
i
中具有最大当前值
x
的第
x[i] < n_row
个元素。请注意,如果
x
中有多个具有相同最大值
x[i] < n_row
的此类元素,则选择这些元素中的任何一个都会导致
x
的方差具有相同的最大增加。
fill
和
x
的解决方案,它在满足其约束的同时最大化
x
的方差,我们有一条规则
dx
将最大化
x
的增量增量cc>表示
fill + 1
。仍然需要说明的是,该规则会产生一个新的
x
,它是最优的
x
,它使新
x
的
fill + 1
的方差最大。现在,我们通过矛盾来证明这一点。具体来说,如果这个新的
x
不能使
x
的
fill + 1
方差最大化,则必须存在另一个针对
x_1
的列和
fill
的向量,以及另一个规则
dx_1
var(x_1 + dx_1) > var(x + dx)
x
使
var(x)
最大化
fill
,并且梯度和Hessian方程对于任何
x
成立,因此我们具有:
var(x_1 + dx_1) = var(x_1) + gradient(var(x_1)) %*% dx_1 + 1/2 * t(dx_1) %*% Hessian(var(x_1)) %*% dx_1
<= var(x_1) + 2*(max(x_1)-mean(x_1))/(n_col-1) + constant
<= var(x) + 2*(max(x)-mean(x))/(n_col-1) + constant
= var(x + dx)
dx_1
处
x_1
的最佳选择是使
x_1
中的最大元素递增,从而使
gradient(var(x_1)) %*% dx_1 <= 2*(max(x_1)-mean(x_1))/(n_col-1)
递增的选择。同样,对于所有
x
和
dx
对于给定的
fill
,二阶项都是常数,因此我们简单地将其声明为
constant
。
var(x_1) <= var(x)
使
x
的方差最大,(ii)对于
fill
的最优规则
gradient(var(x)) %*% dx = 2*(max(x)-mean(x))/(n_col-1)
dx
,并且( iii)假定
fill
使
max(x_1) <= max(x)
处的方差最大。要查看后者,请考虑
x
的列总和
fill
的公共前导向量。
x_-1
递增到
fill-1
和
x_-1
之间的规则差异仅仅是
x
中要递增的元素的不同选择。从
x_1
方差的泰勒级数展开中可以明显看出,
x_-1
中要递增到
x_-1
的元素的选择必须大于或等于要去
x_-1
的选择,因为< cc>。因此,
x
。现在,将此推理扩展到任何先前的
x_1
处列总和的任何公共向量,包括初始
var(x_1) <= var(x)
,其中列总和的初始向量为所有
max(x_1) <= max(x)
。然后,为一条路径选择上面定义的最佳增量规则以达到
fill-k >= max(n_row, n_col)
;而对于其他路径,请选择一条任意的增量规则路径以达到
fill
。由于最佳规则总是在每个步骤中递增状态的最大元素(以上限为准),因此很显然再次
1
。
x
是所有
x_1
。由于给定了初始填充,对于
max(x_1) <= max(x)
没有其他选择,因此这对
x
进行了优化。现在,最佳增量规则
1
是选择
var(x)
的第一个元素进行增量,因为所有元素都相等。由于增加
x
的任何其他元素将导致相同的方差,因此所得的
dx
会使初始填充的方差最小,并且加1。
x
值:
x + dx
的向量中的每个元素。
x
元素
fill
。请注意,我们从填充中减去
x
,以便保留它们以至少用
i
填充列求和向量的其余元素,并将数量限制为
x[i] <- min(n_row, fill - (ncol_-i))
以满足问题的约束。
(n_col-i)
foo <- function(n_col, n_row, fill) {
## preallocate the vector of column sums x and initialize to NA
x <- rep(NA, n_col)
for (i in seq_len(n_col)) {
x[i] <- pmin.int(n_row, fill-(n_col-i))
fill <- fill - x[i]
}
## compute the variability given the vector of column sums x
sd(x)/mean(x)
}
1
的重复减量可以用
n_row
代替,以上简化为:
foo <- function(n_col, n_row, fill) {
x <- pmin.int(pmax.int(cumsum(c(fill-n_col+1,rep(-n_row+1,n_col-1))),1),n_row)
## compute the variability given the vector of column sums x
sd(x)/mean(x)
}
n_col=5
n_row=5
variability <- sapply(max(n_col,n_row):(n_col*n_row), function(fill) foo(n_col, n_row, fill))
print(variability)
## [1] 0.0000000 0.3726780 0.6388766 0.8385255 0.9938080 0.8660254 0.8131156 0.8122329 0.8426501
##[10] 0.7319251 0.6666667 0.6404344 0.6443795 0.5414886 0.4707512 0.4330127 0.4259177 0.3049184
##[19] 0.1944407 0.0931695 0.0000000
关于r - 查找最大和最小矩阵边际总变异性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40704178/
“用 Haskell 进行函数式思考”中的练习之一是使用融合定律使程序更加高效。我在尝试复制答案时遇到了一些麻烦。 部分计算要求您将 maximum (xs++ map (x+) xs) 转换为 ma
我正在尝试获得 R 中最大/最小的可表示数字。 输入“.Machine”后 我有: $double.xmin [1] 2.225074e-308 $double.xmax [1] 1.797693e+
有没有办法更改浏览器验证消息 请检查所附图片。 我目前正在使用 wooCommerce 目前它显示小于或等于 X 个数字,我想更改为请求超过 X 个项目的报价。 请多多指教 最佳答案 您需要使用oni
我正在尝试将解决方案从 Excel 求解器复制到 R 中,但不知道从哪里开始。 问题: 每小时选择 5 个选项(5 行),以最大化“分数”的总和,而无需在多个小时内选择同一组 2 次。 换句话说: 最
Haskell 中是否有这样的功能: max_of_type :: (Num a) => a 所以: max_of_type :: Int == 2 ^ 31 - 1 // for example,
我有这两个表示时间范围(秒)的输入字段,我需要这样设置,以便“from/min”字段不能高于“to/max”,反之亦然。 到目前为止我得到了这个: jQuery(document).ready(fun
我有一个看起来像这样的表: http://sqlfiddle.com/#!9/152d2/1/0 CREATE TABLE Table1 ( id int, value decimal(10,
我会尝试尽可能简单地解释它: 首先是一些带有虚拟数据的数据库结构。 结构 tb_spec_fk feature value ----------------- 1 1 1
我有两个表。 表 1: +---------+---------+ | Lead_ID | Deal_ID | +---------+---------+ | 2323 | null |
我的数据库中有一个字段可以包含数字,例如8.00 或范围编号,例如8.00 - 10.00。 如果您将每个数字作为单独的数字,我需要从表中获取 MIN() 和 MAX()。例如当范围为 8.00 -
max(float('nan'), 1) 计算结果为 nan max(1, float('nan')) 计算结果为 1 这是预期的行为吗? 感谢您的回答。 max 在 iterable 为空时引发异常
我想问一下如何在 CSS 中创建一个页脚栏,它具有最小宽度(比如 650 像素),并且会根据窗口大小进行拉伸(stretch),但仅限于某个点(比如 1024 像素)。 我的意思是当窗口大小为例如 1
我尝试调整表格列宽(下一个链接上的“作者”列 http://deploy.jtalks.org/jcommune/branches/1?lang=en)。我已将最小/最大属性添加到 .author-c
在 C# 中,是否有用于将最小值和最大值存储为 double 值的内置类? 此处列出的要点 http://msdn.microsoft.com/en-us/library/system.windows
问题: 每个任务队列是否可以每秒处理超过 500 个任务? 每个 GAE 应用是否可以每秒处理超过 50,000 个任务? 详细信息: Task queue quota文档说: Push Queue
我想知道是否允许最大或最小堆树具有重复值?我试图仅通过在线资源查找与此相关的信息,但一直没有成功。 最佳答案 是的,他们可以。您可以在“算法简介”(Charles E. Leiserson、Cliff
首先,我是 .NET 开发人员,喜欢 C# 中的 LINQ 和扩展方法。 但是当我编写脚本时,我需要相当于 Enumerable extension methods 的东西 任何人都可以给我任何建议/
这是一个检查最大 malloc 大小的简单程序: #include std::size_t maxDataSize = 2097152000; //2000mb void MallocTest(vo
我想找到我的数据的最小值和最大值。 我的数据文件: 1 2 4 5 -3 -13 112 -3 55 42 42 而我的脚本: {min=max=$1} {if ($1max) {max=$1}
我想查询我的Elastic-Search以获取仅具有正值的最低价格价格。我的价格也可以为零和-1;所以我不希望我的最小聚合返回0或-1。我知道我应该向查询(或过滤器)添加脚本,但是我不知道如何。我当前
我是一名优秀的程序员,十分优秀!