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

2023-10-29

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


前面我们使用手动编写,后面通过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 干燥后
Rings integer +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%,可见手写的线性回归是正确的.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线性回归实战---Abalone鲍鱼年龄预测 的相关文章

随机推荐

  • 买服务器做网站 镜像选什么,云服务器做网站镜像类型选啥

    云服务器做网站镜像类型选啥 内容精选 换一换 创建一台或多台云服务器 V1 1版本创建云服务器的接口兼容了V1版本创建云服务器 按需 的功能 同时合入新功能 支持创建包年 包月的弹性云服务器 本接口为异步接口 当前创建云服务器请求下发成功后
  • 【Golang

    环境准备 GoLang go1 15 7 windows amd64 Docker 1 13 1 MySQL 8 0 28 一 利用容器部署mysql 1 首先通过docker pull mysql拉取mysql镜像 root k8s ma
  • Jetty篇一之初识Jetty

    前言 最近公司项目中用到了Jetty来作为项目的web容器 借此机会来分享一下我的学习心得 在学习Jetty之前 一定要了解一些Jetty的基本概念以及优缺点 这样才方便做更深入的学习 现在让我来慢慢揭开它的神秘面纱吧 基础 什么是Jett
  • 大数据模型案例库-涵盖多行业,超百个实战项目案例

    平台目前积累了大量的人工智能应用模型 不仅包括多年来人工智能企业服务方面的沉淀 还包括大量其他企业的真实项目应用模型 以及高校智能工作室成果模型 覆盖教育 医疗 交通 金融 科技 农业等18个行业 平台面向高校 企业 个人等广大用户群体 所
  • Candence原理图误删图页并保存退出后的恢复方法

    一早打开Candence准备工作 发现原理图少了几页 心里很慌 昨晚在画PCB的时候设置按了几次Delete键 没有反应 可能删了原理图 关闭的时候也没有看 直接保存退出了 看了之前拷贝备份的文件 时间有点久 那只能靠软件的自动备份功能了
  • C语言进阶(九)—— 函数指针和回调函数、预处理、动态库和静态库的使用、递归函数

    1 函数指针 1 1 函数类型 通过什么来区分两个不同的函数 一个函数在编译时被分配一个入口地址 这个地址就称为函数的指针 函数名代表函数的入口地址 函数三要素 名称 参数 返回值 C语言中的函数有自己特定的类型 c语言中通过typedef
  • 学习笔记-选择排序

    选择排序 将一个一维数组从小到大排序 思路 选择排序的思路是 首先认为数组的第一个数是最小的 保留它然后遍历它后面的数 跟它作比较 选择出最小的数和位置 遍历结束后 让这个最小的数和数组的第一位数交换 这样确定了第一个最小的数 之后重复这个
  • Unity AR阴影投射透明地面 仅渲染模型实时阴影 Shader实现

    亲测可用 上面就是实现的效果 仅仅渲染阴影 地面透明 也可以换成AR中的虚拟物体 AR中为的虚拟物体添加阴影 只用unity的光照投影是没办法实现的 或者需求是 角色需要投射阴影在墙上 但是墙不能显示 只渲染出阴影 相当于接受阴影的地面墙体
  • 吊打 CLIP 平均10个点,Meta 多模态通用模型 FLAVA真香啊

    厉害了 作者将单一模型运用于三个不同领域的不同任务 结构简单且训练直观 还能有着出色的表现 自Transformer横空出世 从NLP到CV 再到今天的多模态 无数基于Transformer的模型被应用于各类任务 似乎真的印证了当年文章的标
  • ldd not a dynamic executable

    在开发环境编译运行很ok的程序 到了客户的生产环境一直有问题 编译找不到库 类似这个样子 usr bin ld skipping incompatible lib libasound so when searching for lasoun
  • EXCEL-VBA:Workbooks.Open 参数 (打开文件)

    打开一个工作簿 语法 表达式 Open FileName UpdateLinks ReadOnly Format Password WriteResPassword IgnoreReadOnlyRecommended Origin Deli
  • UE5导入倾斜摄影

    前言 虚幻引擎是全球最先进的实时3D创作工具 可制作照片级逼真的视觉效果和沉浸式体验 2022年4月5号虚幻引擎发布了颠覆性的UE5 倾斜摄影是城市实景的基础 通过无人机采集实际照片再进行三维重建 常见的数据格式为osgb 本文主要介绍UE
  • JSP自定义标签的(生命周期与开发if,foreach,out)

    自定义标签定义 是用户定义的JSP语言元素 扩展名为tld的文件 tag标签的配置文件 通常放在WEB INF下面 自定义标签的开发及使用步骤 思路 1 1 创建一个标签助手类 继承BodyTagSupport 标签属性必须助手类的属性对应
  • 测试自动化平台

    https mp weixin qq com s WU5h8FW6BT5YZtlsSuCIcw 摘要 随着近几年国内IT行业高速发展 对测试工程师的要求也越来越高 其作用也越来越重要 但很多测试工程师也迎来了个人发展的瓶颈 下一步该向哪个方
  • clock的accuracy(tolerance)和jitter

    对于clock来说 有两个参数来衡量质量 分别是jitter和accuracy tolerance Jitter的单位是ps Tolerance的单位是ppm 百万分之 在晶振 RTC和Oscillator中也会找到类似参数 SOC和MCU
  • Hexo标签插件的使用

    tag 插件 Tag Plugin 是 Hexo 提供的一种快速生成特定内容的方式 例如 在标准 Markdown 语法中 我们无法指定图片的大小 这种情景 我们即可使用标签来解决 Hexo 内置来许多标签来帮助写作者可以更快的书写 完整的
  • docker运行nginx为什么要使用 nginx -g 'daemon off;'

    1 docker容器跑着为啥会挂掉 docker 容器默认会把容器内部第一个进程 也就是pid 1的程序作为docker容器是否正在运行的依据 如果docker 容器pid挂了 那么docker容器便会直接退出 2 docker run的时
  • 用Pandas做数据清洗的常用操作!

    大家好 我是小z 今天给大家分享一篇pandas数据清洗的干货 作为一名数据分析师 每天都在完成各种数据分析需求 其中数据清洗是必不可少的一个步骤 一般而言 当提及数据清洗时 其实是主要包括了缺失值处理 重复值处理和异常值处理三类操作 本文
  • DML语法整理笔记

    目录 1 什么是DML 2 两种INSERT方式 2 1 方式一 2 2 方式二 2 3 INSERT特点 2 4 两种方式对比 3 UPDATE 3 1 修改单标记录 3 2 修改多表记录 4 DELETE 4 1 方式一 可以删全表也可
  • 线性回归实战---Abalone鲍鱼年龄预测

    线性回归实现Abalone鲍鱼年龄预测 文章目录 线性回归实现Abalone鲍鱼年龄预测 一 环境准备 数据集简介 二 线性回归基础知识 什么是线性回归 最小二乘法 求解线性回归问题 三 Python代码 四 结果分析 前面我们使用手动编写