最近在看算法导论中文版,第一部分的基础知识里有许多数学上的知识,多重对数函数就是其中一个我不太熟悉的知识。 多重对数函数的定义是: lg*n=min{i≥0:lg(i)n≤1} lg*2=1 lg*4=2 lg*16=3 lg*65536=4 lg*265536=5 也就是说呢, lg(1)16=lg16=4 lg(2)16=lg(lg(1)16)=lg4=2 lg(3)16=lg(lg(lg(1)16))=lg(lg(2)16)=lg2=1 i=3时,lg(i)n≤1 所以lg*16=3 这样重复地用函数
介绍 遵从两大原则 1.绝不依赖JDK以外的源码 2.牺牲代码复用性,每个类都必须是单独的组件,绝不互相引用,做到完全解耦 package *; /** * @program: simple_tools * @description: 对数函数 * @author: ChenWenLong * @create: 2019-10-24 19:57 **/ public class LogFunction { //y=logaX (a>0,且a≠1) private double a = 2; private static final Point DEFAULT_POINT = new LogFunction(); } } } } /** * 功能描述: * 〈初始化对数函数 zero and not be one"); } instance.setA(a); } /** * 功能描述: * 〈判断点是否在对数函数上
指数函数与对数函数的核心公式指数函数与对数函数的曲线绘制from __future__ import annotations , annotationsimport matplotlib.pyplot 常规对数函数 (底数为2)# =============================================================================plt.subplot (2 , 2 , 3) # 2行2列的第3个子图# 生成x值(0.1到4之间等间距的100个点),避免0x = np.linspace(0.1 , 4 , 100)# 计算以2为底的对数函数值y = (2 , 2 , 4) # 2行2列的第4个子图# 计算自然对数函数值y = np.log(x) # ln(x)# 绘制函数曲线plt.plot(x , y , 'c-' , linewidth = = E ** x print('自然指数函数的导数:' , latex(simplify(diff(expr_2 , x))))对数函数的特性测试"""自然对数函数Natural logarithmic
注意:C语言标准库未直接提供以任意正数为底的对数函数,但可通过换底公式推导:logₐ(b) = log(b)/log(a) 或 logₐ(b) = log10(b)/log10(a)。 + n * 0.69314718056 return result 3.3 log10()函数伪代码实现 log10()的实现通常基于换底公式: ,因为直接实现常用对数的效率低于复用已有的自然对数函数 (N0, lambda, t1)); printf("t=%.1f秒后剩余:%.2f\n", t2, radioactive_decay(N0, lambda, t2)); printf :%.2f倍 → %.2f dB\n", Vout2/Vin2, voltage_gain_db(Vout2, Vin2)); return 0; } 运行结果: 电压增益:100.00倍 → pH值、震级等工程换算 特殊值结果 exp(0)=1.0;exp(+∞)=+∞ log(1)=0.0;log(e)=1.0 log10(1)=0.0;log10(10)=1.0 七、经典面试题 指数与对数函数是
x + y - mod : x + y;} template <typename A, typename B> inline void add2(A &x, B y) {if(x + y < 0 } } void Init(/*int P,*/ int Lim) { //mod = P; G = GetOrigin(mod); Gi = fp(G, mod - 2) ; for(int i = 0; i <= lim; i++) mul2(A[i], Inv); } } void Mul(int *a, int - A1 * B^2 if(len == 1) {b[0] = fp(a[0], mod - 2); return ;} Inv(a, b, len >> 1); A[i], mul(B[i], B[i])); NTT(A, len << 1, -1); for(int i = 0; i < len; i++) add2(b[i],
假设有底数为2和3的两个对数函数,如上图。当X取N(数据规模)时,求所对应的时间复杂度得比值,即对数函数对应的y值,用来衡量对数底数对时间复杂度的影响。 比值为log2 N / log3 N,运用换底公式后得:(lnN/ln2) / (lnN/ln3) = ln3 / ln2,ln为自然对数,显然这三个常数,与变量N无关。 用文字表述:算法时间复杂度为log(n)时,不同底数对应的时间复杂度的倍数关系为常数,不会随着底数的不同而不同,因此可以将不同底数的对数函数所代表的时间复杂度,当作是同一类复杂度处理,即抽象成一类问题。 当然这里的底数2和3可以用a和b替代,a,b大于等于2,属于整数。a,b取值是如何确定的呢? 有点编程经验的都知道,分而治之的概念。 排序算法中有一个叫做“归并排序”或者“合并排序”的算法,它用到的就是分而治之的思想,而它的时间复杂度就是N*logN,此算法采用的是二分法,所以可以认为对应的对数函数底数为2,也有可能是三分法,底数为3
假设有底数为2和3的两个对数函数,如上图。当X取N(数据规模)时,求所对应的时间复杂度得比值,即对数函数对应的y值,用来衡量对数底数对时间复杂度的影响。 比值为log2 N / log3 N,运用换底公式后得:(lnN/ln2) / (lnN/ln3) = ln3 / ln2,ln为自然对数,显然这三个常数,与变量N无关。 用文字表述:算法时间复杂度为log(n)时,不同底数对应的时间复杂度的倍数关系为常数,不会随着底数的不同而不同,因此可以将不同底数的对数函数所代表的时间复杂度,当作是同一类复杂度处理,即抽象成一类问题。 当然这里的底数2和3可以用a和b替代,a,b大于等于2,属于整数。a,b取值是如何确定的呢? 有点编程经验的都知道,分而治之的概念。 排序算法中有一个叫做“归并排序”或者“合并排序”的算法,它用到的就是分而治之的思想,而它的时间复杂度就是N*logN,此算法采用的是二分法,所以可以认为对应的对数函数底数为2,也有可能是三分法,底数为3
如下图: [jekatmex9r.png] 2 如何变快一点?一次翻2页,如果发现单词在前面,则返回前一页,复杂度。 [wmi464x36s.png] 3 第三种方法,我们将词典一分为2,然后查找单词,如果没找到,则继续一分为2。这个方法的复杂度是。 [w92nkmin4r.png] 对数函数在不同量级的表现 有趣的是对数并不总是最优的,比如函数和函数。 第一张图展现了对数函数的增长比二次方要慢很多。 [fejs5cekfu.png] 然而,更仔细的看一下,如果输入数据比较小,那么对数函数会比二次方函数要快一点。 [ei66a8py9m.png] 因此,如果你是处理比较小的问题,不使用对数函数可能会更好一些。 又学到了一点小知识,有问题可以留言~
现在让我们继续探讨对数函数的概念。前面讲解了指数函数,对数函数则是指数函数的逆运算。如果有一个指数函数表达式为y = a^x ,那么它的对数表达式就是x = log_a y 。 然而,当我们转而讨论对数函数时,其表示形式导致了这一点被调换至( (1,0) ),因此对于对数函数而言,它的恒过点即为( (1,0) )。 剩下关于对数的变换我就不再详细讲解了。 两口子吵架 0.2 I(x_2) = -ln^{0.2}= 1.61 x_3 离婚了 0.1 I(x_3) = -ln^{0.1}= 2.30 从上面的例子可以看出,如果一个事件的概率很低 按照熵的公式进行计算,那么这个故事的熵即为: 熵:H(p) = -\sum_j^n(px_j)ln^{(px_j)} 计算得出:H(p) = -(px_1)ln^{(px_1)}+(px_2)ln 因为对数函数的特性是,其参数 ( x ) 可以无限接近于0,但不能等于0。因此,如果参数等于0,就会导致对数函数计算时出现错误或无穷大的情况。
对数函数(log) 对数的定义:一般地,如果ax=N(a>0,且a≠1),那么数x叫做以a为底N的对数,记作x=logaN,读作以a为底N的对数,其中a叫做对数的底数,N叫做真数。 一般地,函数y=logax(a>0,且a≠1)叫做对数函数,也就是说以幂(真数)为自变量,指数为因变量,底数为常量的函数,叫对数函数。 2.x%n的结果 x%n的结果是[0,n-1]的一个整数 3.n!的结果 n! = 1*2*3*4*...*n n! ——秦九昭公式 证明: 设三角形的三边a、b、c的对角分别为A、B、C, 则根据余弦定理c²=a²+b²-2ab·cosC,得 cosC = (a²+b²-c²)/2ab S=1/2*ab*sinC =1/2*ab*√(1-cos²C) =1/2*ab*√[1-(a²+b²-c²)²/4a²b²] =1/4*√[4a²b²-(a²+b²-c²)²] =1/4*√[(2ab+a²+b²-c²
在CosFace中,对数函数 f(\theta) 如下: f_{C}(\theta)=\cos\theta-m \tag{2} 在ArcFace中,对数函数 f(\theta) 如下: f_{A}(\theta 在作者的X2-Softmax损失中,对数函数 f(\theta) 如下: f_{R}(\theta)=a(\theta-h)^{2}+k \tag{4} 在作者的X2-Softmax损失中, a , h 由于对数函数是二次函数,作者称之为X2-Softmax。X2-Softmax损失函数不使用固定角边界,这使得在面临不同样本分布不平衡的情况下更容易确定边际。 超参数 a , h 和 k 一起决定了X2-Softmax损失中的对数函数曲线,以及对数函数曲线与余弦函数之间的差异。超参数 a 决定了对数函数曲线的开口方向和收敛程度。 由于三个超参数 a , h 和 k 影响对数函数曲线和对类之间的角边界,作者对这三个超参数进行了不同的值设置以进行参数化实验。如图6所示,超参数决定了X2-Softmax中对数函数曲线的形状。
自然对数函数ln(x),当x为正实数,且n趋向于无穷大时,自然对数函数的泰勒级数收敛于0。 自然对数函数的泰勒展开式 x的取值范围不同,ln(x)的泰勒展开式也不同。 True: # 若当前项数大于max_n,计算结束 if n > max_n: break yield n n=n+2 matlab程序源代码清单 %{ 绘图: (1)绘制ln(x)在区间[1,10]内的曲线 (2)绘制ln(x)在x=3邻域内的泰勒展开式 目的:观察泰勒展开式对函数的拟合 %} % 绘制ln(x) (x1); % 绘制ln(x)函数曲线 plot(x1,y1) hold on % 绘制ln(x)在x=3邻域内的泰勒展开式曲线 % 定义符号变量x,y,f syms x y f; % 定义自然对数函数
此外,也很乏味 同一函数的对数函数的一阶导数要简单得多: ? 二阶导数也很简单: ? 当你实际使用对数时,你会得到一个不同的函数。 你走路和开车时不需要走相同的路线。 这正是一个函数和该函数的对数函数共同之处:相同的参数可以最小化损失函数。 对这个函数和它对数函数同时求导就得到损失函数的最小值。 一个数学证明 我们来证明一个使函数最小化的参数等于这个函数的对数函数的最小化的参数。 ? 它的对数函数是: ? 部分图像如下: ? 可以看到,在这两种情况下,函数的最大值都是当x=0.3时取得。 是的,我们没有得到相同的函数,但是我们仍然有相同的临界点来帮助我们最小化损失函数。 一句话总结:一个函数和该函数的对数函数有一个共同之处,就是最小化的参数是相同的,对数求导要简单很多,会加快我们的计算速度。 deephub翻译组:gkkkkkk DeepHub
all(x) 参数均不为0返回true 否则返回false any(x) 参数中只要有一个不为0就返回true 否则返回false asin(x) 反正弦三角函数 atan(x) 反正切三角函数 atan2( cross(a, b) 叉积函数 a、b为三维向量 degress(x) 弧度转度 distance(x, y) 计算两点之间的距离 dot(a, b) 点积函数 exp(x) 指数函数 exp2( x) 指数函数 floor(x) 向下取整 例如x为2.4 函数返回值为2 fmod(x, y) 返回x/y的余数 frexp(x, out exp) 将浮点值x分为尾数和指数 即x = m * 2^exp 返回m isfinite(x) 判断是否为有限数 isinf(x) 判断是否为无限数 isnan(x) 判断是否为非数值(NaN) ldexp(x, n) 返回x * 2^n的值 lerp (a, b, t) 插值函数 log(x) 对数函数 log2(x) 对数函数 log10(x) 对数函数 max(a, b) 取最大值 min(a, b) 取最小值 mul(x, y) 矩阵相乘函数
例如,$2^x$ 表示 $2$ 的 $x$ 次幂,$e^x$ 表示自然对数的 $x$ 次幂。当底数 $a$ 介于 $0$ 和 $1$ 之间时,指数函数表示 $a$ 的负 $x$ 次幂的倒数。 例如,在 Python 中,2 ** 3 表示 $2$ 的 $3$ 次幂,结果为 $8$。指数函数计算可以使用指数函数库,如 exp()。 例如,在 Python 中,math.exp(2) 表示自然对数的 $2$ 次幂,结果为 $e^2$ 的近似值。 对数函数:对数函数是形如 f(x) = logₐ(x) 的函数,其中 a 是对数的底。对数函数的图像是一个从左向右递增的曲线。对数函数的特点是 x 的增加对应着 y 增长速度逐渐减慢。 对数函数常用于描述倍增现象,例如霍夫曼编码和指数增长模型。 除了上述函数类型外,还有三角函数、双曲函数、阶乘函数等。这些函数在数学和科学领域中具有广泛的应用。
---- The Logarithm Defined as an Integral 我们凭借直觉,知道 指数函数,对数函数 为 反函数。 这里我们对它简单证明(略),并且确定一下对应的区域。 2边对x求微分,也可以推导出: ? ---- Laws of Logarithms 对数法则 同理,我们可以推出 对数法则 ? ---- 定理4 一些极限 同理,可以推出两边的极限 ? ---- General Logarithmic Functions 一般对数函数 也就是指数函数的逆函数 ? 一般微分 ?
带负号的对数函数显然符合以上要求,当然,肯定有其他函数也会符合以上要求,对此,香农在《A Mathematical Theory of Communication》(通信的数学理论)这篇论文中有说明选择对数函数的原因 而最自然的选择是对数函数。 关于对数函数更便捷的原因,论文中给出了3点: 在实践中更有用。 对数函数可以让一些工程上非常重要的参数比如时间、带宽、继电器数量等与可能性的数量的对数成线性关系,例如,增加一个继电器会使继电器的可能状态数加倍,而如果对这一可能状态数求以2为底的对数,结果只是加 1。 加倍时间,可能的消息数会近似变成原来的平方(1,2,4,8,...),而其对数则是加倍(log2 1,log2 2,log2 4,log2 8,...)=(0,1,2,3,...) :-log2 (1/4) = 2,所以用2个二进制位可以表示; 无需阅读的邮件:-log2 (1/4) = 2,所以用2个二进制位可以表示。
1.Chao2 2. 稀释曲线估计 3. 种-面积关系 长期以来人们一直在争论,在何种情况下,用幂函数或对数函数。 大多数研究都倾向于幂函数。 幂函数和对数模型都可能提供丰富度的上限和下限,但外推到更大的区域的时候对数函数往往低估丰富度。 幂函数模型和对数模型: 4.
这些数学函数包含了许多常见的数学运算,如三角函数、指数函数、对数函数、统计函数等。本文将介绍NumPy中一些常用的数学函数及其用法,展示NumPy在数值计算方面的强大功能。 示例如下:import numpy as nparr = np.array([2, 4, 6])# 加法result = np.add(arr, 2)print(result) # [4 6 8]# inf -0.]指数和对数函数NumPy提供了指数函数(如幂函数和指数函数)以及对数函数(如自然对数和以2为底的对数)。这些函数可用于计算数值的幂、指数和对数值。 示例代码如下:import numpy as nparr = np.array([2, 4, 6])# 幂函数result = np.power(arr, 2)print(result) # 指数函数 result = np.exp(arr)print(result) # 自然对数result = np.log(arr)print(result) # 以2为底的对数result = np.log2
带负号的对数函数显然符合以上要求,当然,肯定有其他函数也会符合以上要求,对此,香农在《A Mathematical Theory of Communication》(通信的数学理论)这篇论文中有说明选择对数函数的原因 而最自然的选择是对数函数。 关于对数函数更便捷的原因,论文中给出了3点: 在实践中更有用。 对数函数可以让一些工程上非常重要的参数比如时间、带宽、继电器数量等与可能性的数量的对数成线性关系,例如,增加一个继电器会使继电器的可能状态数加倍,而如果对这一可能状态数求以2为底的对数,结果只是加 1。 加倍时间,可能的消息数会近似变成原来的平方(1,2,4,8,...),而其对数则是加倍(log2 1,log2 2,log2 4,log2 8,...)=(0,1,2,3,...) :-log2 (1/4) = 2,所以用2个二进制位可以表示; 无需阅读的邮件:-log2 (1/4) = 2,所以用2个二进制位可以表示。