程序所用文件:https://files.cnblogs.com/files/henuliulei/%E5%9B%9E%E5%BD%92%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE.zip

标准方程法

标准方程法是求取参数的另一种方法,不需要像梯度下降法一样进行迭代,可以直接进行结果求取

那么参数W如何求,下面是具体的推导过程

因此参数W可以根据最后一个式子直接求取,但是我们知道,矩阵如果线性相关,那么就无法取逆,如下图

因此,对比梯度下降法和标准方程法我们可以得到下面的图

下面的demo是标准方程法实现拟合

import numpy as np
from matplotlib import pyplot as plt
from numpy import genfromtxt
#载入数据
data = genfromtxt('data.csv',delimiter=',')
x_data = data[:,,np.newaxis]#一维变为二维
y_data = data[:,,np.newaxis]
plt.scatter(x_data,y_data)
plt.show()
print(np.mat(x_data).shape)
print(np.mat(y_data).shape)
#给样本添加偏置项
X_data = np.concatenate((np.ones((,)),x_data),axis=)
print(X_data.shape)
#标准方程法求解回归参数
def weights(xArr, yArr):
xMat = np.mat(xArr)#array变为mat,方便进行矩阵运算
yMat = np.mat(yArr)
xTx = xMat.T * xMat
if np.linalg.det(xTx) == 0.0: #一、np.linalg.det():矩阵求行列式二、np.linalg.inv():矩阵求逆三、np.linalg.norm():求范数
print("该矩阵不可逆")
return
ws = xTx.I * xMat.T * yMat
return ws
ws = weights(X_data,y_data)
print(ws[].shape)
#画图
x_test = np.array([[], []])
print(x_test.shape)
y_test = ws[] + x_test * ws[]
plt.plot(x_data, y_data, 'b.')
plt.plot(x_test, y_test, 'r')
plt.show()

捎带一下两个小的知识点

数据归一化

由于单位的原因,不同单位之间数据产别太大,影响数据分析,所以我们一般会对某些数据进行归一化,即把数据归一化到某个范围之内。

交叉验证

当样本数据比较小的时候,为了避免验证集“浪费”太多的训练数据,采用样本交叉验证的方法,并把平均值作为结果

过拟合,欠拟合,正确拟合

过拟合会导致训练集拟合效果好,测试集效果差,欠拟合都差。为防止过拟合

正则化就是在原来的损失函数基础上加入一项,来减少高次项的值,使得曲线平滑

岭回归

为解决标准方程法中存在的矩阵不可逆问题,引入了岭回归

 import  numpy as np
from matplotlib import pyplot as plt
from sklearn import linear_model
#读取数据
data = np.genfromtxt("longley.csv", delimiter=',')
print(data)
#切分数据
x_data = data[:,:]
y_data = data[:,]
#创建模型
#生成0.001到1的五十个岭系数值
alphas_to_test = np.linspace(0.001, )#从0.001到1共五十个数据,默认在start和end之间有50个数据,这五十个数据是假设的岭系数
model = linear_model.RidgeCV(alphas= alphas_to_test, store_cv_values= True)#store_cv_values表示存储每个岭系数和样本对应下的损失值
model.fit(x_data, y_data)
print(model.alpha_)#最小损失函数对应的岭系数
print(model.cv_values_.shape)#*50的矩阵
#绘图
#岭系数和loss值得关系
plt.plot(alphas_to_test, model.cv_values_.mean(axis = ))# 求在每个系数下对应的平均损失函数,axis=1表示横轴,方向从左到右;0表示纵轴,方向从上到下
plt.plot(model.alpha_, min(model.cv_values_.mean(axis = )),'ro')#最优点
plt.show()
model.predict(x_data[,np.newaxis])#对一个样本进行预测

岭系数和损失函数对应的关系图

简单说一下arange,range,linspace的区别,arange和range都是在start和end之间以step作为等差数列对应的数组,只不过arange的step

可以是小数,而range必须为整数,而且arange属于numpy,linspace则是在start和end之间取num个数 np.linspace(start,end,num)

LASSO算法

由于岭回归计算得到的系数很难为0,而Lasso算法可以使一些指标为0

从上图可以看出,LASSo在入系数某个取值下某些特征的系数就归为0了

交点处变为最优取值处

 import  numpy as np
from matplotlib import pyplot as plt
from sklearn import linear_model
#读取数据
data = np.genfromtxt("longley.csv", delimiter=',')
print(data)
#切分数据
x_data = data[:,:]
y_data = data[:,]
#创建模型
model = linear_model.LassoCV()
model.fit(x_data,y_data)
#lasso系数
print(model.alpha_)
#相关系数,发现某些系数为零,说明这些系数权重比较小,可以忽视
print(model.coef_)#[0.10206856 0.00409161 0.00354815 . . . ]
#验证
model.predict(x_data[-,np.newaxis])

弹性网

对lasso和岭系数方法综合起来

 import  numpy as np
from matplotlib import pyplot as plt
from sklearn import linear_model
#读取数据
data = np.genfromtxt("longley.csv", delimiter=',')
print(data)
#切分数据
x_data = data[:,:]
y_data = data[:,]
#创建模型
model = linear_model.ElasticNetCV()
model.fit(x_data,y_data)
#lasso系数
print(model.alpha_)
#相关系数,发现某些系数为零,说明这些系数权重比较小,可以忽视
print(model.coef_)#[0.10206856 0.00409161 0.00354815 . . . ]
#验证
print(model.predict(x_data[-,np.newaxis]))

无偏估计和有偏估计

标准方程法_岭回归_LASSO算法_弹性网的更多相关文章

  1. 『算法设计_伪代码』贪心算法_最短路径Dijkstra算法

    Dijkstra算法实际上是一个贪婪算法(Greedy algorithm).因为该算法总是试图优先访问每一步循环中距离起始点最近的下一个结点.Dijkstra算法的过程如下图所示. 初始化 给定图中 ...

  2. Dijkstra算法_北京地铁换乘_android实现-附带源码.apk

    Dijkstra算法_北京地铁换乘_android实现   android 2.2+ 源码下载    apk下载 直接上图片 如下: Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计 ...

  3. cb51a_c++_STL_算法_根据第n个元素排序nth_element

    cb51a_c++_STL_算法_根据第n个元素排序nth_elementnth_element(b,n,e),比如最大的5个数排序,或者最小的几个数nth_element(b,n,e,p)对比:pa ...

  4. cb50a_c++_STL_算法_局部排序partial_sort

    cb50a_c++_STL_算法_局部排序partial_sort partial_sort(b,se,e)排序一部分,begin,source end,endcout << " ...

  5. cb49a_c++_STL_算法_对所有元素排序_sort_stable_sort

    cb49a_c++_STL_算法_对所有元素排序_sort_stable_sort sort(b,e) sort(b,e,p) stable_sort(b,e) stable_sort(b,e,p) ...

  6. cb48a_c++_STL_算法_重排和分区random_shuffle_stable_partition

    cb48a_c++_STL_算法_重排和分区random_shuffle_stable_partition random_shuffle()//重排,随机重排,打乱顺序 partition()分区,把 ...

  7. cb47a_c++_STL_算法_排列组合next_prev_permutation

    cb47a_c++_STL_算法_排列组合next_prev_permutation 使用前必须先排序.必须是 1,2,3或者3,2,1.否者结果不准确.如果, 1,2,4,6.这样数据不会准确nex ...

  8. cb46a_c++_STL_算法_逆转和旋转reverse_rotate函数advance

    cb46a_c++_STL_算法_逆转和旋转reverse_rotateSTL算法--变序性算法reverse() 逆转reverse_copy()一边复制一般逆转rotate()旋转,某个位置开始前 ...

  9. cb45a_c++_STL_算法_删除_(3)_unique(唯一的意思)删除连续性的重复的数据

    cb45a_c++_STL_算法_删除_(3)_unique(唯一的意思)删除连续性的重复的数据unique(b,e),删除连续性的,删除重复的数据,比如如果有两个连续的5,5,则留下一个.uniqu ...

随机推荐

  1. 获取从天气预报接口返回回来的json数据

    搬迁到了我的新博客中 ==> http://www.suanliutudousi.com/2017/08/26/%E8%8E%B7%E5%8F%96%E4%BB%8E%E5%A4%A9%E6%B ...

  2. Reading books /// Prim+BFS oj21633

    题目大意: 输入 N,M 接下来1-N行输入读该书的用时time[i] 接下来1-M行输入a,b  表示a和b是similar的 若a读过则读b用时为 time[b]/2 ,若b读过则读a用时为 ti ...

  3. c# 编写windows 服务,并制作安装包

    对服务的认识有很多个阶段. 第一阶段:当时还在用c++,知道在一个进程里while(True){},然后里面做很多很多事情,这就叫做服务了,界面可能当时还用Console控制台程序. 第二阶段:知道了 ...

  4. shell 脚本 变量使用,取消一个变量,echo

    1. 用户自定义变量,直接使用,赋值的时候等号两边不能有空格 A=100 echo "\$A = $A" # $是取变量A 中的值 "" 号中 \$ 是转译,此 ...

  5. 我也可以独立(引用JS外部文件)

    我也可以独立(引用JS外部文件) 通过前面知识学习,我们知道使用<script>标签在HTML文件中添加JavaScript代码,如图: JavaScript代码只能写在HTML文件中吗? ...

  6. js实现F5键刷新后菜单保持之前状态以及监听F5页面刷新子iframe 而父页面不刷新

    利用layui实现菜单效果时,刷新页面仍回到首页状态,需要 实现iframe子页面刷新父元素不刷新,下面是代码 //刷新时禁用F5的默认事件 $(document).keydown(function ...

  7. Python 读取本地*.txt文件 替换 内容 并保存

    # r    以只读的方式打开文件,文件的描述符放在文件的开头# w    打开一个文件只用于写入,如果该文件已经存在会覆盖,如果不存在则创建新文件 #路径path = r"D:\pytho ...

  8. 【JZOJ6353】给(ca)

    description analysis 很妙的\(DP\) 设\(f[i][j]\)表示已经放了\(i\)个叶子节点.根到当前节点走了\(j\)步向左的方案数 考虑调整\(DP\)方式,钦定伸出左儿 ...

  9. Kunbernetes从私有仓库nexus拉取镜像

    1.docker登陆认证 [root@master ~]# vim /etc/docker/daemon.json { "insecure-registries": [" ...

  10. (转)Android中px与dip,sp与dip等的转换工具类

    功能 通常在代码中设置组件或文字大小只能用px,通过这个工具类我们可以把dip(dp)或sp为单位的值转换为以px为单位的值而保证大小不变.方法中的参数请参考http://www.cnblogs.co ...