Rok*_*jic 8 python numpy utility-method pandas smoothstep
钳位功能是 clamp(x, min, max) = min if x < min, max if x > max, else x
我需要一个像钳位函数一样的函数,但它是平滑的(即具有连续导数).
普通钳:
np.clip(x, mi, mx)
Run Code Online (Sandbox Code Playgroud)
Smoothclamp(保证与x <min和x> max的正常钳位一致):
def smoothclamp(x, mi, mx): return mi + (mx-mi)*(lambda t: np.where(t < 0 , 0, np.where( t <= 1 , 3*t**2-2*t**3, 1 ) ) )( (x-mi)/(mx-mi) )
Run Code Online (Sandbox Code Playgroud)
Sigmoid(近似钳位,绝不小于min,绝不大于max)
def sigmoid(x,mi, mx): return mi + (mx-mi)*(lambda t: (1+200**(-t+0.5))**(-1) )( (x-mi)/(mx-mi) )
Run Code Online (Sandbox Code Playgroud)
出于某些目的,Sigmoid将比Smoothclamp更好,因为Sigmoid是一个可逆函数 - 没有信息丢失.
出于其他目的,您可能需要确定所有x> xmax的f(x)= xmax - 在这种情况下,Smoothclamp更好.另外,正如另一个答案中所提到的,有一整套Smoothclamp函数,虽然这里给出的函数足以满足我的目的(除了需要平滑导数之外没有特殊属性)
绘制它们:
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
x = np.linspace(-4,7,1000)
ax.plot(x, np.clip(x, -1, 4),'k-', lw=2, alpha=0.8, label='clamp')
ax.plot(x, smoothclamp(x, -1, 4),'g-', lw=3, alpha=0.5, label='smoothclamp')
ax.plot(x, sigmoid(x, -1, 4),'b-', lw=3, alpha=0.5, label='sigmoid')
plt.legend(loc='upper left')
plt.show()
Run Code Online (Sandbox Code Playgroud)

潜在用途也是这两者的算术平均值:
def clampoid(x, mi, mx): return mi + (mx-mi)*(lambda t: 0.5*(1+200**(-t+0.5))**(-1) + 0.5*np.where(t < 0 , 0, np.where( t <= 1 , 3*t**2-2*t**3, 1 ) ) )( (x-mi)/(mx-mi) )
Run Code Online (Sandbox Code Playgroud)
您正在寻找的是类似于Smoothstep函数,它具有自由参数N,给出"平滑度",即应该连续多少个导数.它定义如下:
这在几个库中使用,可以在numpy中实现
import numpy as np
from scipy.special import comb
def smoothstep(x, x_min=0, x_max=1, N=1):
x = np.clip((x - x_min) / (x_max - x_min), 0, 1)
result = 0
for n in range(0, N + 1):
result += comb(N + n, n) * comb(2 * N + 1, N - n) * (-x) ** n
result *= x ** (N + 1)
return result
Run Code Online (Sandbox Code Playgroud)
它减少到给定的常规钳位函数N=0(0倍可微分),并且随着增加N而增加平滑度.您可以将其可视化为:
import matplotlib.pyplot as plt
x = np.linspace(-0.5, 1.5, 1000)
for N in range(0, 5):
y = smoothstep(x, N=N)
plt.plot(x, y, label=str(N))
plt.legend()
Run Code Online (Sandbox Code Playgroud)
这给出了这个结果:
| 归档时间: |
|
| 查看次数: |
2942 次 |
| 最近记录: |