IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 从0手撸Gamma回归 -> 正文阅读

[人工智能]从0手撸Gamma回归

模型公式

线性回归、逻辑回归、泊松回归。。。各种各样的回归可以抽象出一个通用线性回归

通用线性回归模型 [Generalized Linear Models (GLM)]:

y ^ ( w , X ) = h ( X w ) \hat y(w, X) = h(Xw) y^?(w,X)=h(Xw)

不同的回归模型所对应的函数 h h h各不相同

标准的线性回归的 h h h函数则为常数1:

y ^ l i n e a r = X w \hat y_{linear}=Xw y^?linear?=Xw

Gamma回归所对应的函数 h h h则为 e e e y ^ l i n e a r \hat y_{linear} y^?linear?次幂,完整的Gamma模型公式如下:

y ^ = e X w \hat y = e^{Xw} y^?=eXw

损失函数

同样各种各样的回归都能抽象出来一个通用的损失函数,具体公式如下:

min ? w 1 2 n samples ∑ i d ( y i , y ^ i ) + α 2 ∣ ∣ w ∣ ∣ 2 2 \min_{w} \frac{1}{2 n_{\text{samples}}} \sum_i d(y_i, \hat{y}_i) + \frac{\alpha}{2} ||w||_2^2 minw?2nsamples?1?i?d(yi?,y^?i?)+2α?w22?

  • 其中, ∣ ∣ w ∣ ∣ 2 ||w||_2 w2?为L2范数, α \alpha α则为L2的惩罚项

不同的回归模型所对应的函数 d d d各不相同

标准的线性回归函数 d d d则为,

d ( y i , y ^ i ) = ( y ? y ^ ) 2 d(y_i, \hat{y}_i)=(y-\hat{y})^2 d(yi?,y^?i?)=(y?y^?)2

α = 0 \alpha=0 α=0

而Gamma回归模型所对应的函数 d d d则为:

d ( y i , y ^ i ) = 2 ( log ? y ^ y + y y ^ ? 1 ) d(y_i, \hat{y}_i)=2(\log\frac{\hat{y}}{y}+\frac{y}{\hat{y}}-1) d(yi?,y^?i?)=2(logyy^??+y^?y??1)

代码实现Loss以及求导

当前章节则先用numpy实现求loss以及梯度 再借用Pytorch的自动求导机制实现求导 从而验证结果是否正确

import torch
import numpy as np

# 定义loss以及梯度的计算
def grad(coef, X, y, y_pred, alpha=1):
    # coef第0位存放bias
    offset = 1
    # 计算标准线性回归 WX + bais
    lin_pred = X @ coef[offset:] + coef[0]
    # 计算Gamma回归 基于标准线性回归 e^{WX + bais}
    y_pred = np.exp(lin_pred)

    # 计算梯度部分
    d1 = np.exp(lin_pred)
    coef_scaled = alpha * coef[offset:]
    temp = d1 * -2 * (y - y_pred) / np.power(y_pred, 2)
    devp = np.concatenate(([temp.sum()], temp @ X))
    grad = 0.5 * devp
    grad[offset:] += coef_scaled

    return grad

# 计算Loss部分
def loss(coef, y, y_pred, alpha=1):
    offset = 1
    # coef的第0位存放bias 详看后边完整代码
    coef_scaled = alpha * coef[offset:]
    # Unit Deviance d(y, y^hat)
    dev = np.sum(2 * (np.log(y_pred / y) + y / y_pred - 1))
    # 完整的loss函数 【The minimization problem】
    loss = 0.5 * dev + 0.5 * (coef[offset:] @ coef_scaled)

    return loss

X = np.array([[1, 2], [2, 3], [3, 4], [4, 3]])
y = np.array([19, 26, 33, 30])

"""numpy的实现"""
# 初始化模型
coef = np.zeros(X.shape[1] + 1)
bias = np.log(np.average(y))
coef[0] = bias
# 前传
linear_pred = X @ coef[1:] + coef[0]
gamma_pred = np.exp(linear_pred)
# 求loss
loss_np = loss(coef, y, gamma_pred, 1)
# 求梯度
grad_np = grad(coef, X, y, gamma_pred, 1)[1:]
print(f"Loss: {loss_np} Grad: {grad_np}")
# 由于用普通的SGD无法实现Gamma回归的迭代模型 故略去不写
# 详见后面完整代码

"""Pytorch实现进行验证"""
X = torch.from_numpy(X).double()
y = torch.from_numpy(y).double()
coef = torch.from_numpy(coef)
coef.requires_grad = True
# 前传
linear_pred = X @ coef[1:] + coef[0]
gamma_pred = torch.exp(linear_pred)
# 求loss
coef_scaled = 1 * coef[1:]
dev = (2 * (torch.log(gamma_pred / y) + y / gamma_pred - 1)).sum()
loss_pt = 0.5 * dev + 0.5 * (coef[1:] @ coef_scaled)
# 反向传播
loss_pt.backward()
# 查看loss以及梯度
grad_pt = coef.grad[1:].numpy()
print(f"Loss: {loss_pt} Grad: {grad_pt}")

assert loss_np == loss_pt
assert grad_np.all() == grad_pt.all()

完整代码实现

import numpy as np
from scipy.optimize import minimize


X = np.array([[1, 2], [2, 3], [3, 4], [4, 3]])
y = np.array([19, 26, 33, 30])


# 实现gamma回归
class GammaRegressor:

    def __init__(self, alpha=1):
        # L2范数惩罚系数
        self.alpha = alpha

    def init_model(self, X, y):
        _, n_features = X.shape

        # 生成 Weigh 与 Bias, 存储为coef 第0个为Bias
        coef = np.zeros(n_features + 1)
        coef[0] = np.log(np.average(y))

        return coef

    def show_coef(self, coef):
        print(f"[INFO] 当前模型: {coef}")

    def fit(self, X, y):
        """训练"""

        # 初始化函数
        coef = self.init_model(X, y)

        # 定义loss以及梯度的计算
        def cal_loss_and_grad(coef, obj, X, y):

            offset = 1
            # 计算标准线性回归 WX + bais
            lin_pred = X @ coef[offset:] + coef[0]
            # 计算Gamma回归 基于标准线性回归 e^{WX + bais}
            y_pred = np.exp(lin_pred)

            # 计算Loss部分
            coef_scaled = obj.alpha * coef[offset:]
            # Unit Deviance d(y, y^hat)
            dev = np.sum(2 * (np.log(y_pred / y) + y / y_pred - 1))
            # 完整的loss函数 【The minimization problem】
            loss = 0.5 * dev + 0.5 * (coef[offset:] @ coef_scaled)

            # 计算梯度部分
            d1 = np.exp(lin_pred)
            temp = d1 * -2 * (y - y_pred) / np.power(y_pred, 2)
            devp = np.concatenate(([temp.sum()], temp @ X))
            grad = 0.5 * devp
            grad[offset:] += coef_scaled
            print(f"[INFO] 当前梯度: {grad}")
            print(f"[INFO] 当前loss: {loss}")

            return loss, grad

        # 开始训练 优化方法采用 L-BFGS-B 采用SGD会梯度爆炸无法收敛
        args = (self, X, y)
        opt_res = minimize(
            cal_loss_and_grad,
            coef,
            method="L-BFGS-B",
            jac=True,
            options={
                "maxiter": 5,
                "disp": True
            },
            args=args,
            callback=self.show_coef
        )
        coef = opt_res.x

        return coef


gmr = GammaRegressor()
gmr.fit(X, y)

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-06-23 00:53:40  更:2022-06-23 00:54:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:53:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码