如何求取可使正向量缩放后取对数结果全为非负的最小指数
计算逻辑
你需要满足的条件是:对向量中所有元素,缩放后取对应底数的对数结果≥0,结合对数的运算规则可以直接推导k的取值:
假设你使用的对数底数为b,对应缩放因子为b^k,需要满足:
log_b(x_i * b^k) ≥ 0 对所有x_i成立
展开左侧运算可得:
log_b(x_i) + k ≥ 0 → k ≥ -log_b(x_i)
由于对数函数是单调递增函数,向量中最小的元素min(x)对应的log_b(x_i)值最小,因此-log_b(x_i)的最大值就是-log_b(min(x)),这就是满足要求的最小k值。
分场景实现(以你的示例数据为例)
你的向量x最小值为0.05018667,对应不同对数底数的计算方法如下:
1. 常用对数(底数为10,对应缩放因子10^k)
# 计算得到最小实数k(缩放后取对数最小值为0,非负) k_10 <- -log10(min(x)) # 输出结果约为1.299 # 如果你需要k为整数,且取对数后结果严格为正,向上取整即可 k_10_int <- ceiling(k_10) # 输出结果为2 # 验证 all(log10(x * 10^k_10) >= 0) # 返回TRUE all(log10(x * 10^k_10_int) > 0) # 返回TRUE
2. 二进制对数(底数为2,对应缩放因子2^k)
# 计算得到最小实数k(缩放后取对数最小值为0,非负) k_2 <- -log2(min(x)) # 输出结果约为4.317 # 整数k(严格正对数) k_2_int <- ceiling(k_2) # 输出结果为5 # 验证 all(log2(x * 2^k_2) >= 0) # 返回TRUE all(log2(x * 2^k_2_int) > 0) # 返回TRUE
补充:自然对数(R默认log函数,底数为e,对应缩放因子exp(k))
k_e <- -log(min(x)) # 输出约为2.992,和你给出的log(x)最小值-2.992刚好对应 all(log(x * exp(k_e)) >= 0) # 返回TRUE
内容的提问来源于stack exchange,提问作者777moneymaker
相关产品推荐
相关产品推荐

