基于weka平台手工实现(LinearRegression | Ridge Regression,岭回归)

这篇具有很好参考价值的文章主要介绍了基于weka平台手工实现(LinearRegression | Ridge Regression,岭回归)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、普通的线性回归

线性回归主要采用最小二乘法来实现,主要思想如下:

X = ( x 11 x 12 ⋯ x 1 d 1 x 21 x 22 ⋯ 5 1 ⋮ ⋮ ⋱ ⋮ ⋮ x m 1 x m 2 ⋯ x m d 1 ) X=\left( \begin{matrix} x_{11} & x_{12} & \cdots & x_{1d} & 1 \\ x_{21} & x_{22} & \cdots & 5 & 1 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ x_{m1} & x_{m2} & \cdots & x_{md} & 1 \\ \end{matrix} \right) X= x11x21xm1x12x22xm2x1d5xmd111

X为一个m行d+1列的矩阵,其中m行为数据的数量,d+1列表示参数的数量。d表示未知数系数的个数,1用来与截距相乘,相当于b。

ω ^ ∗ = arg ⁡ min ⁡ ω ( y − X ω ^ ) T ( y − X ω ^ ) \hat{\omega}^*=\mathop{\arg\min}\limits_{\omega}(y-X\hat{\omega})^T(y-X\hat{\omega}) ω^=ωargmin(yXω^)T(yXω^)

损失函数如下:

E ω ^ = ( y − X ω ^ ) T ( y − X ω ^ ) E_{\hat\omega}=(y-X\hat{\omega})^T(y-X\hat{\omega}) Eω^=(yXω^)T(yXω^)

对于一个梯度可求最大次方项为正的函数来讲,极小值点为导数为0的点。

∂ E ω ^ ∂ ω ^ = 2 X T ( X ω ^ − y ) = 0 \frac{\partial E_{\hat\omega}}{\partial\hat\omega}=2X^T(X\hat\omega-y)=0 ω^Eω^=2XT(Xω^y)=0

( X ω ^ − y ) = 0 (X\hat\omega-y)=0 (Xω^y)=0

X ω ^ = y X\hat\omega=y Xω^=y

X T X ω ^ = X T y X^TX\hat\omega=X^Ty XTXω^=XTy

ω ^ ∗ = ( X T X ) − 1 X T y \hat\omega^*=(X^TX)^{-1}X^Ty ω^=(XTX)1XTy

但是,矩阵求逆的前提是,当前矩阵是满秩的,也就是说它是非奇异矩阵,这就要求, X T X X^TX XTX 矩阵中的数据都是线性无关的,如果其中的数据存在线性相关性,那么是无法求逆的。

这对于一个高维特征的数据是很难做到的,因为维度之间很可能存在相关性,完全一致之后就会成为奇异矩阵(无法求逆)。

因此,岭回归就产生了。专门用来解决上述问题。

二、岭回归(Ridge Regression)

岭回归主要做法是,对上述公式的对角线上加了一个很小的值(岭系数),这样无论如何, X T X X^TX XTX 就都可以求导了。

ω ^ ∗ = ( X T X + λ I ) − 1 X T y (1) \hat\omega^*=(X^TX+\lambda I)^{-1}X^Ty\tag{1} ω^=(XTX+λI)1XTy(1)

岭回归不是随便加的 λ \lambda λ,因为我们要防止曲线过拟合,就需要控制多元函数的各个系数都不要太大,如果太大,就会造成过拟合,因此在损失函数后加上一个正则项。

E ω ^ = ( y − X ω ^ ) T ( y − X ω ^ ) + λ ω T ω = ( y T y − y T X ω ^ − ω ^ T X T y + ω ^ T X T X ω ^ ) + λ ω T ω \begin{aligned} E_{\hat\omega}&=(y-X\hat{\omega})^T(y-X\hat{\omega})+\lambda \omega^T\omega \\ &=(y^Ty-y^TX\hat{\omega}-\hat\omega^T X^Ty+\hat\omega^T X^TX\hat\omega)+\lambda\omega^T\omega \end{aligned} Eω^=(yXω^)T(yXω^)+λωTω=(yTyyTXω^ω^TXTy+ω^TXTXω^)+λωTω

∂ E ω ^ ∂ ω ^ = − X T Y − X T Y + 2 X T X ω ^ + 2 λ ω ^ = 2 ( − X T Y + X T X ω ^ + λ ω ^ ) = 0 \begin{aligned} \frac{\partial E_{\hat\omega}}{\partial\hat\omega}&=-X^TY-X^TY+2X^TX\hat\omega+2\lambda\hat\omega\\ &=2(-X^TY+X^TX\hat\omega+\lambda\hat\omega)\\ &=0 \end{aligned} ω^Eω^=XTYXTY+2XTXω^+2λω^=2(XTY+XTXω^+λω^)=0

X T X ω ^ + λ ω ^ = X T Y X^TX\hat\omega+\lambda\hat\omega=X^TY XTXω^+λω^=XTY

( X T X + λ ) ω ^ = X T Y (X^TX+\lambda)\hat\omega=X^TY (XTX+λ)ω^=XTY

ω ^ = ( X T X + λ I ) − 1 X T Y (2) \hat\omega=(X^TX+\lambda I)^{-1}X^TY\tag{2} ω^=(XTX+λI)1XTY(2)
将 (2) 式和 (1) 式进行对比,可以发现,二者是相同的。

三、代码实现

代码实现注释已经较为清晰,在此不再赘述具体实现过程。

package weka.classifiers.myf;

import weka.classifiers.Classifier;
import weka.core.*;
import weka.core.matrix.Matrix;

/**
 * @author YFMan
 * @Description 自定义的 线性回归 分类器
 * @Date 2023/5/9 15:45
 */
public class myLinearRegression extends Classifier {

    // 用于存储 线性回归 系数 的数组
    private double[] m_Coefficients;

    // 类别索引
    private int m_ClassIndex;

    // 存储训练数据
    private Instances m_Instances;

    /*
     * @Author YFMan
     * @Description 根据训练数据 建立 线性回归模型
     * @Date 2023/5/9 22:08
     * @Param [data] 训练数据
     * @return void
     **/
    public void buildClassifier(Instances data) throws Exception {
        // 存储训练数据
        m_Instances = data;

        // 初始化类别索引
        m_ClassIndex = data.classIndex();

        // 用来存储 线性回归 系数 的数组
        m_Coefficients = null;

        // 初始化数据矩阵 X
        // 高度是样例数量,宽度是属性数量+1(1作为 截距参数b 的输入)
        Matrix X = new Matrix(data.numInstances(), data.numAttributes());

        // 初始化数据矩阵 Y
        // 高度是样例数量,宽度是1
        Matrix Y = new Matrix(data.numInstances(), 1);

        // 初始化矩阵值
        for (int i = 0; i < data.numInstances(); i++) {
            int column = 0;
            for (int j = 0; j < data.numAttributes(); j++) {
                if (j != data.classIndex()) {
                    X.set(i, column, data.instance(i).value(j));
                    column++;
                } else {
                    Y.set(i, 0, data.instance(i).value(j));
                }
            }
        }

        // 设置 X 的最后一列为 1,用于计算 截距参数b
        for (int i = 0; i < data.numInstances(); i++) {
            X.set(i, data.numAttributes() - 1, 1);
        }

        // 计算XTX
        Matrix XTX = X.transpose().times(X);
        // 计算XTY
        Matrix XTY = X.transpose().times(Y);

        // 由于XTX可能是奇异矩阵,所以需要加一个岭回归系数
        for (int i = 0; i < XTX.getRowDimension(); i++) {
            XTX.set(i, i, XTX.get(i, i) + 0.0001);
        }

        // 计算系数矩阵
        Matrix solution = XTX.inverse().times(XTY);

        // 将系数矩阵转换为数组
        m_Coefficients = new double[solution.getRowDimension()];
        for (int i = 0; i < solution.getRowDimension(); i++) {
            m_Coefficients[i] = solution.get(i, 0);
        }
    }

    /*
     * @Author YFMan
     * @Description 利用 建立的线性模型 对样例进行分类
     * @Date 2023/5/9 22:10
     * @Param [instance] 待分类的样例
     * @return double
     **/
    public double classifyInstance(Instance instance) throws Exception {
        // 计算回归模型的预测值
        double result = 0;
        int column = 0;
        for (int i = 0; i < instance.numAttributes(); i++) {
            if (m_ClassIndex != i) {
                result += instance.value(i) * m_Coefficients[column];
                column++;
            }
        }
        // 加上截距参数
        result += m_Coefficients[column];

        // 返回预测值
        return result;
    }

    /*
     * @Author YFMan
     * @Description 输出建立的线性模型
     * @Date 2023/5/9 22:29
     * @Param []
     * @return java.lang.String
     **/
    public String toString() {

        try {
            StringBuilder text = new StringBuilder();
            int column = 0;
            boolean first = true;

            text.append("\nLinear Regression Model\n\n");

            text.append(m_Instances.classAttribute().name()).append(" =\n\n");
            for (int i = 0; i < m_Instances.numAttributes(); i++) {
                if (i != m_ClassIndex) {
                    if (!first)
                        text.append(" +\n");
                    else
                        first = false;
                    text.append(Utils.doubleToString(m_Coefficients[column], 12, 4)).append(" * ");
                    text.append(m_Instances.attribute(i).name());
                    column++;
                }
            }
            text.append(" +\n").append(Utils.doubleToString(m_Coefficients[column], 12, 4));
            return text.toString();
        } catch (Exception e) {
            return "Can't print Linear Regression!";
        }
    }

    /*
     * @Author YFMan
     * @Description 主函数 生成一个线性回归函数预测器
     * @Date 2023/5/9 22:35
     * @Param [argv]
     * @return void
     **/
    public static void main(String[] argv) {
        runClassifier(new myLinearRegression(), argv);
    }
}

四、结果分析

在weka平台中的cpu.arff数据集上进行实验。

我们自己写的模型结果:

基于weka平台手工实现(LinearRegression | Ridge Regression,岭回归),机器学习,数据挖掘,回归,人工智能

weka中的线性回归模型结果:

基于weka平台手工实现(LinearRegression | Ridge Regression,岭回归),机器学习,数据挖掘,回归,人工智能

可以看到,weka平台中的算法和我们自己实现的结果,训练得到的参数是一致的,不同点在于weka平台中的算法有对属性进行选择,并没有使用所有特征进行训练(weka使用了5个特征),而我自己实现的没有进行属性选择,所以一共有6个特征。文章来源地址https://www.toymoban.com/news/detail-526273.html

到了这里,关于基于weka平台手工实现(LinearRegression | Ridge Regression,岭回归)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于weka手工实现逻辑斯谛回归(Logistic回归)

    逻辑斯谛回归模型其实是一种分类模型,这里实现的是参考李航的《统计机器学习》以及周志华的《机器学习》两本教材来整理实现的。 假定我们的输入为 x x x , x x x 可以是多个维度的,我们想要根据 x x x 去预测 y y y , y ∈ { 0 , 1 } yin {0,1} y ∈ { 0 , 1 } 。逻辑斯谛的模型

    2024年02月15日
    浏览(32)
  • 《数据挖掘基础》实验:Weka平台实现分类算法

    进一步理解分类算法(决策树、贝叶斯),利用weka实现数据集的分类处理,学会调整模型参数,以图或树的形式给出挖掘结果,并解释规则的含义。 随机选取数据集(UCI或data文件夹),完成以下内容:(用三种方法:KNN、C4.5算法、贝叶斯算法) 文件导入与编辑 参数设置说

    2024年02月05日
    浏览(42)
  • 《数据挖掘基础》实验:Weka平台实现关联规则挖掘

    进一步理解关联规则算法(Apriori算法、FP-tree算法),利用weka实现数据集的挖掘处理,学会调整模型参数,读懂挖掘规则,解释规则的含义 (1)随机选取数据集为对象,完成以下内容:(用两种方法:Apriori算法、FP-tree算法) 文件导入与编辑; 参数设置说明; 结果截图;

    2024年02月02日
    浏览(36)
  • Weka:Weka是一个开源机器学习平台,它可以运行各种算法,并且提供了良好的交互界面。

    作者:禅与计算机程序设计艺术 Weka是一款由斯坦福大学开发的一套用于数据挖掘、统计分析和机器学习的Java环境软件包,其独特的基于GUI的交互模型和丰富的插件系统,使得其成为许多数据科学家和学者的首选工具。它的功能覆盖了数据预处理、特征选择、分类、回归、聚

    2024年02月06日
    浏览(38)
  • 基于Java+SpringBoot+Vue前后端分离手工艺品销售系统设计和实现

    博主介绍 : ✌ 全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作 ✌ 主要内容: SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、P

    2024年02月03日
    浏览(37)
  • 大数据分析案例-基于LinearRegression回归算法构建房屋价格预测模型

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集

    2024年02月03日
    浏览(40)
  • 利用weka进行数据挖掘——基于Apriori算法的关联规则挖掘实例

    首先,如果不熟悉weka的使用的话,可以从我的git仓库里面拉取一下weka的相关教程,仓库里面还有包含此次实例的所有资源 我们可以在weka的官网上下载weka软件:weka官网 如果下载速度慢的话也可以直接从我的git仓库里面拉取这个软件,软件是win64位的weka-3-8-6 然后找到对应版

    2024年02月06日
    浏览(32)
  • 【数据挖掘大作业】基于决策树的评教指标筛选(weka+数据+报告+操作步骤)

    数据挖掘大作业 下载链接:【数据挖掘大作业】基于决策树的评教指标筛选(weka使用手册+数据+实验报告) 一、考核内容 现有某高校评教数据(pjsj.xls),共计842门课程,属性包括:课程名称、评价人数、总平均分以及10个评价指标Index1-Index10。指标内容详见表1。 表 1 学生评教

    2024年02月09日
    浏览(36)
  • 机器学习:基于逻辑回归(Logistic Regression)对股票客户流失预测分析

    作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍 📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪 专栏案例:

    2023年04月26日
    浏览(42)
  • Python实现逻辑回归(Logistic Regression)

    💥 项目专栏:【Python实现经典机器学习算法】附代码+原理介绍 👑 最近粉丝群中很多朋友私信咨询一些决策树、逻辑回归等机器学习相关的编程问题,为了能更清晰的说明,所以建立了本专栏 专门记录基于原生Python实现一些入门必学的机器学习算法 ,帮助广大零基础用户

    2024年02月01日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包