【机器学习Python实战】线性回归

🚀个人主页:为梦而生~ 关注我一起学习吧!
💡专栏:机器学习python实战 欢迎订阅!后面的内容会越来越有意思~
内容说明:本专栏主要针对机器学习专栏的基础内容进行python的实现,部分基础知识不再讲解,有需要的可以点击专栏自取~
💡往期推荐(机器学习基础专栏)
【机器学习基础】机器学习入门(1)
【机器学习基础】机器学习入门(2)
【机器学习基础】机器学习的基本术语
【机器学习基础】机器学习的模型评估(评估方法及性能度量原理及主要公式)
【机器学习基础】一元线性回归(适合初学者的保姆级文章)
【机器学习基础】多元线性回归(适合初学者的保姆级文章)
本期内容:针对以上的一元和多元线性回归的梯度下降求解方法,进行代码展示


文章目录

  • 一元线性回归
  • 多元线性回归


一元线性回归

  • 设计思路

首先,class LinearRegression(object):定义一个LinearRegression类,继承自object类。
在这个类中,首先def __init__(self):定义类的构造函数

在构造函数中,初始化线性回归模型的参数self.__Mself.__theta0self.__theta1,以及梯度下降中的步长(学习率)self.__alpha

在这里插入图片描述

线性回归模型是要不断计算输出的,所以定义函数def predict(self, x),用于预测给定输入x对应的输出

同时线性回归的目的是通过迭代,不断的修改参数 θ \theta θ,所以需要定义函数用来做这个工作,它是通过梯度下降的方法来求解的,所以def __cost_theta0(self, X, Y)def __cost_theta1(self, X, Y)这两个方法用于计算代价函数关于参数 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1的偏导数

下面,def train(self, features, target)把上面的每个步骤和到了一起,定义了一个训练方法train,用于通过梯度下降算法找到最优的模型参数 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1,使得代价函数的平方误差最小。在训练过程中,通过迭代更新参数,并输出每次迭代后的参数值

while的每一次迭代中,通过更新参数self.__theta0self.__theta1来逐渐最小化代价函数的平方误差。

if "0:o.5f".format(prevt0) == "0:o.5f".format(self.__theta0) and "0:o.5f".format(prevt1) == "0:o.5f".format(self.__theta1):判断是否达到收敛条件,即两次迭代的参数值没有改变,如果满足条件,则退出循环。

最后,输出最终得到的参数值。

在这里插入图片描述

  • 总体代码实现

定义LinearRegression的class

#!/usr/bin/env python3
# 这是一个Shebang,指定了此脚本要使用的解释器为python3。
import numpyclass LinearRegression(object):# Constructor. Initailize Constants.def __init__(self):super(LinearRegression, self).__init__()self.__M = 0self.__theta0 = 2self.__theta1 = 2# defining Alpha I.E length of steps in gradient descent Or learning Rate.self.__alpha = 0.01def predict(self,x):return (self.__theta0 + x * self.__theta1)# Cost Function fot theta0.def __cost_theta0(self,X,Y):sqrerror = 0.0for i in range(0,X.__len__()):sqrerror += (self.predict(X[i]) - Y[i])return (1/self.__M * sqrerror)# Cost Function fot theta1.def __cost_theta1(self,X,Y):sqrerror = 0.0for i in range(0,X.__len__()):sqrerror += (self.predict(X[i]) - Y[i]) * X[i]return (1/self.__M * sqrerror)# training Data :# Finding Best __theta0 and __theta1 for data such that the Squared  Error is Minimized.def train(self,features,target):# Validate Dataif not features.__len__() == target.__len__():raise Exception("features and target should be of same length")# Initailize M with Size of X and Yself.__M = features.__len__()# gradient descentprevt0, prevt1 = self.__theta0 , self.__theta1while True:tmp0 = self.__theta0 - self.__alpha * (self.__cost_theta0(features,target))tmp1 = self.__theta1 - self.__alpha * (self.__cost_theta1(features,target))self.__theta0, self.__theta1 = tmp0, tmp1print("theta0(b) :", self.__theta0)print("theta1(m) :", self.__theta1)if "0:o.5f".format(prevt0) == "0:o.5f".format(self.__theta0) and "0:o.5f".format(prevt1) == "0:o.5f".format(self.__theta1):breakprevt0, prevt1 = self.__theta0 , self.__theta1# Training Completed.# log __theta0 __theta1print("theta0(b) :", self.__theta0)print("theta1(m) :", self.__theta1)

样例测试

from LinearRegression_OneVariables import LinearRegression
import numpy as npX = np.array([1,2,3,4,5,6,7,8,9,10])# Y = 0 + 1X
Y = np.array([1,2,3,4,5,6,7,8,9,10])modal = LinearRegression.LinearRegression()modal.train(X,Y)print(modal.predict(14))

多元线性回归

  • 设计思路

首先,将文件导入,打乱顺序并选择训练集。

data=pd.read_csv("c:\\windquality.csv")data_array=data.values#shuffling for train test spplit
np.random.shuffle(data_array)train,test=data_array[:1200,:],data_array[1200:,:]
x_train=train[:,:-1]
x_test=test[:,:-1]
y_train=train[:,-1]
y_test=test[:,-1]

在这里插入图片描述

然后初始化参数,注意这里是多元的,所以有多个参数需要初始化。包括迭代次数和学习率

coef1=0
coef2=0
coef3=0
coef4=0
coef5=0
coef6=0
coef7=0
coef8=0
coef9=0
coef10=0
coef11=0
epoch=1000
alpha=.0001

在这里插入图片描述

然后使用梯度下降算法进行计算

总体代码实现

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdata=pd.read_csv("c:\\windquality.csv")data_array=data.values#shuffling for train test spplit
np.random.shuffle(data_array)train,test=data_array[:1200,:],data_array[1200:,:]
x_train=train[:,:-1]
x_test=test[:,:-1]
y_train=train[:,-1]
y_test=test[:,-1]coef1=0
coef2=0
coef3=0
coef4=0
coef5=0
coef6=0
coef7=0
coef8=0
coef9=0
coef10=0
coef11=0
epoch=1000
alpha=.0001
c=0
n=len(y_train)
for i in range(epoch):y_pred=((coef1*x_train[:,0])+(coef2*x_train[:,1])+(coef3*x_train[:,2])+(coef4*x_train[:,3])+(coef5*x_train[:,4])+(coef6*x_train[:,5])+(coef7*x_train[:,6])+(coef8*x_train[:,7])+(coef9*x_train[:,8])+(coef10*x_train[:,9])+(coef11*x_train[:,10])+c)#to predict drivativeintercept=(-1/n)*sum(y_train-y_pred)dev1=(-1/n)*sum(x_train[:,0]*(y_train-y_pred))dev2=(-1/n)*sum(x_train[:,1]*(y_train-y_pred))dev3=(-1/n)*sum(x_train[:,2]*(y_train-y_pred))dev4=(-1/n)*sum(x_train[:,3]*(y_train-y_pred))dev5=(-1/n)*sum(x_train[:,4]*(y_train-y_pred))dev6=(-1/n)*sum(x_train[:,5]*(y_train-y_pred))dev7=(-1/n)*sum(x_train[:,6]*(y_train-y_pred))dev8=(-1/n)*sum(x_train[:,7]*(y_train-y_pred))dev9=(-1/n)*sum(x_train[:,8]*(y_train-y_pred))dev10=-1/n*sum(x_train[:,9]*(y_train-y_pred))dev11=-1/n*sum(x_train[:,10]*(y_train-y_pred))#linec=c-alpha*interceptcoef1=coef1-alpha*dev1coef2=coef2-alpha*dev2coef3=coef3-alpha*dev3coef4=coef4-alpha*dev4coef5=coef5-alpha*dev5coef6=coef6-alpha*dev6coef7=coef7-alpha*dev7coef8=coef8-alpha*dev8coef9=coef9-alpha*dev9coef10=coef10-alpha*dev10coef11=coef11-alpha*dev11print("\nintercept:",c,"\ncoefficient1:",coef1,"\ncoefficient2:",coef2,"\ncoefficient3:",coef3,"\ncoefficient4:",coef4,"\ncoefficient5:",coef5,"\ncoefficient6:",coef6,"\ncoefficient7:",coef7,"\ncoefficient8:",coef8,"\ncoefficient9:",coef9,"\ncoefficient10",coef10,   "\ncoefficient11",coef11)#Calculating the predicted values
predicted_values = []
for i in range(0,399):y_pred = ((coef1 * x_test[i,0]) + (coef2 * x_test[i,1]) + (coef3 * x_test[i,2]) + (coef4 * x_test[i,3]) + (coef5 * x_test[i,4]) + (coef6 * x_test[i,5]) + (coef7 * x_test[i,6]) + (coef8 * x_test[i,7]) + (coef9 * x_test[i,8]) + (coef10 * x_test[i,9]) + (coef11 * x_test[i,10]) + intercept)predicted_values.append(y_pred)for i in range(len(predicted_values)):print(predicted_values[i])

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

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

相关文章

C++ Qt 学习(十):Qt 其他技巧

1. 带参数启动外部进程 QProcess 用于启动外部进程int QProcess::execute(const QString &program, const QStringList &arguments);QObject *parent; ... QString program "./path/to/Qt/examples/widgets/analogclock"; QStringList arguments; argument…

当前系统并无桌面环境,或无显示器,无法显示远程桌面,您需要自行安装X11桌面环境,或者使用终端文件功能

ToDesk远程遇到的问题如上图,换向日葵直接黑屏; 问题原因 截止发文时间,Todesk只支持X11协议,没有适配最新的Wayland协议,所以我们需要把窗口系统调整为X11才可以。 解决方法 修改配置文件,关闭wayland su…

Vellum|SOP —— Vellum Constraints

目录 约束类型 Distance Along Edges(distance) Bend Across Triangles(bend) Cloth(distance、bend) Hair(stretchshear、bendtwist) String(distance、angle&…

生成指定位数强Lucas校验伪素数-Arnault1995构造法

Arnault在1995年的论文《Constructing Carmichael Numbers which are Strong Pseudoprimes to Several Bases》提出了一种用于构造强Lucas校验伪素数的方法,本文将对其方法做具体的实现分析。 文章目录 1.Lucas素数测试1.1 Lucas序列1.2 Lucas定理1.3 Lucas素数测试…

Spring Cloud Netflix微服务组件-Hystrix

目录 Hystrix的主要功能 传统容错手段 超时机制 应用容错三板斧 超时机制 舱壁隔离 熔断降级 侵入式Command用法 改进版一:ribbon与hystrix组合 改进版二:feign与hystrix组合 Hystrix三态转换图 源码分析 流程图 原理流程图 核心实现流程…

MySQL 的执行原理(一)

5.1 单表访问之索引合并 我们前边说过 MySQL 在一般情况下执行一个查询时最多只会用到单个二级 索引,但存在有特殊情况,在这些特殊情况下也可能在一个查询中使用到多个二 级索引,MySQL 中这种使用到多个索引来完成一次查询的执行方法称之为&…

基于Android个人理财家庭收支系统uniAPP+vue -hbuiderx-微信小程序vj9n8

摘 要 个人理财APP设计的目的是为用户提供对活动信息和提醒信息管理等方面的平台。 与PC端应用程序相比,个人理财的设计旨在为用户提供一个个人理财信息的管理。用户可以通过APP及时收入信息和支出信息,并对提醒消息进行查看等。 个人理财APP是在Androi…

代码随想录算法训练营第23期day53|1143.最长公共子序列、1035.不相交的线、53. 最大子序和

目录 一、1143.最长公共子序列 二、1035.不相交的线 三、53. 最大子序和 一、1143.最长公共子序列 力扣题目链接 class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size() 1, vector<int…

Vue 优雅的减少请求次数

文章目录 前言Java代码Vue代码改造前改造后前言 当开发一个应用程序或者网站时,我们经常需要从后端获取一些数据来展示给用户。在某些情况下,我们可能需要获取多个属性的值,而不是单独获取每个属性的值。这时,我们可以使用一次请求获取多个属性的值,以减少网络请求的次数…

吴恩达《机器学习》9-4-9-6:实现注意:展开参数、梯度检验、随机初始化

一、实现注意:展开参数 在上一个视频中&#xff0c;讨论了使用反向传播算法计算代价函数的导数。在本视频中&#xff0c;将简要介绍一个实现细节&#xff0c;即如何将参数从矩阵展开为向量。这样做是为了在高级最优化步骤中更方便地使用这些参数。 二、梯度检验 在神经网络中…

Java vo dto 使用场景

在Java中&#xff0c;VO&#xff08;Value Object&#xff09;和DTO&#xff08;Data Transfer Object&#xff09;是常用的设计模式&#xff0c;用于数据传递和封装。它们分别适用于不同的场景&#xff1a; VO&#xff08;Value Object&#xff09;&#xff1a;用于表示具有一…

【2021集创赛】IEEE杯一等奖:一种28GHz高能效Outphasing PA设计

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位&#xff1a;电子科技大学 队伍名称&#xff1a;PA调得队 指导老师&#xff1a;王政 参赛队员&#xff1a;倪梦虎、杨茂旋、张振翼 总决赛奖项&#xff1a;一等奖 1.项…

Git仓库如何重置成新仓库或者仅留最终版本

Git仓库如何重置成新仓库或者仅留最终版本 1. 重置成新仓库1.1 使用orphan参数checkout全新分支1.2 重命名latest_branch为master分支 2.仅保留最终版本2.1 使用orphan参数checkout全新分支2.2 重命名latest_branch为master分支 1. 重置成新仓库 1.1 使用orphan参数checkout全…

Golang基础-面向对象篇

文章目录 struct结构体类的表示与封装类的继承多态的基本要素与实现interface空接口反射变量的内置pairreflect包解析Struct TagStruct Tag在json中的应用 struct结构体 在Go语言中&#xff0c;可以使用type 关键字来创建自定义类型&#xff0c;这对于提高代码的可读性和可维护…

掌握这个技巧,你也能成为酒店管理高手!

随着科技的迅猛发展&#xff0c;监控技术在各个领域得到了广泛应用。然而&#xff0c;传统的监控系统在面对水浸等突发事件时&#xff0c;往往无法提供有效的预警和保护。 水浸监控系统通过实时监测水位变化&#xff0c;及时发出警报&#xff0c;以帮助用户采取紧急措施&#x…

EANet:用于医学图像分割的迭代边缘注意力网络

EANet: Iterative edge attention network for medical image segmentation EANet&#xff1a;用于医学图像分割的迭代边缘注意力网络背景贡献实验方法Dynamic scale-aware context module&#xff08;动态规模感知上下文模块&#xff09;Edge attention preservation module&a…

3D格式转换工具

这里记录下自己之前做3D模型格式转换&#xff0c;包括做CAD模型格式转换辅助的一些开源仓库和工具 &#xff08;一&#xff09;转换成gltf工具 gltf作为3D界的jpg标准&#xff0c;如今已经有很多引擎对其进行了支持&#xff0c;这里单独把它列出来 1. obj转glft工具 git仓库…

深入解析Windows操作系统——概念和工具

文章目录 Windows操作系统的版本Windows NT和Windows 95基础概念和术语内核调试用户模式调试 Windows操作系统的版本 Windows NT和Windows 95 Windows NT和Windows 95之间的一些结构性差异&#xff0c;以及Windows NT优于Windows 95及其后续版本的一些方面&#xff1a; Wind…

慧择解构年轻高客市场长期价值 花旗重申“买入”评级

风险转移、资金配置、社会保障、风险管理&#xff0c;当这四大保险行业基本职能呈现在眼前&#xff0c;人们曾经的第一反应可能是&#xff0c;只有达到一定年龄和社会地位、具备一定经济实力的人群&#xff0c;才会真正严肃对待这些概念。 但是&#xff0c;无论是人均收入水平…

前端环境变量释义import.meta.env.xxx

视频教程 彻底搞懂前端环境变量使用和原理&#xff0c;超清楚_哔哩哔哩_bilibili 添加命令行参数 --modexxxxx 新建.env.xxxx文件,其中.env文件会在所有环境下生效 以VITE_开头&#xff0c;字符串无需加双引号 使用import.meta.env.VITE_xxxxx进行调用