当前位置: 首页 > news >正文

标签权重的计算方法之贝叶斯平滑

        贝叶斯平滑(Bayesian Smoothing)是一种平滑技术,用于解决评分和标签数据中的样本稀疏性问题。在某些推荐系统或广告点击率预估的场景中,我们可能会遇到标签(例如点击次数和曝光次数)不均衡的问题,有些标签的数据量较少,容易导致模型过拟合。这时候,贝叶斯平滑通过引入贝叶斯估计的思想,为稀疏样本提供平滑效果,从而提高模型的稳定性和泛化能力。

        贝叶斯平滑的核心思想是基于贝叶斯理论,通过对二项分布的参数进行平滑估计,最终得到可靠的标签权重。下面将从底层原理、数学推导到实际实现逐步展开。

1. 原理和数学背景

        贝叶斯平滑的基本步骤是通过对点击率(或评分等标签)进行平滑估计,减少噪声影响。其核心是使用 Beta 分布 对二项分布参数进行估计。Beta 分布的形状由两个参数 α 和 β 决定,适用于对概率进行建模。

假设我们有以下信息:

  • n:某个广告的总展示次数
  • x:点击次数

        如果直接用 CTR=\frac{x}{n}(即点击率),当 n 很小(特别是为 1 或 0)时,该估计值不可靠,会受随机波动影响严重。

Beta 分布

        Beta 分布常用于对概率的分布进行建模。其概率密度函数为:

        f(p | \alpha ,\beta )=\frac{p^{\alpha - 1}(1-p)^{\beta - 1}}{B(\alpha ,\beta )}

其中 B(\alpha ,\beta ) 是 Beta 函数,用于归一化概率密度函数,使得积分为 1。

        我们可以把 α 理解为“正向事件(如点击)"的先验数,把 β 理解为“负向事件(如未点击)”的先验数。

贝叶斯估计代码

        在贝叶斯估计中,我们会将观察到的点击数据 (x,n-x) 与 Beta 分布的参数 (α,β) 结合起来,更新对点击率的估计。这个过程可以通过最大化对数似然函数的方法来估计 α 和 β。

2. 贝叶斯平滑参数估计

        贝叶斯平滑的关键步骤是估计出合适的 α 和 β 参数。我们通过最大化对数似然函数来找到最佳参数:

对数似然函数为:

        L(\alpha ,\beta )=\sum_{i=1}^{N}log\left ( \frac{B(x_{i}+\alpha ,n_{i}-x_{i}+\beta )}{B(\alpha ,\beta)} \right )

        其中,N 是样本总数。

3. 牛顿法迭代估计 α 和 β

        为了求解 α 和 β 的最大似然估计,我们可以使用牛顿法进行迭代。迭代更新规则为:

        \alpha _{new}= \alpha - \frac{​{L}'(\alpha , \beta )}{​{L}''(\alpha , \beta )}

        \beta _{new}=\beta - \frac{​{L}'(\alpha , \beta )}{​{L}''(\alpha , \beta )}

        这里,{L}'(\alpha , \beta ) 是对 α 或 β 的一阶导数,{L}''(\alpha , \beta )  是二阶导数。

4. 实现步骤

        我们将基于上述推导,实现贝叶斯平滑的代码。

第一步:初始化参数
import numpy as np
from scipy.special import digamma, gammaln# 初始化 alpha 和 beta
alpha = 1.0
beta = 1.0

第二步:定义对数似然函数及其导数

        我们需要计算对数似然函数的一阶导数和二阶导数,用于牛顿法迭代更新参数。

def compute_gradient_and_hessian(alpha, beta, impressions, clicks):# 计算一阶导数grad_alpha = sum(digamma(clicks + alpha) - digamma(alpha))grad_alpha += sum(digamma(impressions - clicks + beta) - digamma(beta))grad_alpha -= len(impressions) * (digamma(alpha + beta) - digamma(alpha))grad_beta = sum(digamma(impressions - clicks + beta) - digamma(beta))grad_beta -= len(impressions) * (digamma(alpha + beta) - digamma(beta))# 计算二阶导数hessian_alpha = -len(impressions) * digamma(alpha + beta)hessian_beta = -len(impressions) * digamma(alpha + beta)return grad_alpha, grad_beta, hessian_alpha, hessian_beta

第三步:使用牛顿法更新参数

        根据一阶导数和二阶导数,迭代更新 α 和 β。

def bayesian_smoothing(impressions, clicks, max_iter=100, tol=1e-5):alpha = 1.0beta = 1.0for i in range(max_iter):grad_alpha, grad_beta, hessian_alpha, hessian_beta = compute_gradient_and_hessian(alpha, beta, impressions, clicks)# 更新 alpha 和 betaalpha -= grad_alpha / hessian_alphabeta -= grad_beta / hessian_beta# 检查收敛性if abs(grad_alpha) < tol and abs(grad_beta) < tol:breakreturn alpha, beta

第四步:计算平滑后的标签权重

        通过贝叶斯平滑得到的平滑标签权重可以使用如下公式计算:

         smoothed CTR = \frac{x+\alpha }{n+\alpha + \beta }

def smoothed_ctr(impressions, clicks, alpha, beta):return (clicks + alpha) / (impressions + alpha + beta)

第五步:测试代码
# 示例点击次数和展示次数数据
impressions = np.array([100, 200, 50, 10, 5])
clicks = np.array([5, 10, 3, 1, 0])# 估计 alpha 和 beta
alpha, beta = bayesian_smoothing(impressions, clicks)
print(f"Estimated alpha: {alpha}, beta: {beta}")# 计算平滑的点击率
smoothed_click_through_rate = smoothed_ctr(impressions, clicks, alpha, beta)
print("平滑后的点击率:", smoothed_click_through_rate)

5. 部署到生产环境

        将平滑后的模型部署到生产环境中,通常是将参数 α 和 β 存储下来并与数据计算平滑标签权重。可以通过 API 服务实现,将展示次数和点击次数作为输入,输出平滑后的标签权重。

Flask API 部署
from flask import Flask, request, jsonify
import numpy as npapp = Flask(__name__)# 加载 alpha 和 beta
alpha, beta = 1.5, 5.0  # 预先计算好的 alpha 和 beta 值@app.route('/predict', methods=['POST'])
def predict():data = request.jsonimpressions = np.array(data["impressions"])clicks = np.array(data["clicks"])# 计算平滑后的点击率smoothed_rates = (clicks + alpha) / (impressions + alpha + beta)return jsonify({"smoothed_ctr": smoothed_rates.tolist()})if __name__ == '__main__':app.run(debug=True)

总结

        贝叶斯平滑通过 Beta 分布进行平滑估计,是处理稀疏标签数据的一种有效方法。我们通过定义对数似然函数、使用牛顿法迭代优化参数 α 和 β,最终得到平滑后的标签权重,从而提高模型的稳定性。


http://www.mrgr.cn/news/67707.html

相关文章:

  • Android笔记(三十一):Deeplink失效问题
  • 030集——分组法——C# CAD二次开发
  • 语音识别中的RPM技术:原理、应用与发展趋势
  • 学习threejs,将多个网格合并成一个网格
  • 计算机视觉读书系列(1)——基本知识与深度学习基础
  • 20分钟,一篇文章,带你理解面向对象!
  • Postman上传图片如何处理
  • M1M2 MAC安装windows11 虚拟机的全过程
  • Oracle 数据库特性一图快速了解
  • 元学习法Meta-Learner
  • 跨域及解决跨域
  • 受保护的视图取消方法
  • MQTT从入门到精通之MQTT进阶
  • 网站robots文件怎么优化?robots.txt文件的作用及生成
  • 【C++】封装红黑树实现mymap和myset
  • ADS软件操作(一)
  • 雷池社区版7.1新版本自定义NGINX配置分析
  • 策略梯度方法【Policy Gradient】
  • 阿里云函数计算GBK编码
  • 刚接收就被On Hold了,我的SCI还有救吗?
  • cuda 环境搭建
  • 移动应用病毒式营销:如何吸引数百万用户
  • 芯片低功耗设计实现upf编写指南(附低功耗项目案例)
  • Git进阶(十九):git revert 导致 merge 代码丢失问题修复
  • Qos基本原理+园区网络
  • kelp protocol