线性回归实现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 干燥后
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_modelclass 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 == 1assert 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')) - 1xArr = []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, yX, 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_modeldef loadDataSet(fileName):"""数据集每一行为一个样本,其中最后一个值为标签,其余值为属性。根据文件名,依次读取每一行,将属性与标签转化为float类型,存储在列表中,再存入属性集xArr,标签集yArr:param fileName: 数据集文件名fileName:return: 属性集xArr,标签集yArr(转化成numpy的array类型)"""numFeat = len(open(fileName).readline().split('\t')) - 1xArr = []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, yX, 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%,可见手写的线性回归是正确的.

线性回归实战---Abalone鲍鱼年龄预测相关推荐

  1. 预测算法-线性回归(鲍鱼年龄预测)

    预测算法-线性回归 面对可逆矩阵 线性回归(模型,策略,算法) 模型: h(x)=WTx+b h ( x ) = W T x + b h(x) = W^T x + b 损失函数: J(θ)=∑i=1N ...

  2. 岭回归实现鲍鱼年龄预测 MATLAB实现

    最近在研究正则化方法,发现吉洪诺夫正则化就是统计里的岭回归,正好之前上课的时候遇到过鲍鱼年龄预测的问题,那就再跑跑代码吧 鲍鱼的年龄可以通过鲍鱼壳的"环数"来判断,但是获取这个&q ...

  3. 实战三十九:鲍鱼年龄预测热力图相关性分析

    首先是数据: Sex,Length,Diameter,Height,Whole,Shucked,Viscera,Shell,Rings M,0.455,0.365,0.095,0.514,0.2245 ...

  4. 基于PaddlePaddle框架的BP神经网络的鲍鱼年龄的预测

    # 经典的线性回归模型主要用来预测一些存在着线性关系的数据集.回归模型可以理解为:存在一个点集,用一条曲线去拟合它分布的过程.如果拟合曲线是一条直线,则称为线性回归.如果是一条二次曲线,则被称为二次回 ...

  5. 《机器学习实战》8.2 线性回归基础篇之预测鲍鱼年龄

    <机器学习实战>8.2 线性回归基础篇之预测鲍鱼年龄 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多人工智能.机器学习干货 csdn:https://blo ...

  6. 线性回归实例-----预测鲍鱼年龄

    预测鲍鱼年龄 前言   线性回归是监督学习的一个方向,用来预测连续的数值型数据.比如房价预测.销量预测等等. 优点:计算简单,易于理解 缺点:只使用与线性数据,对于非线性数据使用非线性回归模型 使用条 ...

  7. 鲍鱼数据集案例分析-预测鲍鱼年龄(线性回归/梯度下降法实操)

    数据集来源UCI Machine Learning Repository: Abalone Data Set 目录 一.数据集探索性分析 二.鲍鱼数据预处理 1.对sex特征进行OneHot编码,便于 ...

  8. 回归分析及实际案例:预测鲍鱼年龄

    上一篇文章:线性回归(Linear regression)算法 引入: 1.线性回归: 算法的优点: 结果易于理解,计算不复杂 缺点:对非线性数据拟合不好 目标:平方误差和最小  求解(对参数w求导等 ...

  9. 使用线性回归,岭回归,Lasso回归预测鲍鱼年龄

    实验目的 掌握数据预处理方法 掌握线性回归预测基本原理与实现. 实验问题背景 鲍鱼的年龄可以通过鲍鱼壳的"环数"来判断,但是获取这个"环数"是十分耗时的,需要锯 ...

最新文章

  1. device eth0 does not seem to be present, delaying initialization
  2. Node响应中文时解决乱码问题
  3. curl get请求_Linux curl 常用示例你都 Get 了吗?| CSDN 博文精选
  4. html-head-body
  5. c语言程序设计 在线课程设计,c语言程序设计 本科课程设计
  6. P3321-Apple Tree【树状数组】
  7. 基于Linux和MiniGUI的嵌入式系统软件开发指南(六)
  8. 2. PHP 编译安装
  9. 计算机基础与应用演示文稿教案,计算机应用基础教案82修饰演示文稿.pdf
  10. win10系统怎么删除远程桌面连接记录
  11. 标准MIDI文件格式
  12. 咖啡种类、做法和历史来源
  13. 1 12c语言,1.4.1 Oracle数据库12c中PL/SQL的新特性
  14. 分割符(split)
  15. c语言解一元二次方程虚根oj,请问怎么用C语言求一元二次方程的虚根
  16. .NET Core 开源工具 IPTools - 快速查询 IP 地理位置、经纬度信息
  17. Camshift知识点
  18. CTFshow命令执行29-123
  19. 编程就是python吗_编程python是什么
  20. matlab 生成网格,matlab生成网格

热门文章

  1. 【硬核】Spring Cloud Gateway(网关)
  2. 我用什么工具写公众号
  3. 既然彼此不能相濡以沫, 那就相忘于江湖吧.
  4. 如何将多个excel表格合并成一个_相同表头的多个Excel表格合并成一个Excel表的方法...
  5. 长期宅在家的人都有什么比较好的室内锻炼的方法?
  6. 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
的一半零一个。到第10天早上想再吃时,见
  7. Win 10系统自动备份文件
  8. Android连接蓝牙打印机
  9. ios申请企业开发者账号的代理_iOS企业级开发者账号申请
  10. 使用 mongorestore恢复数据以及使用 Studio 3T GUI 管理数据库