【机器学习】01-线性回归学习笔记

引言

例子:房价预测
属于有监督学习
在这里插入图片描述

  • 从给定输入和输出的训练即中学习输入和输出之间的映射函数,然后利用该映射函数预测出测试样本的输出值,其中训练集中的每个样本都由输入和对应的输出(也称之为label)组成(labeld data)
    • 回归(Regression)——预测的目标值是数值型,连续变量
    • 分类(Classification)——预测的目标值是离散的

01 回归与线性回归(Linear Regression Overview)

1.回归

  • 根据自变量 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn以及因变量y的观测样本,去估计两者之间近似的函数关系 f f f
    • 通常,假设函数 f f f的数学形式是已知的,但其中的若干个参数未知
    • 通过自变量和因变量的观测样本去估计未知的参数值—— 参 数 回 归 \color{yellow}{参数回归}

2.线性回归

  • 函数 f f f是线性函数
  • 机器学习中最简单的模型之一
  • 线性回归方程的一般形式

y = w 0 + w 1 x 1 + w 2 x 2 + . . . + w n x n y=w_0+w_1x_1+w_2x_2+...+w_nx_n y=w0+w1x1+w2x2+...+wnxn,
其中W=[ w 0 w 1 w 2 . . . w n w_0w_1w_2...w_n w0w1w2...wn]为回归系数
在这里插入图片描述
一元回归

  • 一个自变量,n=1

多元回归

  • 有两个或两个以上的自变量,n>1

回归

  • 求回归系数的过程

例——房价预测

  • 目标值Price
    • 一元回归问题
    • 计算公式
      • P r i c e = 0.2 ∗ S i z e \color{yellow}{Price=0.2*Size} Price=0.2Size
        • 回归方程
        • 0.2称为 回 归 系 数 \color{yellow}{回归系数}

多项式回归可转换为多元线性回归

  • 一元m次多项式回归方程
    y = w 0 + w 1 x + w 2 x 2 + . . . + w m x m y=w_0+w_1x+w_2x^2+...+w_mx^m y=w0+w1x+w2x2+...+wmxm
    可转换为m元线性回归方程
    y = w 0 + w 1 x 1 + w 2 x 2 + . . . + w m x m y=w_0+w_1x_1+w_2x_2+...+w_mx_m y=w0+w1x1+w2x2+...+wmxm
    其中 x i = x i x_i=x^i xi=xi

  • 二元二次多项式回归方程
    y = a 0 + a 1 x 1 2 + a 2 x 2 2 + a 3 x 1 x 2 + a 4 x 1 + a 5 x 2 y=a_0+a_1x_{1}^{2}+a_2x_{2}^{2}+a_3x_{1}x_{2}+a_4x_1+a_5x_2 y=a0+a1x12+a2x22+a3x1x2+a4x1+a5x2
    可转换为5元线性回归方程
    y = w 0 + w 1 z 1 + w 2 z 2 + w 3 z 3 + w 4 z 4 + w 5 z 5 y=w_0+w_1z_1+w_2z_2+w_3z_3+w_4z_4+w_5z_5 y=w0+w1z1+w2z2+w3z3+w4z4+w5z5
    其中 z 1 = x 1 2 , z 2 = x 2 2 , z 3 = x 1 x 2 , z 4 = x 1 , z 5 = x 2 z_1=x_{1}^{2},z_2=x_{2}^{2},z_3=x_{1}x_{2},z_4=x_1,z_5=x_2 z1=x12z2=x22z3=x1x2z4=x1z5=x2

线性回归的一般方法

收集数据,采集训练样本,每个训练样本包括特征向量及其对应的期望输出

  • 假设有n个已标记的样本数据, X i X_i Xi为第i个样本, y i y_i yi是该样本给定的期望输出

    • 其中 X i = [ x 0 = 1 , x 1 , x 2 , . . . , x m ] X_i=[x_0=1,x_1,x_2,...,x_m] Xi=[x0=1,x1,x2,...,xm]
    • 回归系数W=[w_0,w_1,…,w_m]
    • 预测值 y i ′ = X i W y_i'=X_iW yi=XiW
  • 设 计 训 练 算 法 找 到 回 归 系 数 \color{yellow}{设计训练算法找到回归系数}

    • 显然,直观的方法,希望输出的期望值与测试值误差最小

    线性回归的损失函数(Cost function)

    在这里插入图片描述
    ( x 1 , y 1 ) 与 ( x 1 , y 1 ′ ) 的 距 离 (x_1,y_1)与(x_1,y_1')的距离 (x1,y1)(x1,y1):
    d 1 = ( x 1 − x 1 ) 2 + ( y 1 − y 1 ′ ) 2 = ∣ y 1 − y 1 ′ ∣ = ∣ y 1 − X 1 W ∣ d_1=\sqrt {(x_1-x_1)^2+(y_1-y_1')^2}=|y_1-y_1'|=|y_1-X_1W| d1=(x1x1)2+(y1y1)2 =y1y1=y1X1W
    其中
    W = [ w 0 w 1 ] , X 1 = [ 1 x 1 ] W=\begin{bmatrix} w_0 \\ w_1 \\ \end{bmatrix},X_1=\begin{bmatrix} 1 & x_1 \end{bmatrix} W=[w0w1],X1=[1x1]
    为消除正负值的影响,取 d i 2 d_{i}^{2} di2
    损 失 函 数 : \color{yellow}{损失函数}: :
    f ( W ) = ∑ i = 1 n d i 2 = ∑ i = 1 n ( y i − y i ′ ) 2 f(W)=\sum_{i=1}{n}d_{i}^{2}=\sum_{i=1}{n}(y_i-y_i')^2 f(W)=i=1ndi2=i=1n(yiyi)2
    ∑ i = 1 n ( y i − X 1 W ) 2 \sum_{i=1}^{n}(y_i-X_1W)^2 i=1n(yiX1W)2
    n为样本的数量

02 普通线性回归(OLR,Ordinary Linear Regression)

正则方程(Normal Equation)

  • 对第i个训练样本,期望输出 y i y_i yi,预测输出 y i ′ y_i' yi
  • 构造损失函数
    在这里插入图片描述
    f ( W ) = ∑ i = 1 n ( y i − y i ′ ) 2 = ∑ i = 1 n ( y i − X i W ) 2 f(W)=\sum_{i=1}^{n}(y_i-y_i')^2=\sum_{i=1}^{n}(y_i-X_iW)^2 f(W)=i=1n(yiyi)2=i=1n(yiXiW)2
    • 目的: m i n f ( W ) min f(W) minf(W)
      - 最小二乘法
      - 又称最小平方法,是一种数学优化技术
      - 通过最小化误差的平方和寻找数据的最佳函数匹配
      - 如何求函数的最小值
      - 对W求导(即对每一个w_i球偏导),令导数等于0,求出W的最优估计

损失函数的矩阵表示

f ( W ) = { f ( w ) = ( Y − X W ) T ( Y − X W ) = Y T Y − Y T X W − W T X T Y + W T X T X W f(W)=\left\{ \begin{aligned} f(w)&=(Y-XW)^T(Y-XW) \\ & = Y^TY-Y^TXW-W^TX^TY+W^TX^TXW\\ \end{aligned} \right. f(W)={f(w)=(YXW)T(YXW)=YTYYTXWWTXTY+WTXTXW
其中, Y = [ y 1 , y 2 , . . . y n ] T Y=[y_1,y_2,...y_n]^T Y=[y1y2...yn]T,
W = [ w 0 , w 1 , . . . w m ] T W=[w_0,w_1,...w_m]^T W=[w0w1...wm]T
X = [ X 1 , X 2 , . . . X n ] T X=[X_1,X_2,...X_n]^T X=[X1X2...Xn]T
X i = [ X i 0 , X i 1 , . . . X n m ] T X_i=[X_{i0},X_{i1},...X_{nm}]^T Xi=[Xi0Xi1...Xnm]T
即 X = [ x 10 x 11 . . . x 1 m x 20 x 21 . . . x 2 m x n 0 x n 1 . . . x n m ] 即X=\begin{bmatrix} x_{10}&x_{11}&...x_{1m}\\ x_{20}&x_{21}&...x_{2m}\\ x_{n0}&x_{n1}&...x_{nm} \end{bmatrix} X=x10x20xn0x11x21xn1...x1m...x2m...xnm
W T X T Y = ( Y T X W ) T 为 一 个 一 元 矩 阵 \color{green}{W^TX^TY=(Y^TXW)^T为一个一元矩阵} WTXTY=(YTXW)T
W T X T Y = Y T X W \color{green}{W^TX^TY=Y^TXW} WTXTY=YTXW
所以我们可以得到

f ( W ) = { f ( w ) = Y T Y − Y T X W − W T X T Y + W T X T X W = Y T Y − 2 W T X T Y + W T X T X W f(W)=\left\{ \begin{aligned} f(w)&=Y^TY-Y^TXW-W^TX^TY+W^TX^TXW \\ & = Y^TY-2W^TX^TY+W^TX^TXW\\ \end{aligned} \right. f(W)={f(w)=YTYYTXWWTXTY+WTXTXW=YTY2WTXTY+WTXTXW

∂ W T X T X W ∂ W \frac{\partial W^TX^TXW}{\partial W} WWTXTXW
= ( X T X + ( X T X ) T W =(X^TX+(X^TX)^TW =(XTX+(XTX)TW
= 2 X T X W =2X^TXW =2XTXW

对W求导
f ( W ) ′ = 2 X T X W − 2 X T Y f(W)'=2X^TXW-2X^TY f(W)=2XTXW2XTY
X T X W − X T Y = 0 , 求 出 W ^   = ( X T X ) − 1 X T Y   公 式 ( 1 ) X^TXW-X^TY=0,求出\hat W\ =(X^TX)^{-1}X^TY \ 公式(1) XTXWXTY=0,W^ =(XTX)1XTY (1)

逆 矩 阵 存 在 的 条 件 ∣ X T X ∣ ≠ 0 \color{green}{逆矩阵存在的条件|X^TX|≠0} XTX=0
行 列 式 ≠ 0 行列式≠0 =0

练习

在这里插入图片描述
对上图的散点图给出最佳拟合直线
对应数据文件——ex0.txt

  • 编程思想
    - 读入数据文件中的数据
    - 建立输入、输出矩阵
    - 根据公式(1)计算回归系数
1.000000	0.067732	3.176513
1.000000	0.427810	3.816464
1.000000	0.995731	4.550095
1.000000	0.738336	4.256571
1.000000	0.981083	4.560815
1.000000	0.526171	3.929515
1.000000	0.378887	3.526170
1.000000	0.033859	3.156393
1.000000	0.132791	3.110301
1.000000	0.138306	3.149813
1.000000	0.247809	3.476346
1.000000	0.648270	4.119688
1.000000	0.731209	4.282233
1.000000	0.236833	3.486582
1.000000	0.969788	4.655492
1.000000	0.607492	3.965162
1.000000	0.358622	3.514900
1.000000	0.147846	3.125947
1.000000	0.637820	4.094115
1.000000	0.230372	3.476039
1.000000	0.070237	3.210610
1.000000	0.067154	3.190612
1.000000	0.925577	4.631504
1.000000	0.717733	4.295890
1.000000	0.015371	3.085028
1.000000	0.335070	3.448080
1.000000	0.040486	3.167440
1.000000	0.212575	3.364266
1.000000	0.617218	3.993482
1.000000	0.541196	3.891471
1.000000	0.045353	3.143259
1.000000	0.126762	3.114204
1.000000	0.556486	3.851484
1.000000	0.901144	4.621899
1.000000	0.958476	4.580768
1.000000	0.274561	3.620992
1.000000	0.394396	3.580501
1.000000	0.872480	4.618706
1.000000	0.409932	3.676867
1.000000	0.908969	4.641845
1.000000	0.166819	3.175939
1.000000	0.665016	4.264980
1.000000	0.263727	3.558448
1.000000	0.231214	3.436632
1.000000	0.552928	3.831052
1.000000	0.047744	3.182853
1.000000	0.365746	3.498906
1.000000	0.495002	3.946833
1.000000	0.493466	3.900583
1.000000	0.792101	4.238522
1.000000	0.769660	4.233080
1.000000	0.251821	3.521557
1.000000	0.181951	3.203344
1.000000	0.808177	4.278105
1.000000	0.334116	3.555705
1.000000	0.338630	3.502661
1.000000	0.452584	3.859776
1.000000	0.694770	4.275956
1.000000	0.590902	3.916191
1.000000	0.307928	3.587961
1.000000	0.148364	3.183004
1.000000	0.702180	4.225236
1.000000	0.721544	4.231083
1.000000	0.666886	4.240544
1.000000	0.124931	3.222372
1.000000	0.618286	4.021445
1.000000	0.381086	3.567479
1.000000	0.385643	3.562580
1.000000	0.777175	4.262059
1.000000	0.116089	3.208813
1.000000	0.115487	3.169825
1.000000	0.663510	4.193949
1.000000	0.254884	3.491678
1.000000	0.993888	4.533306
1.000000	0.295434	3.550108
1.000000	0.952523	4.636427
1.000000	0.307047	3.557078
1.000000	0.277261	3.552874
1.000000	0.279101	3.494159
1.000000	0.175724	3.206828
1.000000	0.156383	3.195266
1.000000	0.733165	4.221292
1.000000	0.848142	4.413372
1.000000	0.771184	4.184347
1.000000	0.429492	3.742878
1.000000	0.162176	3.201878
1.000000	0.917064	4.648964
1.000000	0.315044	3.510117
1.000000	0.201473	3.274434
1.000000	0.297038	3.579622
1.000000	0.336647	3.489244
1.000000	0.666109	4.237386
1.000000	0.583888	3.913749
1.000000	0.085031	3.228990
1.000000	0.687006	4.286286
1.000000	0.949655	4.628614
1.000000	0.189912	3.239536
1.000000	0.844027	4.457997
1.000000	0.333288	3.513384
1.000000	0.427035	3.729674
1.000000	0.466369	3.834274
1.000000	0.550659	3.811155
1.000000	0.278213	3.598316
1.000000	0.918769	4.692514
1.000000	0.886555	4.604859
1.000000	0.569488	3.864912
1.000000	0.066379	3.184236
1.000000	0.335751	3.500796
1.000000	0.426863	3.743365
1.000000	0.395746	3.622905
1.000000	0.694221	4.310796
1.000000	0.272760	3.583357
1.000000	0.503495	3.901852
1.000000	0.067119	3.233521
1.000000	0.038326	3.105266
1.000000	0.599122	3.865544
1.000000	0.947054	4.628625
1.000000	0.671279	4.231213
1.000000	0.434811	3.791149
1.000000	0.509381	3.968271
1.000000	0.749442	4.253910
1.000000	0.058014	3.194710
1.000000	0.482978	3.996503
1.000000	0.466776	3.904358
1.000000	0.357767	3.503976
1.000000	0.949123	4.557545
1.000000	0.417320	3.699876
1.000000	0.920461	4.613614
1.000000	0.156433	3.140401
1.000000	0.656662	4.206717
1.000000	0.616418	3.969524
1.000000	0.853428	4.476096
1.000000	0.133295	3.136528
1.000000	0.693007	4.279071
1.000000	0.178449	3.200603
1.000000	0.199526	3.299012
1.000000	0.073224	3.209873
1.000000	0.286515	3.632942
1.000000	0.182026	3.248361
1.000000	0.621523	3.995783
1.000000	0.344584	3.563262
1.000000	0.398556	3.649712
1.000000	0.480369	3.951845
1.000000	0.153350	3.145031
1.000000	0.171846	3.181577
1.000000	0.867082	4.637087
1.000000	0.223855	3.404964
1.000000	0.528301	3.873188
1.000000	0.890192	4.633648
1.000000	0.106352	3.154768
1.000000	0.917886	4.623637
1.000000	0.014855	3.078132
1.000000	0.567682	3.913596
1.000000	0.068854	3.221817
1.000000	0.603535	3.938071
1.000000	0.532050	3.880822
1.000000	0.651362	4.176436
1.000000	0.901225	4.648161
1.000000	0.204337	3.332312
1.000000	0.696081	4.240614
1.000000	0.963924	4.532224
1.000000	0.981390	4.557105
1.000000	0.987911	4.610072
1.000000	0.990947	4.636569
1.000000	0.736021	4.229813
1.000000	0.253574	3.500860
1.000000	0.674722	4.245514
1.000000	0.939368	4.605182
1.000000	0.235419	3.454340
1.000000	0.110521	3.180775
1.000000	0.218023	3.380820
1.000000	0.869778	4.565020
1.000000	0.196830	3.279973
1.000000	0.958178	4.554241
1.000000	0.972673	4.633520
1.000000	0.745797	4.281037
1.000000	0.445674	3.844426
1.000000	0.470557	3.891601
1.000000	0.549236	3.849728
1.000000	0.335691	3.492215
1.000000	0.884739	4.592374
1.000000	0.918916	4.632025
1.000000	0.441815	3.756750
1.000000	0.116598	3.133555
1.000000	0.359274	3.567919
1.000000	0.814811	4.363382
1.000000	0.387125	3.560165
1.000000	0.982243	4.564305
1.000000	0.780880	4.215055
1.000000	0.652565	4.174999
1.000000	0.870030	4.586640
1.000000	0.604755	3.960008
1.000000	0.255212	3.529963
1.000000	0.730546	4.213412
1.000000	0.493829	3.908685
1.000000	0.257017	3.585821
1.000000	0.833735	4.374394
1.000000	0.070095	3.213817
1.000000	0.527070	3.952681
1.000000	0.116163	3.129283

# -*- coding:utf-8 -*-
from matplotlib.font_manager import FontProperties
import matplotlib.pyplot as plt
import numpy as np



def loadDataSet(fileName):
	"""
	函数说明:加载数据
	Parameters:
		fileName - 文件名
	Returns:
		xArr - x数据集
		yArr - y数据集

	"""
	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 xArr, yArr



def standRegres(xArr,yArr):
	"""
	函数说明:计算回归系数w
	Parameters:
		xArr - x数据集
		yArr - y数据集
	Returns:
		ws - 回归系数

	"""
	xMat = np.mat(xArr); yMat = np.mat(yArr).T
	xTx = xMat.T * xMat							#根据文中推导的公示计算回归系数
	if np.linalg.det(xTx) == 0.0:
		print("矩阵为奇异矩阵,不能求逆")
		return
	ws = xTx.I * (xMat.T*yMat)
	return ws



def plotDataSet():
	"""
	函数说明:绘制数据集
	Parameters:
		无
	Returns:
		无

	"""
	xArr, yArr = loadDataSet('ex0.txt')									#加载数据集
	n = len(xArr)														#数据个数
	xcord = []; ycord = []												#样本点
	for i in range(n):
		xcord.append(xArr[i][1]); ycord.append(yArr[i])					#样本点
	fig = plt.figure()
	ax = fig.add_subplot(111)											#添加subplot
	ax.scatter(xcord, ycord, s = 20, c = 'blue',alpha = .5)				#绘制样本点
	plt.title('DataSet')									#绘制title
	plt.xlabel('X')
	plt.show()

def plotRegression():
	"""
	函数说明:绘制回归曲线和数据点
	Parameters:
		无
	Returns:
		无

	"""
	xArr, yArr = loadDataSet('ex0.txt')									#加载数据集
	ws = standRegres(xArr, yArr)										#计算回归系数
	xMat = np.mat(xArr)													#创建xMat矩阵
	yMat = np.mat(yArr)													#创建yMat矩阵
	xCopy = xMat.copy()													#深拷贝xMat矩阵
	xCopy.sort(0)														#对数据进行排序
	yHat = xCopy * ws 													#计算对应的y值
	fig = plt.figure()
	ax = fig.add_subplot(111)											#添加subplot
	ax.plot(xCopy[:, 1], yHat, c = 'red')								#绘制回归曲线
	ax.scatter(xMat[:,1].flatten().A[0], yMat.flatten().A[0], s = 20, c = 'blue',alpha = .5)	#绘制样本点,使用flatten()展平数据
	plt.title('DataSet')												#绘制title
	plt.xlabel('X')
	plt.show()


def plotlwlrRegression():
	"""
	函数说明:绘制多条局部加权回归曲线
	Parameters:
		无
	Returns:
		无

	"""
	font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
	xArr, yArr = loadDataSet('ex0.txt')									#加载数据集
	yHat_1 = lwlrTest(xArr, xArr, yArr, 1.0)							#根据局部加权线性回归计算yHat
	yHat_2 = lwlrTest(xArr, xArr, yArr, 0.01)							#根据局部加权线性回归计算yHat
	yHat_3 = lwlrTest(xArr, xArr, yArr, 0.003)							#根据局部加权线性回归计算yHat
	xMat = np.mat(xArr)													#创建xMat矩阵
	yMat = np.mat(yArr)													#创建yMat矩阵
	srtInd = xMat[:, 1].argsort(0)										#排序,返回索引值
	xSort = xMat[srtInd][:,0,:]
	fig, axs = plt.subplots(nrows=3, ncols=1,sharex=False, sharey=False, figsize=(10,8))

	axs[0].plot(xSort[:, 1], yHat_1[srtInd], c = 'red')						#绘制回归曲线
	axs[1].plot(xSort[:, 1], yHat_2[srtInd], c = 'red')						#绘制回归曲线
	axs[2].plot(xSort[:, 1], yHat_3[srtInd], c = 'red')						#绘制回归曲线
	axs[0].scatter(xMat[:,1].flatten().A[0], yMat.flatten().A[0], s = 20, c = 'blue', alpha = .5)				#绘制样本点
	axs[1].scatter(xMat[:,1].flatten().A[0], yMat.flatten().A[0], s = 20, c = 'blue', alpha = .5)				#绘制样本点
	axs[2].scatter(xMat[:,1].flatten().A[0], yMat.flatten().A[0], s = 20, c = 'blue', alpha = .5)				#绘制样本点


	#设置标题,x轴label,y轴label
	axs0_title_text = axs[0].set_title(u'局部加权回归曲线,k=1.0',FontProperties=font)
	axs1_title_text = axs[1].set_title(u'局部加权回归曲线,k=0.01',FontProperties=font)
	axs2_title_text = axs[2].set_title(u'局部加权回归曲线,k=0.003',FontProperties=font)

	plt.setp(axs0_title_text, size=8, weight='bold', color='red')
	plt.setp(axs1_title_text, size=8, weight='bold', color='red')
	plt.setp(axs2_title_text, size=8, weight='bold', color='red')

	plt.xlabel('X')
	plt.show()

def lwlr(testPoint, xArr, yArr, k = 1.0):
	"""
	函数说明:使用局部加权线性回归计算回归系数w
	Parameters:
		testPoint - 测试样本点
		xArr - x数据集
		yArr - y数据集
		k - 高斯核的k,自定义参数
	Returns:
		ws - 回归系数

	"""
	xMat = np.mat(xArr); yMat = np.mat(yArr).T
	m = np.shape(xMat)[0]
	weights = np.mat(np.eye((m)))										#创建权重对角矩阵
	for j in range(m):                      							#遍历数据集计算每个样本的权重
		diffMat = testPoint - xMat[j, :]
		weights[j, j] = np.exp(diffMat * diffMat.T/(-2.0 * k**2))
	xTx = xMat.T * (weights * xMat)
	if np.linalg.det(xTx) == 0.0:
		print("矩阵为奇异矩阵,不能求逆")
		return
	ws = xTx.I * (xMat.T * (weights * yMat))							#计算回归系数
	return testPoint * ws



def lwlrTest(testArr, xArr, yArr, k=1.0):
	"""
	函数说明:局部加权线性回归测试
	Parameters:
		testArr - 测试数据集
		xArr - x数据集
		yArr - y数据集
		k - 高斯核的k,自定义参数
	Returns:
		ws - 回归系数
	"""
	m = np.shape(testArr)[0]											#计算测试数据集大小
	yHat = np.zeros(m)
	for i in range(m):													#对每个样本点进行预测
		yHat[i] = lwlr(testArr[i],xArr,yArr,k)
	return yHat


if __name__ == '__main__':
	plotlwlrRegression()

相关系数分析

如何判断模型的优劣?

在这里插入图片描述

  • 右边两组数据集得到完全相同的回归系数(0,2.0)
  • 通过预测值和真实值得匹配程度判断优劣
    - 相关系数
    r ( X , Y ) = c o v ( X , Y ) D ( x ) D ( Y ) r(X,Y)=\frac{cov(X,Y)}{\sqrt{D(x)}\sqrt{D(Y)}} r(X,Y)=D(x) D(Y) cov(X,Y)
    其中cov(X,Y)是协方差, D ( X ) \sqrt {D(X)} D(X) 是方差
    - 显然r(X,X)=1

NumPy库中相关系数计算方法

  • corrcoef(yHat.T,yMat)
  • 请分析根据ex0.txt数据集得到的结果的相关系数
  • 0.98647356
    在这里插入图片描述

OLR存在的问题及改进

在这里插入图片描述

  • 欠拟合现象常见
  • 若出现欠拟合则不能取得最好的预测效果
  • 显然红线的拟合效果更好
  • 改进
    - 原算法所有输入输出对(x,y)采用同样的回归系数,画出一条直线
    - 若每个(x,y)有自己的回归系数则会出现一条折线
    * 预测点附近的点有更高的权重参与回归分析

03 基于梯度下降的线性回归(Gradient Descent)

正则方程问题
  • OLR使用正则方程来求解回归系数
    W ^   = ( X T X ) − 1 X T Y \hat W\ =(X^TX)^{-1}X^TY W^ =(XTX)1XTY
  • 若X^TX不可逆,则无法求解
  • 且若参数维度非常大,解析解计算量过大,显然也不适用
    • 特征数量不超过100000时可用正则方程求解
  • 另一种求解回归系数的方法
    • 梯度下降

梯度下降

  • 一种迭代寻优的算法
  • 要找到某函数的最小值,总是沿着其下降最快的方向搜索
    • 梯度上升
      在这里插入图片描述
      若损失函数图像如下:
      在这里插入图片描述
      回到损失函数
  • f ( W ) = ∑ i = 1 n ( y i − y i ′ ) 2 = ∑ i = 1 n ( y i − X i W ) 2 f(W)=\sum_{i=1}^{n}(y_i-y_i')^2=\sum_{i=1}^{n}(y_i-X_iW)^2 f(W)=i=1n(yiyi)2=i=1n(yiXiW)2
  • 稍加修改
    f ( W ) = 1 2 ∑ i = 1 n ( y i − X i W ) 2 f(W)=\frac{1}{2}\sum_{i=1}^{n}(y_i-X_iW)^2 f(W)=21i=1n(yiXiW)2
  • 梯度
    Δ = ∂ f ( W ) ∂ W = 1 2 ∂ ∑ i = 1 n ( y i − X i W ) 2 ∂ W = − ∑ i = 1 n ( y i − X i W ) \begin{matrix} \Delta=\frac{\partial f(W)}{\partial W}=\frac{1}{2}\frac{\partial \sum_{i=1}^{n}(y_i-X_iW)^2}{\partial W}\\ =- \sum_{i=1}^{n}(y_i-X_iW) \end{matrix} Δ=Wf(W)=21Wi=1n(yiXiW)2=i=1n(yiXiW)
    梯度确定搜索方向
    还需确定搜索的步长
  • 记为 α \alpha α
  • 回归系数更新公式
    W ^   = W ^ − α Δ = W ^ + α ∑ i = 1 n X i ( y i − X i W ) \hat W\ =\hat W-\alpha\Delta=\hat W+\alpha \sum_{i=1}{n}X_i(y_i-X_iW) W^ =W^αΔ=W^+αi=1nXi(yiXiW)

确定步长 α \alpha α

  • 取值取决于数据样本
  • 步长太大,会导致迭代过快,甚至有可能会错过最优解
  • 步长太小,迭代速度太慢,收敛速度慢
    终止条件
  • 最大终止代数
  • 误差小于给定的小值
    算法参数的初始值选择
  • 初始值不同,获得的最小值也有可能不同,
    梯度下降求得的只是局部最小值
  • 如果损失函数是凸函数则一定是最优解

二次求导f(x)’’<0,证明为凸
在这里插入图片描述
1.凸优化和非凸优化

梯度下降的一些注意事项

数据归一化

  • 由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化
    常用归一化公式
  1. x = x − μ σ x=\frac{x-μ}{\sigma} x=σxμ
    其中,μ为均值, σ \sigma σ为均方差,x为特征
    2. x = x − x m i n x m a x − x m i n x=\frac{x-x_{min}}{x_{max}-x_{min}} x=xmaxxminxxmin
    按第二种归一化方法
    在这里插入图片描述

梯度下降伪代码

每个回归系数初始化为1
LOOP
计算整个数据集的梯度
Δ = ∑ i = 1 n X i ( y i − X i W ) \Delta=\sum_{i=1}^{n}X_i(y_i-X_iW) Δ=i=1nXi(yiXiW)
更新回归系数
W ^ = W ^ − α Δ \hat W=\hat W-\alpha\Delta W^=W^αΔ
ENDLOOP

梯度下降实战

在这里插入图片描述

  • 修改线性回归
    的代码,加入
    gradDscent(xAr
    r, yArr)函数
  • 结果相比较
    • 解析解
      [[ 3.00774324]
      [ 1.69532264]]
    • 梯度下降
      [[ 3.00758726]
      [ 1.69562035]]

梯度下降存在的问题

需要确定的参数比较多
每次更新回归系数时要遍历整个数据集
Δ = − σ𝑖=1 𝑛 𝑋𝑖(𝑦𝑖 − 𝑋𝑖𝑊)
数据集数据量大时计算代价太高

  • 改进
    ►仅在新样本来时对回归系数进行增量式更新
    ►每次只用一个样本点来更新回归系数
    随机梯度下降
    Δ = − X i ( y i − X i W ) \Delta = -X_i(y_i-X_iW) Δ=Xi(yiXiW)

随机梯度下降(Stochastic Gradient Descent)

算法步骤

  • BEGIN
    • 所有回归系数初始化为1
    • 对数据集中每个样本
      - 计算该样本的梯度
      - 更新回归系数值
    • 返回回归系数值
  • END
    实验结果
    ► 随机梯度下降的回归系数
    [1.4159566 1.21208609]
    ► 梯度下降的回归系数
    [[ 3.00758726] [ 1.69562035]]

GD VS. SGD

在这里插入图片描述

实验结果分析

在这里插入图片描述
►修改代码

  • 增加步长,加快调整
    步伐
  • 让SGD针对所有样本
    迭代200次
  • 第二种修改实验结果
  • SGD
    [ 2.99841277 1.7135262 ]
  • GD
    [[ 3.00758726] [ 1.69562035]]

随机梯度下降的改进

步长决定了每一次回归系数调整的幅度

  • 大的步长能加快收敛速度,但有可能错过最优值
  • 小的步长收敛速度慢,但有助于找到最优值
    改进
  • 步长 α = f ( i t e r ) \alpha=f(iter) α=f(iter)
    • iter为迭代的代数
  • 即令步长等于当前迭代树的函数
    • 一般为线性函数
    • 随iter增加减少
      数据集中的点不一定都能拟合到直线上
  • 原算法中依次取样本数据中的点,很可能造成回归系数的震荡
    • ex0.txt和ex1.txt的数据简单,没有这种现象
      改进
  • 每次随机取一个样本点计算回归系数的增量
    在这里插入图片描述

练习 2

►分别采用梯度下降和随机梯度下降算法对
ex0.txt,ex1.txt数据集进行分析
►改进SGD,设计一个步长的调整函数,尝
试不同的参数,与未改进的SGD进行比较
►将GD,SGD,ASGD的结果画在一张图
上,用不同颜色表示,并给出最后的回归
系数
►分析OLR,GD,SGD和改进的SGD的结
果,计算相关系数,并自行设计表格,列
表比较

04 正则化(Regularization)

在这里插入图片描述

误差(Error)

Error=Bias+Variance

  • 偏差(Bias)反映的是模型在样本上的输出与真实值之间的差,即模型本身的精准度
  • 方差(Variance)反映的是模型每一次输出结果与模型输出期之间的误差,即模型的稳定性
    在这里插入图片描述
训练误差
  1. 学习到的模型的预测值与真实值(标签)在训练数据集上的平均误差
  2. 本质上不重要,仅对判断给定问题是否为容易学习的问题由意义
测试误差
  1. 预测值与真实值在测试数据集上的平均误差
  2. 反映了学习方法对未知测试数据的预测能力,是重要指标
  3. 通常将学习方法对未知数据的预测能力称为泛化能力

过拟合

通常发生在变量(特征)过多的时候
训练数据上误差逐渐减小时,测试数据上误差反而增大,模型泛化能力弱

  • 泛化——一个假设模型能够应用到新样本的能力
    原因:

数据量小
数据噪音大
模型任务本身很复杂
模型搜索空间太大

假设模型包括二项式、三项式…1024项式…,最后选择的最优模型时最高次项的模型

防止过拟合的方法

获取更多数据
权值衰减
减少特征的数量
正则化

正则化:

  1. 对模型参数添加先验知识,使得模型复杂度较小
  2. 过拟合的时候,拟合函数的系数往往非常大,正则化减小参数
  3. 数值的大小,从而减小特征变量的数量级

在这里插入图片描述
原来的损失函数只考虑了经验风险
f ( W ) = ∑ i = 1 n ( y i − X i W ) 2 = ( Y − X W ) T ( Y − X W ) \begin{matrix} f(W)=\sum_{i=1}^{n}(y_i-X_iW)^2\\ =(Y-XW)^T(Y-XW) \end{matrix} f(W)=i=1n(yiXiW)2=(YXW)T(YXW)

►加入正则项共同构成结构风险
f ( W ) = ( Y − X W ) T ( Y − X W ) + λ R ( W ) f(W)=(Y-XW)^T(Y-XW)+\lambda R(W) f(W)=(YXW)T(YXW)+λR(W)
其中𝜆是参数,不同的值有不同的正则化效果
𝑅(𝑊)为正则项,一般取L1或L2范数

L0,L1与L2范数

L0范数

  • 向量中非0的元素的个数,用 ∣ ∣ W ∣ ∣ 0 ||W||_0 W0表示
  • 例:W=[0.4 -0.7 0.3], ∣ ∣ W ∣ ∣ 0 = 3 ||W||_0=3 W0=3
  • 使用L0范数的目的
    • 希望W的大部分元素都是0
    • 实现W的稀疏化
    • 减少特征
      L1范数
  • 向量中各个元素绝对值之和,也称“稀疏规则算”,用 ∣ ∣ W ∣ ∣ 1 ||W||_1 W1表示
  • 例:W=[0.4 -0.7 0.3], ∣ ∣ W ∣ ∣ 1 = 1.4 ||W||_1=1.4 W1=1.4
  • 使用L1范数的目的
    • 与L0相同,两者在一定条件下等价
    • L0范数很难优化求解
    • L1具有更好的优化求解特性被广泛应用

L2范数

  • 向量各元素的平方和的平方根,用 ∣ ∣ W ∣ ∣ 2 ||W||_2 W2表示

  • 例:W=[0.4 -0.7 0.3], ∣ ∣ W ∣ ∣ 2 = 0. 4 2 + 0 2 + ( − 0.7 ) 2 + 0. 3 2 ||W||_2=\sqrt{0.4^2+0^2+(-0.7)^2+0.3^2} W2=0.42+02+(0.7)2+0.32

  • 使用L2范数的目的

    • 使得W的每个元素都很小,都接近于0
    • 与L1范数不同,它不会让W的元素等于0,而是接近于0
    • 越小的参数说明模型越简单
    • 越简单的模型则越不容易产生过拟合现象

    加入正则项的线性回归

    岭回归(Ridge Regression)

    • 加入L2范数的线性回归
    • 正则项为L2范数的平方
      • 缩减(shrinkage)
    • 损失函数
      f ( W ) = ( Y − X W ) T ( Y − X W ) + λ R ∣ ∣ W ∣ ∣ 2 2 = ( Y − X W ) T ( Y − X W ) + λ W T W \begin{matrix} f(W)=(Y-XW)^T(Y-XW)+\lambda R||W||_{2}^{2}\\ =(Y-XW)^T(Y-XW)+\lambda W^TW \end{matrix} f(W)=(YXW)T(YXW)+λRW22=(YXW)T(YXW)+λWTW
      f ( W ) ′ = 2 X T X W − 2 X T Y + 2 λ W = ( X T X + λ I ) W − 2 X T Y \begin{matrix} f(W)'=2X^TXW-2X^TY+2\lambda W\\ =(X^TX+\lambda I)W-2X^TY \end{matrix} f(W)=2XTXW2XTY+2λW=(XTX+λI)W2XTY
      f ( W ) ′ = 0 , 则 W = ( X T X + λ I ) − 1 X T Y f(W)'=0,则W=(X^TX+\lambda I)^{-1}X^TY f(W)=0,W=(XTX+λI)1XTY
      X T X 为 奇 异 矩 阵 , 普 通 线 性 回 归 无 法 求 解 析 解 X^TX为奇异矩阵,普通线性回归无法求解析解 XTX线
    • 岭回归加入 λ I 扰 动 , 使 得 矩 阵 非 奇 异 \lambda I扰动,使得矩阵非奇异 λI使

Lasso回归(Lasso Regression)

  • 加入L1范数的线性回归
  • 损失函数
    f ( W ) = ( Y − X W ) T ( Y − X W ) + λ R ∣ ∣ W ∣ ∣ 1 f(W)=(Y-XW)^T(Y-XW)+\lambda R||W||_{1} f(W)=(YXW)T(YXW)+λRW1
    则 f ( W ) ′ = 2 X T X W − 2 X T Y + λ s g n ( W ) 则f(W)'=2X^TXW-2X^TY+\lambda sgn(W) f(W)=2XTXW2XTY+λsgn(W)
  • 计算复杂度高
  • 需使用二次规划算法

Scikit-learn中的线性回归

►Scikit-learn是一个用于机器学习的功能强大
的python包 ►在数据量不是过大的情况下,可以解决大部
分问题
►Scikit-learn中线性回归模块均包含在linear_model 中
►引入包:from sklearn import linear_model
►普通线性回归LinearRegression()
►岭回归Ridge()
► Lasso回归Lasso ( )

项目1——鲍鱼年龄预测

►实验数据来自UCI数据集
► 鲍鱼年龄可从鲍鱼壳上的年轮推算
► 共4177条数据,8个特征,1个标签,无缺失数据
在这里插入图片描述

项目2——波士顿房价预测

►波士顿房价数据集
► 包含对房价的预测,以千美元计,给定的条件是房屋及其相邻
房屋的详细信息
► 共有 506 个样本,13 个特征和1个标签

在这里插入图片描述

实验要求

在代码中加入预测误差的计算,用该误差来衡量预测的准确度

  • 误差计算公式
    r s s E r r o r = ∑ i = 1 n ( y i − y i ′ ) 2 rssError=\sum_{i=1}^{n}(y_i-y_i')^2 rssError=i=1n(yiyi)2
  • 从数据集中分出两部分,一部分作为训练集,一部分作为测试集
  • 分别采用OLR,k=0.1,1,10的LWLR,梯度下降和采用步长参数的随机梯度下降进行回归分析,得到预测模型
  • 计算每个模型在训练集上的误差,列表比较
  • 计算每个模型在测试集上的误差,列表比较
  • 分析上述实验结果,你得到什么启发?
  • 对所有数据进行实验,用所有数据的前面70%做训练集,剩下的做测试集进行交叉验证,可分工测试不同的参数,比比看谁的结果最优?
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
机器学习线性回归是一种常见的机器学习算法,用于预测数值型变量的值。下面是一个简单的回归例子,以展示如何使用这个算法。 首先,我们需要准备数据集。假设我们有一个房屋价格的数据集,其中包含了房屋的大小和房价。我们可以使用这个数据集来训练一个线性回归模型,以便预测房价。 在介绍算法之前,我们需要导入必要的库,如numpy和pandas。这些库将帮助我们处理和分析数据。 接下来,我们加载数据集并进行必要的数据清洗。这可能包括去除缺失值、处理异常值等。 然后,我们将数据集分为训练集和测试集。训练集将用于训练模型,而测试集将用于评估模型的性能。 在进行机器学习之前,我们需要对数据进行特征缩放。这可以确保所有特征都具有相同的重要性。 接下来,我们将使用线性回归算法来拟合我们的训练数据。这将生成一个线性模型,该模型可以用于预测房价。 我们可以使用模型的系数和截距来了解每个特征对预测的影响。系数的正负表示了特征影响的方向,而系数的绝对值表示了特征的重要性。 最后,我们可以使用测试集来评估模型的性能。我们可以使用一些常见的性能指标,如均方误差和决定系数来评估我们的模型。 总结一下,这个机器学习线性回归的例子笔记本演示了如何使用线性回归算法来预测房价。它涵盖了数据准备、模型训练、模型评估等步骤,以及一些常用的数据处理和模型评估技术。通过这个例子,我们可以更好地理解和应用机器学习线性回归算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水花

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值