机器学习代码实现:线性回归与岭回归
我的学记|刘航宇的博客

机器学习代码实现:线性回归与岭回归

刘航宇
2年前发布 /未收录,已推送
温馨提示:
本文最后更新于2023年05月15日,已超过680天没有更新,若内容或图片失效,请留言反馈。

1.线性回归模型

线性回归模型是最简单的一种线性模型,模型的形式就是:
y=WTx+by=W^T x+b
我们可以通过对原本的输入向量x扩增一个为1的维度将参数W和b统一成一个参数W,即模型变成了
y=WTxy=W^T x
这里的W是原本两个参数合并之后的而其损失函数的形式是残差平方损失RSS
L=12mi=1m(WTxiyi)2=12m(WTXy)T(WTXy)L=\frac{1}{2 m} \sum_{i=1}^m\left(W^T x_i-y_i\right)^2=\frac{1}{2 m}\left(W^T X-y\right)^T\left(W^T X-y\right)
我们很容易就可以通过求导得到线性回归模型的关于W的梯度
WL=1mi=1m(WTxiyi)xi=1mXT(WTXy)\nabla_W L=\frac{1}{m} \sum_{i=1}^m\left(W^T x_i-y_i\right) x_i=\frac{1}{m} X^T\left(W^T X-y\right)
这样一来我们就可以通过梯度下降的方式来训练参数W,可以用下面的公式表示
W:=Wα1mXT(WTXy)W:=W-\alpha \frac{1}{m} X^T\left(W^T X-y\right)
但实际上线性模型的参数W可以直接求解出,即:
W=(XTX)1XTyW=\left(X^T X\right)^{-1} X^T y

2.线性回归的编程实现

具体代码中的参数的形式可能和上面的公式推导略有区别,我们实现了一个LinearRegression的类,包含fit,predict和loss三个主要的方法,fit方法就是求解线性模型的过程,这里我们直接使用了正规方程来解

class LinearRegression:
    def fit(self, X: np.ndarray, y: np.ndarray) -> float:
        N, D = X.shape
        # 将每个样本的特征增加一个维度,用1表示,使得bias和weight可以一起计算
        # 这里在输入的样本矩阵X末尾增加一列来给每个样本的特征向量增加一个维度
        # 现在X变成了N*(D+1)维的矩阵了
        expand_X = np.column_stack((X, np.ones((N, 1))))
        self.w = np.matmul(np.matmul(np.linalg.inv(np.matmul(expand_X.T, expand_X)), expand_X.T), y)
        return self.loss(X, y)

predict实际上就是将输入的矩阵X放到模型中进行计算得到对应的结果,loss给出了损失函数的计算方式:

def loss(self, X: np.ndarray, y: np.ndarray):
        """
        线性回归模型使用的是RSS损失函数
        :param X:需要预测的特征矩阵X,维度是N*D
        :param y:标签label
        :return:
        """
        delta = y - self.predict(X)
        total_loss = np.sum(delta ** 2) / X.shape[0]
        return total_loss

3.岭回归Ridge Regression与代码实现

岭回归实际上就是一种使用了正则项的线性回归模型,也就是在损失函数上加上了正则项来控制参数的规模,即:
L=12mi=1m(WTxiyi)2+λW2=12m(WTXy)T(WTXy)+λWTWL=\frac{1}{2 m} \sum_{i=1}^m\left(W^T x_i-y_i\right)^2+\lambda\|W\|_2=\frac{1}{2 m}\left(W^T X-y\right)^T\left(W^T X-y\right)+\lambda W^T W
因此最终的模型的正规方程就变成了:
W=(XTX+λI)1XTyW=\left(X^T X+\lambda I\right)^{-1} X^T y
这里的\lambda是待定的正则项参数,可以根据情况选定,岭回归模型训练的具体代码如下

class RidgeRegression:
    def fit(self, X: np.ndarray, y: np.ndarray):
        N, D = X.shape
        I = np.identity(D + 1)
        I[D][D] = 0
        expand_X = np.column_stack((X, np.ones((N, 1))))
        self.W = np.matmul(np.matmul(np.linalg.inv(np.matmul(expand_X.T, expand_X) 
                                                   + self.reg * I), expand_X.T), y)
        return self.loss(X, y)

4.数据集实验
这里使用了随机生成的二位数据点来对线性模型进行测试,测试结果如下:
image.png
线性模型测试结果
岭回归也使用同样的代码进行测试。

© 版权声明
THE END
喜欢就支持一下吧
点赞 1 分享 赞赏
时光轻拂,如花雅绽
评论 抢沙发
OωO
  • 惊讶
  • 撇嘴
  • 色
  • 发呆
  • 得意
  • 流泪
  • 害羞
  • 闭嘴
  • 睡
  • 大哭
  • 尴尬
  • 发怒
  • 调皮
  • 呲牙
  • 微笑
  • 难过
  • 酷
  • 抓狂
  • 吐
  • 偷笑
  • 可爱
  • 白眼
  • 傲慢
  • 饥饿
  • 困
  • 惊恐
  • 流汗
  • 憨笑
  • 悠闲
  • 奋斗
  • 咒骂
  • 疑问
  • 嘘
  • 晕
  • 折磨
  • 衰
  • 骷髅
  • 敲打
  • 再见
  • 发抖
  • 爱情
  • 跳跳
  • 猪头
  • 拥抱
  • 蛋糕
  • 炸弹
  • 刀
  • 便便
  • 咖啡
  • 玫瑰
  • 凋谢
  • 爱心
  • 心碎
  • 太阳
  • 月亮
  • 赞
  • 踩
  • 握手
  • 胜利
  • 飞吻
  • 怄火
  • 西瓜
  • 冷汗
  • 擦汗
  • 抠鼻
  • 鼓掌
  • 糗大了
  • 坏笑
  • 左哼哼
  • 右哼哼
  • 哈欠
  • 鄙视
  • 委屈
  • 快哭了
  • 阴险
  • 左亲亲
  • 吓
  • 可怜
  • 菜刀
  • 篮球
  • 示爱
  • 抱拳
  • 勾引
  • 拳头
  • 差劲
  • 爱你
  • NO
  • OK
  • 转圈
  • 挥手
  • 鞭炮
  • 喝彩
  • 爆筋
  • 棒棒糖
  • 喝奶
  • 手枪
  • 茶
  • 眨眼睛
  • 泪奔
  • 无奈
  • 卖萌
  • 小纠结
  • 喷血
  • 斜眼笑
  • doge
  • 惊喜
  • 戳一戳
  • 笑哭
  • 我最美
  • 羊驼
  • 幽灵
  • 大笑
  • 不开心
  • 呃
  • 求求
  • 点赞
  • 无聊
  • 托脸
  • 吃
  • 害怕
  • 飙泪
  • 我不看
  • 托腮
  • 啵啵
  • 糊脸
  • 拍头
  • 扯一扯
  • 舔一舔
  • 蹭一蹭
  • 顶呱呱
  • 抱抱
  • 暴击
  • 开枪
  • 撩一撩
  • 拍桌
  • 拍手
  • 干杯
  • 嘲讽
  • 哼
  • 佛系
  • 掐一掐
  • 颤抖
  • 偷看
  • 扇脸
  • 原谅
  • 喷脸
  • 生日快乐
  • 甩头
  • 扔狗
  • 脑阔疼
  • 沧桑
  • 捂脸
  • 辣眼睛
  • 哦哟
  • 头秃
  • 问号脸
  • 暗中观察
  • emm
  • 吃瓜
  • 呵呵哒
  • 我酸了
  • 汪汪
  • 汗
  • 无眼笑
  • 敬礼
  • 狂笑
  • 面无表情
  • 摸鱼
  • 魔鬼笑
  • 哦
  • 请
  • 睁眼
  • 敲开心
  • 让我康康
  • 摸锦鲤
  • 期待
  • 拿到红包
  • 拜谢
  • 元宝
  • 牛啊
  • 胖三斤
  • 好闪
  • 左拜年
  • 右拜年
  • 右亲亲
  • 牛气冲天
  • 喵喵
  • 打call
  • 变形
  • 仔细分析
  • 菜汪
  • 崇拜
  • 比心
  • 庆祝
  • 拒绝
  • 嫌弃
  • 吃糖
  • 惊吓
  • 生气
  • 举牌牌
  • 烟花
  • 虎虎生威
  • 豹富
  • 花朵脸
  • 我想开了
  • 舔屏
  • 打招呼
  • 酸Q
  • 我方了
  • 大怨种
  • 红包多多
  • 你真棒棒
  • 大展宏兔
  • 福萝卜
  • 坚强
  • 贴贴
  • 敲敲
  • 咦
  • 拜托
  • 尊嘟假嘟
  • 耶
  • 666
  • 裂开
  • 骰子
  • 包剪锤
  • 亲亲
  • 狗狗笑哭
  • 好兄弟
  • 狗狗可怜
  • 超级赞
  • 狗狗生气
  • 芒狗
  • 狗狗疑问
  • 奥特笑哭
  • 彩虹
  • 祝贺
  • 冒泡
  • 气呼呼
  • 忙
  • 波波流泪
  • 超级鼓掌
  • 跺脚
  • 嗨
  • 企鹅笑哭
  • 企鹅流泪
  • 真棒
  • 路过
  • emo
  • 企鹅爱心
  • 晚安
  • 太气了
  • 呜呜呜
  • 太好笑
  • 太头疼
  • 太赞了
  • 太头秃
  • 太沧桑
  • 龙年快乐
  • 新年中龙
  • 新年大龙
  • 略略略
  • 狼狗
  • 抛媚眼
  • 超级ok
  • tui
  • 快乐
  • 超级转圈
  • 别说话
  • 出去玩
  • 闪亮登场
  • 好运来
  • 姐是女王
  • 我听听
  • 臭美
  • 送你花花
  • 么么哒
  • 一起嗨
  • 开心
  • 摇起来
  • 划龙舟
经典
emoji
泡泡
阿鲁
颜文字
取消