问题描述

有一个函数,现在不知道函数的的具体形式,给定满足函数关系的一组训练样本,请使用线性回归模型拟合出函数y=f(x)。
(可尝试一种或几种不同的基函数,如多项式、高斯或sigmoid基函数)

要求:

i. 先完成最小二乘法的优化 (参考书中第二章 2.3节中的公式)

ii. 附加题:实现“多项式基函数”以及“高斯基函数”(可参考PRML)

iii. 附加题:完成梯度下降的优化 (参考书中第二章 2.3节中的公式)
使用训练集train.txt 进行训练,使用测试集test.txt 进行评估(标准差),训练模型时请不要使用测试集。

读取数据

我们先将采集到的数据个读出来:这里以txt的格式保存,利用numpy库从文本中读取数据(注意jupyter notebook中数据必须保存到所建立):

import numpy as np #导入numpy库
import matplotlib.pyplot as plt
train_dataset = np.loadtxt('train.txt')
test_dataset = np.loadtxt('test.txt')
#print(len(train_dataset))
#print(len(test_dataset))
#print(train_dataset)
#print(test_dataset)

在读出所给的数据之后,我们按照题目所给的要求完成最小二乘法的优化(参照书上2.3节公式)这里单单我们看书是很难理解的,因为合理给出了优化参数的方法,但是我拿到这道题目的时候被难住的是最开始的基本线性回归的知识。题目中提到了用到基函数(内心很是mengbi)下面将一些基础知识整理一下,然后自己再试着编程看一看。

线性回归(线性基函数)

最简单的线性回归模型的形式如下所示:
y(x,w)=w0+w1x+⋅⋅⋅+wnxny\left( \mathbf{x,w} \right) =w_0+w_1x+···+w_nx_n y(x,w)=w0​+w1​x+⋅⋅⋅+wn​xn​
其中x=(x1,x2,⋯,xn)T\mathbf{x}=\left( x_1,x_2,\cdots ,x_n \right) ^Tx=(x1​,x2​,⋯,xn​)T,yyy是输入变量x1x_1x1​的线性组合,这种模型具有很大的局限性。
一般用向量形式写成:f(x)=wTx+bf\left( x \right) =\mathbf{w}^Tx+b f(x)=wTx+b
其中$\mathbf{w}=\left( w_1,w_2,\cdots ,w_n \right) ,,,w和和和b$学得之后,模型就可以确定。

我们可以将其扩展为输入变量通过有限个非线性函数转换后的线性组合,如下式表示:y(x,w)=w0+∑j=1n−1wjϕj(x)y\left( \mathbf{x,w} \right) =w_0+\sum_{j=1}^{n-1}{w_j\phi _j\left( \mathbf{x} \right)} y(x,w)=w0​+j=1∑n−1​wj​ϕj​(x)
这里$\phi \left( \mathbf{x} \right) 就是基函数。我们可以添加一个基函数就是基函数。我们可以添加一个基函数就是基函数。我们可以添加一个基函数\phi 0=1,则上式就可以改为,则上式就可以改为,则上式就可以改为$y\left( \mathbf{x,w} \right) =\sum{j=0}^{M-1}{w_j\phi _j\left( \mathbf{x} \right)}=\mathbf{w}^T\phi \left( \mathbf{x} \right) $$
这里w=(w0,w1,⋯wn−1)T\mathbf{w}=\left( w_0,w_1,\cdots w_{n-1} \right) ^Tw=(w0​,w1​,⋯wn−1​)T
,ϕ=(ϕ0,ϕ1,⋯ϕn−1)T\phi =\left( \phi _0,\phi _1,\cdots \phi _{n-1} \right) ^Tϕ=(ϕ0​,ϕ1​,⋯ϕn−1​)T基函数$\phi _j\left( x \right) $可以有多种不同类型,常见的基函数有:

·多项式基函数:ϕj(x)=xj\phi _j\left( x \right) =x^j ϕj​(x)=xj

·高斯基函数:ϕj(x)=e{−(x−uj)22s2}\phi _j\left( x \right) =e^{\left\{ -\frac{\left( x-u_j \right) ^2}{2s^2} \right\}} ϕj​(x)=e{−2s2(x−uj​)2​}
这里uuu控制位置sss控制跨度

·sigmoidsigmoidsigmoid基函数ϕj(x)=σ(x−ujs)\phi _j\left( x \right) =\sigma \left( \frac{x-u_j}{s} \right) ϕj​(x)=σ(sx−uj​​)
σ(a)=11+e(−a)\sigma \left( a \right) =\frac{1}{1+e^{\left( -a \right)}} σ(a)=1+e(−a)1​

参数估计

一般的情况是数据集DiD_iDi​样本是由ddd个属性描述,此时我们试图学得f(xi)=wTxi+bf\left( x_i \right) =\mathbf{w}^Tx_i+b f(xi​)=wTxi​+b使得f(xi)⋍yi\ f\left( x_i \right) \backsimeq y_i f(xi​)⋍yi​,这称为“多元线性回归”(multivariate linear reegression)

类似的我们可以用最小二乘法对www和bbb进行估计,为了便于讨论我们将www和bbb吸入向量形式$\mathbf{\hat{w}}=\left( \mathbf{w:b} \right) ,相应的,把数据集,相应的,把数据集,相应的,把数据集D表示为一个表示为一个表示为一个m×(d+1)大小的矩阵大小的矩阵大小的矩阵X$,其中每行对应于一个示例表示为下述矩阵形式:
X=[lx11x12⋯x1d1x21x22⋯x2d1⋮⋮⋱⋮⋮xm1xm2⋯xmd1]=[lx1T1x2T1⋮⋮xmT1]\mathbf{X}=\left[ \begin{matrix}{l} x_{11}& x_{12}& \cdots& x_{1d}& 1\\ x_{21}& x_{22}& \cdots& x_{2d}& 1\\ \vdots& \vdots& \ddots& \vdots& \vdots\\ x_{m1}& x_{m2}& \cdots& x_{md}& 1\\ \end{matrix} \right] =\left[ \begin{matrix}{l} x_{1}^{T}& 1\\ x_{2}^{T}& 1\\ \vdots& \vdots\\ x_{m}^{T}& 1\\ \end{matrix} \right] X=⎣⎢⎢⎢⎡​lx11​x21​⋮xm1​​x12​x22​⋮xm2​​⋯⋯⋱⋯​x1d​x2d​⋮xmd​​11⋮1​⎦⎥⎥⎥⎤​=⎣⎢⎢⎢⎡​lx1T​x2T​⋮xmT​​11⋮1​⎦⎥⎥⎥⎤​
当XTXX^TXXTX为满秩矩阵的时候或者为正定矩阵的时候令上式为零我们可以很快速的求得参数。w^∗=(XTX)−1XTy\hat{w}^*=\left( X^TX \right) ^{-1}X^Ty w^∗=(XTX)−1XTy
这里我们可以很快的求得多元线性回归模型为:f(x^i)=x^iT(XTX)−1XTyf\left( \hat{x}_i \right) =\hat{x}_{i}^{T}\left( X^TX \right) ^{-1}X^Ty f(x^i​)=x^iT​(XTX)−1XTy然而现实中XTXX^TXXTX往往不是满秩矩阵,例如很多任务中我们会遇到大量的变量,其数目超过了样例数,导致XXX的列数多于行数,XTXX^TXXTX显然不是满秩矩阵此时有多个w^\hat{w}w^,它们都能够是均方差最小化,这里将引入正则化(regularization)项。这里将先不论述正则化,待以后再写一篇正则化的博客。

下面我们根据上述的要求来进行编程实现。

按照最小二乘法进行处理

from numpy import mat
#先将训练集x数据导出来做成矩阵的形式
x_train_dataset=train_dataset[:,0]
#将一维数组转换为矩阵
x_train_dataset=mat(x_train_dataset).reshape(300,1)
a = np.ones(300)
x_train_dataset=np.column_stack((x_train_dataset,a))
#print(x_train_dataset)
print(x_train_dataset.shape)#将训练集y数据导出来
y_train_dataset=train_dataset[:,1]
y_train_dataset=mat(y_train_dataset).reshape(300,1)
#print(y_train_dataset.shape)
#print(y_train_dataset)#将训练集x进行转置
xt_train_dataset=np.transpose(x_train_dataset)
print(xt_train_dataset.shape)
#print(xt_train_dataset)
(300, 2)
(2, 300)
# 利用公式求参数w
w_predict = np.matmul(xt_train_dataset,x_train_dataset)
#print(w_predict)
w_predict = np.linalg.inv(w_predict)
#print(w_predict)
w_predict = np.matmul(w_predict,xt_train_dataset )
w_predict = np.matmul(w_predict,y_train_dataset )
print(w_predict)
[[0.94732599][0.62680273]]

我们已经计算出参数,现在利用matplotlib将其可视化(散点图和直线图)

#重新读取数据
x_train_dataset=train_dataset[:,0]
y_train_dataset=train_dataset[:,1]
#画散点图
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x_train_dataset,y_train_dataset,color='red',marker='o',s=1)
ax.plot(x, 0.94732599*x+0.62680273,color='green',ls='-')
#画直线图

上数我们计算出所需要的参数,这里利用测试集去测试所得参数的效果。我们计算出偏差和方差来对此种算法进行评估:

x_test_dataset=test_dataset[:,0]
#print(y_test_dataset)
x_test_dataset=mat(x_test_dataset).reshape(200,1)
#print(y_test_dataset)
y_test_dataset=test_dataset[:,1]
y_test_dataset=mat(y_test_dataset).reshape(200,1)
#print(y_test_dataset)
import math
bias2 = 0
#测试
#bias2=bias2+math.pow((x_test_dataset[1]*0.94732599+0.62680273)-y_test_dataset[1],2)
#print(bias2)
for i in range (0,200):bias2=bias2+math.pow((x_test_dataset[i]*0.94732599+0.62680273)-y_test_dataset[i],2)
print(bias2)
#之前看吴恩达的视频其中讲到要尽量避免用到loop语句,
#下面我将对其进行修正
926.8174513840322

最小二乘法拟合直线(问题i)相关推荐

  1. C++:最小二乘法拟合直线

     原理: 代码: #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp>using names ...

  2. Python实现最小二乘法拟合直线(求斜率截距)

    利用最小二乘法拟合直线,实现了对一系列点拟合出其最接近的直线,并给出公式,包括斜率和截距.并且绘制出最终拟合线. 完整代码如下: # 核心代码,求斜率w,截距b def fit(data_x, dat ...

  3. 最小二乘法拟合直线 C++/OpenCV

    问题: 我们在拥有一系列散列的点(x1,y1),(x2,y2)... (xm,ym),这些点在一条直线附近,通过点拟合直线. 我在工程中是要拟合一系列线段,其实一条线段就对应着两个要拟合的点,算法上稍 ...

  4. 最小二乘法拟合直线簇交点及Ransac拟合

    最小二乘法拟合直线簇交点及Ransac拟合 最小二乘法的实现 Ransac优化 语言环境:Python 直线簇方程: y=p→+v→∗ty=\overrightarrow p+\overrightar ...

  5. opencv学习——最小二乘法拟合直线

    最小二乘法拟合直线 概念:最小二乘法多项式直线拟合,根据给定的点,求出它的函数y=f(x),当然求得准确的函数是不太可能的,但是我们能求出它的近似曲线y=φ(x) 原理 假设有点  , I = 1,2 ...

  6. C++opencv实现最小二乘法拟合直线和平面

    使用opencv中的Mat实现用矩阵的方式根据最小二乘法拟合直线和平面方程,但是好像不能实现拟合斜率无穷大的直线和平面方程,后续再改进吧. 有关于原理部分,有时间再详细写一下. #include &q ...

  7. C++:最小二乘法 拟合直线

    分享给有需要的人,代码质量勿喷. 一.y = k * x + b bool xjLeastSquares::xjFitLineByLeastSquares( std::vector<double ...

  8. matlab直线拟合的程序,MATLAB最小二乘法拟合直线的程序

    最小二乘法拟合直线 程序: function linear_fit %最小二乘法拟合直线clear; clc; prompt={'Name of data file'}; title='Linear_ ...

  9. 最小二乘法拟合直线——MATLAB和Qt-C++实现

    本节Jungle用C++实现最小二乘法拟合平面直线. 1.理论知识 平面直线的通用方程可以表示为 A+Bx-y=0 其中,A是直线的截距,B是直线的斜率.对于测量的二维坐标(x,y),x是精确分布的, ...

  10. python最小二乘法拟合直线

    最小二乘法的推导可参考下面这个博客,推导非常详细. https://my.oschina.net/keyven/blog/526010 首先画一个加入了噪声的散点图,函数是y=0.2x,加入噪声后如下 ...

最新文章

  1. 安全警报:Oracle 2018一月号安全补丁修复由来已久安全漏洞
  2. 15个最佳的 JavaScript 表单验证库
  3. 文科本二计算机类大学排名,全国二本大学排名文科分数线
  4. UVA11270 Tiling Dominoes —— 插头DP
  5. redis连接php
  6. dbc文件c语言解析标准,DBC文件解析CAN信息
  7. doubango TURN Data Indication报文代码
  8. 运算服务器v9型号,V9服务器
  9. 十大著名黑客-----凯文-米特尼克
  10. 数据原理——2、ChIA-PET
  11. Python多项逻辑回归用LogisticRegression识别英文字母数据集letter-recognition.data
  12. [渝粤教育] 西南科技大学 会计电算化 在线考试复习资料2021版
  13. pytorch高版本(如1.7.0)RuntimeError: Legacy autograd function with non-static forward method is deprecate
  14. C++线程编程-设计无锁的并发数据结构
  15. 耐压测试仪结构组成部分
  16. mysql 人名_jsp为什么按人名查询mysql结果不显示在页面上?可以
  17. php configure 报错 error: xml2-config not found. Please check your libxml2 installation
  18. 为什么需要虚继承,虚继承的实现原理
  19. JAVA程序员如何快速写一个QQ机器人?
  20. ArcGIS 通过 Excel 发布要素服务教程

热门文章

  1. 计算机组成原理实验扩展RCL指令,计算机组成原理实验五扩展指令设计.doc
  2. 微信小程序自定义搜索标题栏
  3. 若用8位机器码表示二进制数-111
  4. The Cisco Systems,Inc. Service has not been started. Please start this service and try again.
  5. 计算机应用技术目标地域分析100字,【计算机应用论文】威客模式计算机应用论文(共3100字)...
  6. Heritrix在Windows下的运行和简单任务设置
  7. mysql中去除富文本字段中的html标签
  8. FTP mget命令
  9. html---学习之路(form表单的基本属性)
  10. 关于“过劳死”的法律探讨