变限积分求导公式
假设有函数定义为:
量化失真与最优标量量化
对于N个量化区间的失真定义为:
当D能取得最小值时,即:
令, 对该式展开求导,可得
式(1) 和 式(2)构成最优标量量化器的必要条件,即影响量化是真的所有变量的偏导数都为0,这变量为: 边界 量化估计值
其中式(2)和物理学中的质心公式形式相同,因此也可以理解成区间的质心
一般来说,直接求解这两个公式比较麻烦,现实中的算法步骤是:
代码实现
def interval_MSE(x,t1,t2):
return integrate.quad(lambda t: ((t - x)**2) * f(t), t1, t2)[0]
该函数用于计算积分:
def MSE(t,x):
s = interval_MSE(x[0], -float('Inf'), t[0]) + interval_MSE(x[-1], t[-1], float('Inf'))
for i in range(1,len(x)-1):
s = s + interval_MSE(x[i], t[i-1], t[i])
return s
该函数用于计算积分:
其中n表示序列中的最后一个元素
def centroid(t1,t2):
if integrate.quad(f, t1, t2)[0] == 0 or t1 == t2:
return 0
else:
return integrate.quad(lambda t:t*f(t), t1, t2)[0] / integrate.quad(f, t1, t2)[0]
该函数用于计算区间质心:
# error_threshold 误差阈值
# 不过问题是,这个东西如何保证算法一定收敛
def maxlloyd(t,x,error_threshold):
# 计算当前的MSE
e = MSE(t,x)
error = [e]
c = 0
# 控制300次以内,以及误差小于阈值
while e > error_threshold and c < 300:
c = c+1
# 奇数
if c%2 == 1:
# adjust thresholds
# 更新边界
for i in range(len(t)):
t[i] = 0.5 * ( x[i] + x[i+1] )
else:
# adjust levels
# 更新量化估计值
# 负∞和t_0 的质心
x[0] = centroid(-float('Inf'), t[0])
# t_n 和∞的质心
x[-1] = centroid(t[-1], float('Inf'))
# 其余每个区间的质心
for i in range(1,len(x)-1):
x[i] = centroid(t[i-1], t[i])
# 计算误差
e = MSE(t,x)
# 增加误差记录
error.append(e)
print(e)
return x,t,error
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】