机器学习 - 线性回归(Linear Regression)

2024-06-21 01:58

本文主要是介绍机器学习 - 线性回归(Linear Regression),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 目标

线性回归是希望通过对样本集进行有监督的学习之后,找出特征属性与标签属性之间的线性关系 Θ \Theta Θ。从而在获取没有标签值的新数据时,根据特征值和线性关系,对标签值进行预测。
散点图

2. 算法原理

2.1 线性模型(Linear Model)

在二维平面坐标系中,一条直线可表示为: f ( x ) = θ 1 x + θ 0 f(x) = \theta_1x + \theta_0 f(x)=θ1x+θ0
扩展到n维空间中,则表示为: f ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n f(x) = \theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n f(x)=θ0+θ1x1+θ2x2+...+θnxn
同时可写成向量的形式: f ( x ) = Θ T X f(x) = \Theta^TX f(x)=ΘTX
其中 X = [ x 0 , x 1 , x 2 , . . . , x n ] T ( x 0 = 1 ) ; Θ = [ θ 0 , θ 1 , θ 2 , . . . , θ n ] T X = [x_0,x_1,x_2,...,x_n]^T(x_0=1);\Theta = [\theta_0,\theta_1,\theta_2,...,\theta_n]^T X=[x0,x1,x2,...,xn]T(x0=1);Θ=[θ0,θ1,θ2,...,θn]T

2.2 损失函数(Loss Function)

当有了样本集 D = { ( X i , y i ) } i = 1 n D = \{(X_i,y_i)\}^n_{i=1} D={(Xi,yi)}i=1n,即视作空间中的n个离散点之后,如何对这些点进行拟合,形成一个曲面方程,则成为需要解决的问题。
根据线性模型可知,想要改变曲面拟合的形状,我们可以调整的是特征属性前的系数 Θ \Theta Θ
为了使曲面与样本集中的点拟合的更好,需要设定一个评判标准,即损失函数:
J ( θ 0 , θ 1 , . . . , θ m ) = 1 2 n ∑ i = 1 n ( h θ ( X i ) − y i ) 2 J(\theta_0,\theta_1,...,\theta_m) = \frac{1}{2n}\sum^n_{i=1}(h_\theta(X_i)-y_i)^2 J(θ0,θ1,...,θm)=2n1i=1n(hθ(Xi)yi)2
其中: h θ ( X ) = f ( X ) h_\theta(X) = f(X) hθ(X)=f(X),只不过 h θ ( X ) h_\theta(X) hθ(X)是根据变量 θ \theta θ变化的。
损失函数的意思是,在 Θ \Theta Θ 确定时,每组属性 X i X_i Xi均能根据线性函数获取到相应的 f ( X i ) f(X_i) f(Xi) h θ ( X i ) h_\theta(X_i) hθ(Xi),而 y i y_i yi是样本集中给出的标签值,将二者相减再取平方,获取到某一组特征拟合结果与标签值的差异。然后对每组求得得差异求和后除以 2 n 2n 2n计算出数值,作为当前 Θ \Theta Θ 前提下得损失值。
而损失函数本身如果画出来是一条关于 Θ \Theta Θ 的曲线。
损失函数曲线
问题就转化成了求损失函数的最小值

2.3 梯度下降

梯度下降是一种求凸函数极值的方法,这种方法是求取函数在某一个点的斜率,并根据设定的学习率 α \alpha α,调整 Θ \Theta Θ ,迭代的向损失函数的极小值靠近,最终求得 Θ \Theta Θ。公式如下:
θ j = θ j − α d d θ j J ( θ j ) \theta_j = \theta_j - \alpha\frac{d}{d\theta_j}J(\theta_j) θj=θjαdθjdJ(θj)
其中 d d θ j J ( θ j ) \frac{d}{d\theta_j}J(\theta_j) dθjdJ(θj)是损失函数关于 θ j \theta_j θj的斜率,乘上设定的系数后,迭代递减。

至此 Θ \Theta Θ 可求,问题也得以解决,但其实还存在两个问题

  • 引入的 α \alpha α 如何给值,太小会导致收敛速度慢,太大又会导致震荡或者不收敛?
  • 当模型复杂的时候, J ( Θ ) J(\Theta) J(Θ)是一个高阶函数,会把样本中的噪声特性也学习下来,虽然能完美的拟合样本集,却泛化能力差,即过拟合

2.4 通过正则化减小过拟合风险

损失函数变为:
J ( Θ ) = 1 2 n [ ∑ i = 1 n ( h θ ( X i ) − y i ) 2 + λ ∑ j = 1 m θ j 2 ] J(\Theta) = \frac{1}{2n}[\sum^n_{i=1}(h_\theta(X_i)-y_i)^2+\lambda\sum^m_{j=1}\theta_j^2] J(Θ)=2n1[i=1n(hθ(Xi)yi)2+λj=1mθj2]
其中 λ ∑ j = 1 m θ j 2 \lambda\sum^m_{j=1}\theta_j^2 λj=1mθj2是正则项,用于控制大量参数对拟合的影响。

2.5 学习率的选取

结论是通常会尝试一系列学习率的取值:0.001, 0.003,0.01, 0.03,0.1, 0.3,1,
初始值0.001, 如此循环直至找到最合适的 α \alpha α。然后对于这些不同的 α \alpha α 值,绘制 J ( Θ ) J(\Theta) J(Θ) 随迭代步数变化的曲线,然后选择看上去使其快速下降的值。

3. Python实例 - 波士顿房价

sklearn库中提供了几种数据集,load_boston是波士顿房价的数据集,以此进行实验。

3.1 双变量拟合 - 模拟算法原理

import numpy as np
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt
# 解决中文乱码问题
import matplotlib.font_manager as fm
chinesefont = fm.FontProperties(fname='C:/Windows/Fonts/msyh.ttc')# 获取数据
boston = load_boston()# 仅以LSTAT属性作为特征的散点图
# 人口中低下人群所占比例
# x = [x1,x2,...,xn]; y = [y1,y2,...,yn]
x = boston.data[:,12]
y = boston.target
plt.scatter(x,y,s=10, c='r')
plt.xlabel('人口中地下人群所占比例',fontproperties=chinesefont)
plt.ylabel('房价,单位$1000',fontproperties=chinesefont)
plt.show()

散点图

# 转换X向量和Y向量
# X = [[1,x1],[1,x2],...,[1,xn]]
# Y = [[y1],[y2],...,[yn]]
X = np.c_[np.ones(x.shape[0]),x]
Y = y.reshape(y.shape[0],1)# 定义以上损失函数cost
# cost = theta0 + theta1 * x
def cost(X, Y, theta=[[0],[0]]):J = 0m = Y.sizeh = X.dot(theta)    J = 1.0/(2*m)*(np.sum(np.square(h-y)))# 加入正则项 lambda = 1 时# J = 1.0/(2*m)*((np.sum(np.square(h-y)))+ 1 * np.sum(np.square(theta)))return J# 定义梯度下降函数
# 此处用的是最大迭代次数限制进行循环,也可以使用下降判断进行循环
def gradientDescent(X, Y, theta=[[0],[0]], alpha=0.009, num_iters=1500):m = Y.sizeJ_history = np.zeros(num_iters)for iter in np.arange(num_iters):h = X.dot(theta)theta = theta - alpha*(1.0/m)*(X.T.dot(h-Y))J_history[iter] = cost(X, Y, theta)return(theta, J_history)# 执行梯度下降函数获得最终theta以及损失值列表CostJ
theta, CostJ = gradientDescent(X,Y)# 绘制损失值列表,即损失函数
plt.plot(CostJ)
plt.xlabel('迭代次数',fontproperties=chinesefont)
plt.ylabel('损失函数值',fontproperties=chinesefont)
plt.show()

损失函数

# 根据求得得theta,得到线性方程,进行拟合显示
y_predict = theta[0] + theta[1] * x
plt.scatter(x,y,s=10, c='r')
plt.xlabel('人口中地下人群所占比例',fontproperties=chinesefont)
plt.ylabel('房价,单位$1000',fontproperties=chinesefont)
plt.plot(x,y_predict )

拟合直线

3.2 sklearn中的LinearRegression 与 多变量拟合

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import sklearn.metrics# 按照30%的比例对样本集进行拆分
X_train,X_test,y_train,y_test = train_test_split(boston.data,boston.target,test_size=0.3)# 利用 sklearn 库 进行线性拟合
regr = LinearRegression()
regr.fit(X_train, y_train)
print(regr.intercept_,regr.coef_)
'''
> 37.160773310177426 [-1.07867550e-01  3.97141277e-02  1.99087321e-02  2.97904968e+00-1.46457678e+01  3.47666820e+00  7.33405297e-05 -1.34668768e+002.85031315e-01 -1.16980362e-02 -9.81568374e-01  8.75851883e-03-5.37797404e-01]
'''# 对训练集和测试集进行预测
y_train_pred = regr.predict(X_train)
y_test_pred = regr.predict(X_test)
# 计算相应的MAE和RMSE,填入计算需要的值到括号中
print("Train MAE: ", sklearn.metrics.mean_absolute_error(y_train,y_train_pred))
print("Train RMSE: ", np.sqrt(sklearn.metrics.mean_squared_error(y_train,y_train_pred )))
print("Test MAE: ", sklearn.metrics.mean_absolute_error(y_test,y_test_pred ))
print("Test RMSE: ", np.sqrt(sklearn.metrics.mean_squared_error(y_test,y_test_pred )))
'''
> Train MAE:  3.141770205845444Train RMSE:  4.575911160428769Test MAE:  3.514234225409807Test RMSE:  4.959841655342295
'''

学习不易,贵在坚持

这篇关于机器学习 - 线性回归(Linear Regression)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079892

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个