数据分析(三)线性回归模型实现

1. 惩罚线性回归模型概述

线性回归在实际应用时需要对普通最小二乘法进行一些修改。普通最小二乘法只在训练数据上最小化错误,难以顾及所有数据。

惩罚线性回归方法是一族用于克服最小二乘法( OLS)过拟合问题的方法。岭回归是惩罚线性回归的一个特例。岭回归通过对回归系数的平方和进行惩罚来避免过拟合。其他惩罚回归算法使用不同形式的惩罚项。

下面几个特点使得惩罚线性回归方法非常有效:

--模型训练足够快速。

--变量的重要性信息。

--部署时的预测足够快速。

--在各种问题上性能可靠,尤其对样本并不明显多于属性的属性矩阵,或者非常稀疏的矩阵。希望模型为稀疏解(即只使用部分属性进行预测的吝啬模型)。

--问题可能适合使用线性模型来解决。

公式 4-6 可以用如下语言描述:向量 beta 是以及常量 beta 零星是使期望预测的均方

错误最小的值,期望预测的均方错误是指在所有数据行(i=1,...,n)上计算 yi 与预测生成

yi 之间的错误平方的平均。

岭惩罚项对于惩罚回归来说并不是唯一有用的惩罚项。任何关于向量长度的指标都可以。使用不同的长度指标可以改变解的重要性。岭回归应用欧式几何的指标(即 β 的平方和)。另外一个有用的算法称作套索(Lasso)回归,该回归源于出租车的几何路径被称作曼哈顿距离或者 L1 正则化(即 β 的绝对值的和)。ElasticNet 惩罚项包含套索惩罚项以及岭惩罚项。

2. 求解惩罚线性回归问题

有大量通用的数值优化算法可以求解公式 4-6、公式 4-8 以及公式 4-11 对应的优化问题,但是惩罚线性回归问题的重要性促使研究人员开发专用算法,从而能够非常快地生成解。本文将对这些算法进行介绍并且运行相关代码,重点介绍2种算法:最小角度回归 LARS 以及 Glmnet。

LARS 算法可以理解为一种改进的前向逐步回归算法。

之所以介绍 LARS 算法是因为该算法非常接近于套索以及前向逐步回归, LARS 算法很容易理解并且实现起来相对紧凑。通过研究 LARS 的代码,你会理解针对更一般的 ElasticNet 回归求解的具体过程,并且会了解惩罚回归求解的细节。

3. 完整代码(code)

from math import sqrt
import pandas as pd
import matplotlib.pyplot as plt
from tqdm import tqdmdef x_normalized(xList, xMeans, xSD):nrows = len(xList)ncols = len(xList[0])xNormalized = []for i in range(nrows):rowNormalized = [(xList[i][j] - xMeans[j]) / xSD[j] for j in range(ncols)]xNormalized.append(rowNormalized)def data_normalized(wine):nrows, ncols = wine.shapewineNormalized = winefor i in range(ncols):mean = summary.iloc[1, i]sd = summary.iloc[2, i]wineNormalized.iloc[:, i:(i + 1)] = (wineNormalized.iloc[:, i:(i + 1)] - mean) / sdreturn wineNormalizeddef calculate_betaMat(nSteps, stepSize, wineNormalized):nrows, ncols = wineNormalized.shape# initialize a vector of coefficients beta(系数初始化)beta = [0.0] * (ncols - 1)# initialize matrix of betas at each step(系数矩阵初始化)betaMat = []betaMat.append(list(beta))# initialize residuals list(误差初始化)residuals = [0.0] * nrowsfor i in tqdm(range(nSteps)):# calculate residuals(计算误差)for j in range(nrows):residuals[j] = wineNormalized.iloc[j, (ncols - 1)]for k in range(ncols - 1):residuals[j] += - wineNormalized.iloc[j, k] * beta[k]# calculate correlation between attribute columns from normalized wine and residual(变量与误差相关系数)corr = [0.0] * (ncols - 1)for j in range(ncols - 1):for k in range(nrows):corr[j] += wineNormalized.iloc[k, j] * residuals[k] / nrowsiStar = 0corrStar = corr[0]for j in range(1, (ncols - 1)):if abs(corrStar) < abs(corr[j]):  # 相关性大的放前面iStar = jcorrStar = corr[j]beta[iStar] += stepSize * corrStar / abs(corrStar)  # 系数betaMat.append(list(beta))return betaMatdef plot_betaMat1(betaMat):ncols = len(betaMat[0])for i in range(ncols):# plot range of beta values for each attributecoefCurve = betaMat[0:nSteps][i]plt.plot(coefCurve)plt.xlabel("Attribute Index")plt.ylabel(("Attribute Values"))plt.show()def plot_betaMat2(nSteps, betaMat):ncols = len(betaMat[0])for i in range(ncols):# plot range of beta values for each attributecoefCurve = [betaMat[k][i] for k in range(nSteps)]xaxis = range(nSteps)plt.plot(xaxis, coefCurve)plt.xlabel("Steps Taken")plt.ylabel(("Coefficient Values"))plt.show()def S(z, gamma):if gamma >= abs(z):return 0.0return (z / abs(z)) * (abs(z) - gamma)if __name__ == '__main__':target_url = "http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"wine = pd.read_csv(target_url, header=0, sep=";")# normalize the wine datasummary = wine.describe()print(summary)# 数据标准化wineNormalized = data_normalized(wine)# number of steps to take(训练步数)nSteps = 100stepSize = 0.1betaMat = calculate_betaMat(nSteps, stepSize, wineNormalized)plot_betaMat1(betaMat)
# ----------------------------larsWine---------------------------------------------------# read data into iterablenames = wine.columnsxList = []labels = []firstLine = Truefor i in range(len(wine)):row = wine.iloc[i]# put labels in separate arraylabels.append(float(row[-1]))# convert row to floatsfloatRow = row[:-1]xList.append(floatRow)# Normalize columns in x and labelsnrows = len(xList)ncols = len(xList[0])# calculate means and variances(计算均值和方差)xMeans = []xSD = []for i in range(ncols):col = [xList[j][i] for j in range(nrows)]mean = sum(col) / nrowsxMeans.append(mean)colDiff = [(xList[j][i] - mean) for j in range(nrows)]sumSq = sum([colDiff[i] * colDiff[i] for i in range(nrows)])stdDev = sqrt(sumSq / nrows)xSD.append(stdDev)# use calculate mean and standard deviation to normalize xList(X标准化)xNormalized = x_normalized(xList, xMeans, xSD)# Normalize labels: 将属性及标签进行归一化meanLabel = sum(labels) / nrowssdLabel = sqrt(sum([(labels[i] - meanLabel) * (labels[i] - meanLabel) for i in range(nrows)]) / nrows)labelNormalized = [(labels[i] - meanLabel) / sdLabel for i in range(nrows)]# initialize a vector of coefficients betabeta = [0.0] * ncols# initialize matrix of betas at each stepbetaMat = []betaMat.append(list(beta))# number of steps to takenSteps = 350stepSize = 0.004nzList = []for i in range(nSteps):# calculate residualsresiduals = [0.0] * nrowsfor j in range(nrows):labelsHat = sum([xNormalized[j][k] * beta[k] for k in range(ncols)]) residuals[j] = labelNormalized[j] - labelsHat  # 计算残差# calculate correlation between attribute columns from normalized wine and residualcorr = [0.0] * ncolsfor j in range(ncols):corr[j] = sum([xNormalized[k][j] * residuals[k] for k in range(nrows)]) / nrows  # 每个属性和残差的关联iStar = 0corrStar = corr[0]for j in range(1, (ncols)):  # 逐个判断哪个属性对降低残差贡献最大if abs(corrStar) < abs(corr[j]):  # 好的(最大关联)特征会排到列表前面,应该保留,不太好的特征会排到最后iStar = jcorrStar = corr[j]beta[iStar] += stepSize * corrStar / abs(corrStar)  # 固定增加beta变量值,关联为正增量为正;关联为负,增量为负betaMat.append(list(beta))  # 求解得到参数结果nzBeta = [index for index in range(ncols) if beta[index] != 0.0]for q in nzBeta:if q not in nzList:  # 对于每一迭代步,记录非零系数对应索引nzList.append(q)nameList = [names[nzList[i]] for i in range(len(nzList))]print(nameList)plot_betaMat2(nSteps, betaMat)  # 绘制系数曲线# -------------------------------larsWine 10折交叉------------------------------------------------# Build cross-validation loop to determine best coefficient values.# number of cross validation foldsnxval = 10# number of steps and step sizenSteps = 350stepSize = 0.004# initialize list for storing errors.errors = []  # 记录每一步迭代的错误for i in range(nSteps):b = []errors.append(b)for ixval in range(nxval):  # 10折交叉验证# Define test and training index setsidxTrain = [a for a in range(nrows) if a % nxval != ixval * nxval]idxTest = [a for a in range(nrows) if a % nxval == ixval * nxval]# Define test and training attribute and label setsxTrain = [xNormalized[r] for r in idxTrain]  # 训练集labelTrain = [labelNormalized[r] for r in idxTrain]xTest = [xNormalized[r] for r in idxTest]  # 测试集labelTest = [labelNormalized[r] for r in idxTest]# Train LARS regression on Training DatanrowsTrain = len(idxTrain)nrowsTest = len(idxTest)# initialize a vector of coefficients betabeta = [0.0] * ncols# initialize matrix of betas at each stepbetaMat = []betaMat.append(list(beta))for iStep in range(nSteps):# calculate residualsresiduals = [0.0] * nrowsfor j in range(nrowsTrain):labelsHat = sum([xTrain[j][k] * beta[k] for k in range(ncols)])residuals[j] = labelTrain[j] - labelsHat# calculate correlation between attribute columns from normalized wine and residualcorr = [0.0] * ncolsfor j in range(ncols):corr[j] = sum([xTrain[k][j] * residuals[k] for k in range(nrowsTrain)]) / nrowsTrainiStar = 0corrStar = corr[0]for j in range(1, (ncols)):if abs(corrStar) < abs(corr[j]):iStar = jcorrStar = corr[j]beta[iStar] += stepSize * corrStar / abs(corrStar)betaMat.append(list(beta))# Use beta just calculated to predict and accumulate out of sample error - not being used in the calc of betafor j in range(nrowsTest):labelsHat = sum([xTest[j][k] * beta[k] for k in range(ncols)])err = labelTest[j] - labelsHaterrors[iStep].append(err)cvCurve = []for errVect in errors:mse = sum([x * x for x in errVect]) / len(errVect)cvCurve.append(mse)minMse = min(cvCurve)minPt = [i for i in range(len(cvCurve)) if cvCurve[i] == minMse][0]print("Minimum Mean Square Error", minMse)print("Index of Minimum Mean Square Error", minPt)xaxis = range(len(cvCurve))plt.plot(xaxis, cvCurve)plt.xlabel("Steps Taken")plt.ylabel(("Mean Square Error"))plt.show()# -------------------------------glmnet larsWine2------------------------------------------------# select value for alpha parameteralpha = 1.0# make a pass through the data to determine value of lambda that# just suppresses all coefficients.# start with betas all equal to zero.xy = [0.0] * ncolsfor i in range(nrows):for j in range(ncols):xy[j] += xNormalized[i][j] * labelNormalized[i]maxXY = 0.0for i in range(ncols):val = abs(xy[i]) / nrowsif val > maxXY:maxXY = val# calculate starting value for lambdalam = maxXY / alpha# this value of lambda corresponds to beta = list of 0's# initialize a vector of coefficients betabeta = [0.0] * ncols# initialize matrix of betas at each stepbetaMat = []betaMat.append(list(beta))# begin iterationnSteps = 100lamMult = 0.93  # 100 steps gives reduction by factor of 1000 in# lambda (recommended by authors)nzList = []for iStep in range(nSteps):# make lambda smaller so that some coefficient becomes non-zerolam = lam * lamMultdeltaBeta = 100.0eps = 0.01iterStep = 0betaInner = list(beta)while deltaBeta > eps:iterStep += 1if iterStep > 100:break# cycle through attributes and update one-at-a-time# record starting value for comparisonbetaStart = list(betaInner)for iCol in range(ncols):xyj = 0.0for i in range(nrows):# calculate residual with current value of betalabelHat = sum([xNormalized[i][k] * betaInner[k] for k in range(ncols)])residual = labelNormalized[i] - labelHatxyj += xNormalized[i][iCol] * residualuncBeta = xyj / nrows + betaInner[iCol]betaInner[iCol] = S(uncBeta, lam * alpha) / (1 + lam * (1 - alpha))sumDiff = sum([abs(betaInner[n] - betaStart[n]) for n in range(ncols)])sumBeta = sum([abs(betaInner[n]) for n in range(ncols)])deltaBeta = sumDiff / sumBetaprint(iStep, iterStep)beta = betaInner# add newly determined beta to listbetaMat.append(beta)# keep track of the order in which the betas become non-zeronzBeta = [index for index in range(ncols) if beta[index] != 0.0]for q in nzBeta:if q not in nzList:nzList.append(q)# print out the ordered list of betasnameList = [names[nzList[i]] for i in range(len(nzList))]print(nameList)nPts = len(betaMat)plot_betaMat2(nPts, betaMat)  # 绘制系数曲线

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

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

相关文章

PS从入门到精通视频各类教程整理全集,包含素材、作业等(8)

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 B站-PS异闻录&#xff1a;萌新系统入门课课程视频 …

大意了MySQL关键字EXPLAIN

一、问题 然后explain带了单引号、以区别其关键字 二、报错如下 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near explain, us.nickname AS user_send_nickname, ua.nickname…

学习鸿蒙基础(12)

目录 一、网络json-server配置 &#xff08;1&#xff09;然后输入&#xff1a; &#xff08;2&#xff09;显示下载成功。但是输入json-server -v的时候。报错。 &#xff08;3&#xff09;此时卸载默认的json-server &#xff08;4&#xff09;安装和nodejs匹配版本的js…

页面刚加载的时候显示自己定义的{{***}}然后一闪而过

这时候别用插值表达式语法了&#xff0c;直接用v-text或者v-html就能解决这个问题 但是有个问题&#xff0c;如下图所示&#xff1a; 具体bind使用方式&#xff0c;如下图所示&#xff1a; 但是v-bind也可以进行简写&#xff0c;就是去掉v-bind&#xff0c;直接写&#xff1a…

golang 归并回源策略

前言 下面是我根据业务需求画了一个架构图&#xff0c;没有特别之处&#xff0c;很普通&#xff0c;都是我们常见的中间件&#xff0c;都是一些幂等性GET 请求。有一个地方很有意思&#xff0c;从service 分别有10000 qps 请求到Redis&#xff0c;并且它们的key 是一样的。这样…

『python爬虫』巨量http代理使用 每天白嫖1000ip(保姆级图文)

目录 注册 实名得到API链接和账密 Python3requests调用Scpay总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 注册 实名 注册巨量http 用户概览中领取1000ip,在动态代理中使用.用来测试一下还是不错的 得到AP…

Ribbon有哪些负载均衡策略

负载均衡类都实现了IRule接口。 RandomRule&#xff1a;随机的选用一个实例 RoundRobinRule&#xff1a;轮询的使用实例 RetryRule&#xff1a;在轮询的基础上加了一个错误重试机制&#xff0c;在deadline时间内会不断的重试 WeightResponeTimeRule&#xff1a;根据权重去做…

55555555555555

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

《QT实用小工具·十二》邮件批量发送工具

1、概述 源码放在文章末尾 该项目实现了邮件的批量发送&#xff0c;如下图所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef SMTPCLIENT_H #define SMTPCLIENT_H#include <QtGui> #include <QtNetwork> #if (QT_VERSION > QT_VERSION_CHECK(5,0,…

初识CSS

目录 前言&#xff1a; CSS的介绍&#xff1a; CSS的发展&#xff1a; 1&#xff09;CSS1.0&#xff1a; 2)CSS2.0: 3)CSS2.1: 4&#xff09;CSS3&#xff1a; CSS特点&#xff1a; 1&#xff09;丰富的样式定义&#xff1a; 2&#xff09;易于设置和修改&#xff1a; 3&…

彩虹聚合DNS管理系统,附带系统搭建教程

聚合DNS管理系统&#xff0c;可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。 本系统支持多用户&#xff0c;每个用户可分配不同的域名解析权限&#xff1b;支持API接口&#xff0…

卷积神经网络-池化层

卷积神经网络-池化层 池化层&#xff08;Pooling Layer&#xff09;是深度学习神经网络中的一个重要组成部分&#xff0c;通常用于减少特征图的空间尺寸&#xff0c;从而降低模型复杂度和计算量&#xff0c;同时还能增强模型的不变性和鲁棒性。 池化操作通常在卷积神经网络&am…

动态规划:线性dp

1.最长公共子序列(LCS) dp[i][j]含义&#xff1a;序列Ai(a1-ai)和Bj(b1-bj)的最长公共子序列长度 分析两种情况&#xff1a; &#xff08;1&#xff09;当ai bj时&#xff0c;已经求得Ai-1和Bj-1的最长公共子序列 dp[i][j] dp[i-1][j-1] 1 &#xff08;2&#xff09;当…

2024 年最新使用 Wechaty 开源框架搭建部署微信机器人(微信群智能客服案例)

读取联系人信息 获取当前机器人账号全部联系人信息 bot.on(ready, async () > {console.log("机器人准备完毕&#xff01;&#xff01;&#xff01;")let contactList await bot.Contact.findAll()for (let index 0; index < contactList.length; index) {…

第三方短信-短信合作-106短信

第三方短信-短信合作-106短信 1、你是否也有需要发送短信的业务、但是自己没有短信服务的情况 2、是否需要大量发送短信、但是又不想通过自己的真实手机号发 3、您是否是开发者、但是没有自己的短信服务&#xff0c;需要发送短信可以使用/借用我的短信服务进行发送&#xff0c…

电梯轿厢内电动车数据集,VOC标签格式已标注(数据集+训练好的权重)

本数据集用于电梯禁入电动车项目的目标检测算法模型训练任务。 共有4000张左右图片&#xff0c;全部为电梯监控真实照片&#xff0c;没有网络爬虫滥竽充数的图片&#xff0c;并已经分好数据集和验证集&#xff0c;可直接用来训练。以上图片均一一手工标注&#xff0c;标签格式为…

YoloV8改进策略:BackBone改进|ELA

文章目录 摘要1、引言2、相关工作3、方法3.1、重新审视坐标注意力3.1.1、坐标注意力3.1.2、坐标注意力的不足 3.2、高效局部注意力3.3、多个ELA版本设置3.4、可视化3.5、实现 4、实验4.1、实验细节4.2、ImageNet上的图像分类4.3、目标检测4.4、语义分割 5、结论 摘要 https://…

zdpreact_antdesginpro 研究一下react里面比较流行的一个UI框架,开发后台管理系统

首先看一下最开始的代码&#xff1a; 这里面大部分的东西都可以删掉&#xff0c;比如README&#xff0c;只留下中文的那个就可以了。 之后看看README.md中介绍的特性。 特性 &#x1f4a1; TypeScript: 应用程序级 JavaScript 的语言&#x1f4dc; 区块: 通过区块模板快速…

【Linux】网络基础常识{OSI七层模型/ TCP/IP / 端口号 /各种协议}

文章目录 1.网络常识1.0DHCP协议1. 1IP地址/MAC地址/ARP协议是什么&#xff1f;IP/MACARP&#xff1a;IP ⇒ MAC 1.2手机连接wifi的原理 SSID与BSSID手机连接wifiSSID与BSSID 1.3手机如何通过“数据/流量”上网&#xff1f;1.4电脑连接wifi的原理&#xff1f;电脑通过热点上网…

RH850P1X芯片学习笔记-Clocked Serial Interface H (CSIH)

文章目录 Features of RH850/P1x-C CSIHUnitsRegister Base AddressClock SupplyInterrupt RequestsHardware ResetExternal Input/Output Signals数据一致性检查 OverviewFunctional OverviewFunctional Overview DescriptionBlock Diagram RegistersList of RegistersCSIHnCT…