线性回归实战---Abalone鲍鱼年龄预测

news2024/12/23 17:44:21

线性回归实现Abalone鲍鱼年龄预测

文章目录

  • 线性回归实现Abalone鲍鱼年龄预测
    • 一、环境准备
        • 数据集简介
    • 二、线性回归基础知识
        • 什么是线性回归?
        • “最小二乘法” 求解线性回归问题
    • 三、Python代码
    • 四、结果分析

前面我们使用手动编写,后面通过sklearn第三方库来与我们手写的模型进行对比

一、环境准备

原始数据集下载及说明:https://archive.ics.uci.edu/ml/datasets/abalone

Python 3.9.13+PyCharm 2022.2.3 (Professional Edition) 或者 jupyter什么的自己选择

sklearn==1.1.3 pip install -U scikit-learn

数据集简介

官方的文档介绍如下:

在这里插入图片描述

从中我们可以看到原始数据集共有4177条数据,其中每条数据包含9个特征,见下表

名称数据类型测量单位描述
性别标称M、F和I(婴儿)
长度连续mm最长外壳测量
直径连续mm垂直于长度
高度连续mm壳中有肉
全重连续g整只鲍鱼
屠宰重量连续g肉的重量
内脏重量连续g肠道重量(出血后)
壳重连续g干燥后
Ringsinteger+1.5表示年龄(年)

同样的,我们还是可以不用太关心这些特征是什么并不影响我们后面对鲍鱼年龄的预测.

二、线性回归基础知识

什么是线性回归?

在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。

在这里插入图片描述
在这里插入图片描述

“最小二乘法” 求解线性回归问题

在这里插入图片描述
在这里插入图片描述

推荐参考: 用人话讲明白线性回归LinearRegression

三、Python代码

# -*- coding: utf-8 -*-
# @Author : yxn
# @Date : 2022/11/12 18:49 
# @IDE : PyCharm(2022.2.3) Python3.9.13
import numpy as np
from scipy.stats import pearsonr
from sklearn import linear_model


class LinearRegression:
    """手动实现线性回归模型的LinearRegression类"""
    def __init__(self):
        self.w = None  # 增广权重向量
        self.n_features = None  # 用于存储样本属性的数量

    def fit(self, X, y):
        """
        在进行异常判断之后,将样本转化为增广特征向量,然后使用公式w=(X^TX)^{-1}X^Ty,
        利用numpy的dot与linalg.inv函数,实现最小二乘法。(需要判断样本数量是否大于属性数量)
        :param X: 训练属性集X训
        :param y: 练标签集y
        :return: 最优参数w
        """
        assert isinstance(X, np.ndarray) and isinstance(y, np.ndarray)  # assert(断言)用于判断输入值是否异常
        assert X.ndim == 2 and y.ndim == 1
        assert y.shape[0] == X.shape[0]
        n_samples = X.shape[0]
        self.n_features = X.shape[1]
        extra = np.ones((n_samples,))
        X = np.c_[X, extra]
        if self.n_features < n_samples:
            self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)  # 使用最小二乘法求权重w,np.linalg.inv:求逆矩阵
        else:
            raise ValueError('dont have enough samples')

    def predict(self, X):
        """
        用于执行测试,输入测试样本集,转化成增广特征向量,返回预测标签。
        :param X: 测试属性集X
        :return: 预测标签y_
        """
        n_samples = X.shape[0]
        extra = np.ones((n_samples,))
        X = np.c_[X, extra]
        if self.w is None:
            raise RuntimeError('cant predict before fit')
        y_ = X.dot(self.w)
        return y_


def loadDataSet(fileName):
    """
    数据集每一行为一个样本,其中最后一个值为标签,其余值为属性。
    根据文件名,依次读取每一行,将属性与标签转化为float类型,存储在列表中,再存入属性集xArr,标签集yArr
    :param fileName: 数据集文件名fileName
    :return: 属性集xArr,标签集yArr(转化成numpy的array类型)
    """
    numFeat = len(open(fileName).readline().split('\t')) - 1
    xArr = []
    yArr = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr = []
        curLine = line.strip().split('\t')
        for i in range(numFeat):
            lineArr.append(float(curLine[i]))
        xArr.append(lineArr)
        yArr.append(float(curLine[-1]))
    return np.array(xArr), np.array(yArr)


def main():
    """(顶层代码)线性回归模型完成鲍鱼年龄的预测
    :return:
    """
    # 使用loadDataSet函数读取文件abalone.txt,将返回的属性集、标签集赋值给X, y
    X, y = loadDataSet(r"E:\wynuJunior\模式识别\5回归实践\abalone.csv")
    # #===================手写LinearRegression==============================# #
    lr = LinearRegression()  # 实例化LinearRegression()模型
    lr.fit(X, y)  # 使用fit方法进行训练
    y_pre = lr.predict(X)  # 使用predict方法,对训练时的属性集再进行预测
    print("手写线性回归预测标签:", y_pre)
    # #===================sklearn模块中LinearRegression=======================# #
    sklearn_lr = linear_model.LinearRegression()  # 调用sklearn模块中的线性回归模型
    sklearn_lr.fit(X, y)  # 使用fit方法进行训练
    sklearn_y_pre = sklearn_lr.predict(X)  # 使用predict方法,对训练时的属性集再进行预测
    print("sklearn模块线性回归预测标签:\n", sklearn_y_pre)
    # 使用pearsonr相关系数,比较两种预测结果的差距。(顶层代码)
    # pearsonr函数可以从scipy.stats模块导入,输入两个序列,比较其相似性,
    # 现将手写模型的结果y_pre与sk-learn模型的结果sklearn_y_pre
    # 返回两个数值,分别代表相似性与置信度,其中第一个数值(相似性)应当为1,否则代表手写代码出现错误。
    print('手动编写的线性回归与sklearn中的线性回归预测结果相似性为: ', pearsonr(y_pre, sklearn_y_pre)[0])


if __name__ == '__main__':
    main()  # 程序执行入口
补充内容: 岭回归 
# -*- coding: utf-8 -*-
# @Author : yxn
# @Date : 2022/11/23 22:36 
# @IDE : PyCharm(2022.2.3) Python3.9.13
import numpy as np
from sklearn import linear_model


def loadDataSet(fileName):
    """
    数据集每一行为一个样本,其中最后一个值为标签,其余值为属性。
    根据文件名,依次读取每一行,将属性与标签转化为float类型,存储在列表中,再存入属性集xArr,标签集yArr
    :param fileName: 数据集文件名fileName
    :return: 属性集xArr,标签集yArr(转化成numpy的array类型)
    """
    numFeat = len(open(fileName).readline().split('\t')) - 1
    xArr = []
    yArr = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr = []
        curLine = line.strip().split('\t')
        for i in range(numFeat):
            lineArr.append(float(curLine[i]))
        xArr.append(lineArr)
        yArr.append(float(curLine[-1]))
    return np.array(xArr), np.array(yArr)


def Ridge_regression():
    """岭回归模型完成鲍鱼年龄的预测
    # 官方文档 https://scikit-learn.org/dev/modules/generated/sklearn.linear_model.Ridge.html
    """
    # 使用loadDataSet函数读取文件abalone.txt,将返回的属性集、标签集赋值给X, y
    X, y = loadDataSet(r"E:\wynuJunior\模式识别\5回归实践\abalone.csv")

    # #===================sklearn模块中岭回归=======================# #
    # l2正则化线性最小二乘。alpha是L2正则化常数,它乘以L2项,控制正则化的力量。
    # 当' alpha = 0 '时,目标等价于普通最小值平方.
    ridge_reg = linear_model.Ridge(alpha=0., solver='lsqr')  # 岭回归
    ridge_reg.fit(X, y)  # 使用fit方法进行训练
    ridge_y_pre = ridge_reg.predict(X)  # 使用predict方法,对训练时的属性集再进行预测
    print("sklearn模块岭回归预测标签:\n", ridge_y_pre)


if __name__ == '__main__':
    Ridge_regression()  # 程序执行入口

四、结果分析

运行结果如下:

在这里插入图片描述

可以看到我们是输出标签都是一样的,而且预测结果相似性也达到了99.9%,可见手写的线性回归是正确的.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql——使用字符集以及校对

一、字符集 1、查看mysql支持的所有字符集 show character set; 2、查看指定数据库的字符集 show variables like ‘character%’; 这八种情况分别对应&#xff1a; 1&#xff09;设置客户端使用的字符集 2&#xff09;设置链接数据库时的字符集 3&#xff09;设置创建数据库…

2、Pinpoint-Server端安装

0、本章节简介 安装Pinpoint服务端 采用Docker安装所以需要提前安装 docker和 docker-compose 本文使用的版本是Pinpoint:2.1版本 ps 由于Pinpoint依赖了很多的基础镜像&#xff0c;所以推荐不要在已经部署了程序的机器上部署&#xff0c;以免造成端口号冲突&#xff0c;推荐使…

HTML5期末大作业——HTML+CSS+JavaScript平遥古城旅游景点介绍(6页)

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

【笔试强训】Day2

&#x1f308;欢迎来到笔试强训专栏 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&#x…

Vue常用知识点汇总

1. Vue常见的指令有哪些&#xff0c;有什么用 &#xff08;1&#xff09;v-text&#xff1a; 会替换掉元素里的内容&#xff1b; &#xff08;2&#xff09;v-html&#xff1a; 可以渲染html界面&#xff1b; &#xff08;3&#xff09;v-clock&#xff1a; 防止界面闪烁&…

[附源码]java毕业设计学校缴费系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Activity的启动模式

文章目录Activity的启动模式standardsingleTopsingleTasksingleInstanceActivity的启动模式 在实际的项目当中,我们应该根据特定的需求给每个Avtivity指定恰当的启动模式启动模式一共包含四种:standard,singleTop,singleTask,singleInstance指定启动模式的方法:在AndroidManif…

SELECT 1 FROM DUAL ,未找到要求的 FROM 关键字

1. 解决方案 背景描述&#xff1a; 项目需要将mysql数据库换成Oracle数据库&#xff0c;配置好数据源后&#xff0c;启动报错&#xff1a; 解决方案&#xff1a; application.yml 中修改&#xff08;配置了多数据源&#xff09;&#xff1a; spring:datasource:dynamic:dr…

web前端网页制作课作业:使用HTML+CSS技术制作中华传统文化网站【文房四宝】学生网页设计作品 简单静态HTML网页作品

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Linux上:安装、网络配置

文章目录第一章&#xff1a; Linux概述1.1 操作系统1.2 操作系统的发展史1.3 Linux发行版第二章WSL安装linux2.1 WSL简介2.2安装Ubuntu2.3 Ubuntu功能设置2.4 ubantu环境设置第三章&#xff1a; 使用VM安装Linux3.1安装VMware3.2 配置安装系统环境3.3 安装Centos系统3.4 基本配…

C++入门基础05:表达式(表达式基础、算术运算符与赋值运算符、逻辑关系运算符、成员访问运算符与条件运算符、位运算符、移位运算符与类型转换)

C入门基础05&#xff1a;表达式(表达式基础、算术运算符与赋值运算符、逻辑关系运算符、成员访问运算符与条件运算符、位运算符、移位运算符与类型转换) 一、表达式基础 #include <iostream> //系统定义头文件一般是尖括号 #include<fstream> #include<string…

Linux从入门到精通(九)——Linux编程

文章篇幅较长&#xff0c;建议先收藏&#xff0c;防止迷路 文章跳转Linux从入门到精通&#xff08;八&#xff09;——Linux磁盘管理goLinux从入门到精通&#xff08;九&#xff09;——Linux编程goLinux从入门到精通&#xff08;十&#xff09;——进程管理goLinux从入门到精…

教程一 Energy 构建简单的Windows、Linux、MacOSX桌面应用

Golang的Energy使用命令行工具安装开发环境&#xff0c;并运行一个应用。 环境安装 Energy 命令行工具 使用命令行工具自动安装Energy框架的所有依赖(CEF)&#xff0c;支持Window、Linux、MacOSX 安装过程从网络下载CEF和Energy库 获取命令行工具 一、预编译命令行工具 下载地…

银行业国产数据库现状

数据库发展历程 数据库经历了单机数据库、集中式数据库、非关系型数据库、新型数据库四阶段。 单机数据库&#xff1a;单机数据库就是只能运行在单机上&#xff0c;不提供网络功能的数据库。 集中式数据库&#xff1a;数据库是一种经典、传统的数据库结构&#xff0c;多台机…

js内容整理

js内容整理 定时器 JavaScript 提供定时执行代码的功能&#xff0c;叫做定时器&#xff08;timer&#xff09;&#xff0c;主要由setTimeout()和setInterval()这两个函数来完成。 setTimeout() setTimeout函数用来指定某个函数或某段代码&#xff0c;在多少毫秒之后执行。它…

公益是书籍是什么,公益书籍变现模式有哪些

最近&#xff0c;我看到很多人在朋友圈里做公益书籍。 什么是公益书籍&#xff0c;公益书籍又是怎么进行变现的呢&#xff1f; 公益书籍主要是借助公益的逻辑&#xff0c;分发给各种家长。家长每次根据书单给孩子选择相应的书&#xff0c;15元左右就能拿到一套。 公益书籍实…

Linux进程地址空间

哪有明知明天会死今天就会上吊的傻瓜&#xff1f; -要乐观喔 本次博客的分享呢可能比较抽象&#xff0c;博主尽力画图分析&#xff0c;力图给老铁阐明清楚。 目录 ⚽一、进程地址空间区域划分 &#x1f453;Ⅰ区域划分 &#x1f453;Ⅱ虚拟地址和物理地址 ⚽二、页表和映…

科技云报道:发布分布式云战略,中国电子云吹响冲锋号角

科技云报道原创。 过去三年&#xff0c;中国电子云一直牢牢抓住业界的目光&#xff0c;不仅因为“国家队”的身份光环&#xff0c;更因实打实的成绩令人侧目。 据悉&#xff0c;中国电子云核心产品中心云CECSTACK&#xff0c;起步可达3000节点规模&#xff0c;最大可支撑每秒…

一文搞懂堆外内存(模拟内存泄漏)

一、前言 平时编程时&#xff0c;在 Java 中创建对象&#xff0c;实际上是在堆上划分了一块区域&#xff0c;这个区域叫堆内内存。 使用这 -Xms -Xmx 来指定新生代和老年代空间大小的初始值和最大值&#xff0c;这初始值和最大值也被称为 Java 堆的大小&#xff0c;即 堆内内…

2022亚太C题赛题分享

是否全球变暖&#xff1f; 加拿大的49.6C创造了地球北纬50以上地区的气温新纪录&#xff0c;一周内数百人死于高温&#xff1b;美国加利福尼亚州死亡谷是54.4C&#xff0c;这是有史以来地球上记录的最高温度&#xff1b;科威特53.5C&#xff0c;甚至在阳光下超过70多个C&#x…