百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

scikit-learn广义线性模型之最小二乘法

toyiye 2024-04-27 03:47 17 浏览 0 评论

本系列教程是scikit-learn学习的第一篇,我会根据scikit-learn官网教程和自己的学习经验来进行总结。首先,我会介绍模型的一些基本知识,不会花时间去推导公式,会介绍一下这个模型的适应情况,以及用scikit-learn这个框架来实现这个模型。

一、最小二乘法

还记得高中物理实验课的时候,做实验的时候我们会首先记录一系列的数据,然后根据这些自变量和因变量之间的关系(线性关系)画出直线,而在画直线的时候所采用的方法就是最小二乘法。最小二乘法也叫最小平方法是一种数学的优化算法,它是通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得求得的数据与实际数据之间误差的平方和最小。如果,自变量(x)和因变量(y)是线性组合的话,那么它们一定满足下面的公式

线性模型

其中,w表示系数,可以用一个向量表示为W=(W1,W2......,Wp),在scikit-learn中,用coef_表示。其中W0表示截距,在scikit-learn中用intercept_表示。数据集的实际观测数据和预测数据(估计值)之间的残差平方和最小,公式如下:

残差平方和

其中,Xw表示预测值,y表示实际数据。下面,引用一个维基百科的例子来介绍一下使用最小二乘法的求解过程

最小二乘法例子

通过上面的例子我们可以发现,我们是通过求解最小化误差来求解参数的。然而,我们在实际编程的时候并不会采用这种方式去求解参数,通常都是采用梯度下降算法迭代来使得预测值与实际值之间误差的平方和最小。在使用最小二乘法求解参数的时候有几个地方需要注意:

1、方程组的个数要多于未知数的个数。

2、模型与参数是线性的,参数只能以一次方出现。

3、对数据的噪声干扰之间是零均值同方差的,就是指在测量数据的时候要保证测量误差的平均值为0,而且每一个测量误差之间是不相关的,测量误差与X是不相关的。

二、scikit-learn实现线性模型

1、求解维基百科例子中的参数

from sklearn import linear_model
import matplotlib.pyplot as plt
import numpy as np
if __name__ == "__main__":
 #定义自变量x
 x = np.array([[1],[2],[3],[4]],dtype=np.float32)
 #定义因变量y
 y = np.array([6,5,7,10],dtype=np.float32)
 #加载scikit-learn的线性模型
 linear = linear_model.LinearRegression()
 #通过x和y来建立线性模型
 linear.fit(x,y)
 #查看模型系数β2
 print(linear.coef_) #[ 1.39999998]
 #查看模型的截距β1
 print(linear.intercept_) #3.5000000596

2、scikit-learn官网的例子

http://sklearn.lzjqsdd.com/auto_examples/linear_model/plot_ols.html#example-linear-model-plot-ols-py

score(X, y, sample_weight=None)返回预测的决定系数R^2

R^2 = 1 - u/v,u是一个残差的和squares ((y_true - y_pred) ** 2).sum() ,v是一个平方和squares ((y_true - y_true.mean()) ** 2).sum(),最好的结果是1,它也能为负数,因为这个模型有可能被任意的损坏,一个常量的模型总是能预测一个期望值,在不考虑特征输入的情况,R^2=0。可以通过R^2来判断,预测的值与实际值的均值之间的关系。

from sklearn import linear_model,datasets
import matplotlib.pyplot as plt
import numpy as np
if __name__ == "__main__":
#加载scikit-learn中的数据集
#使用糖尿病人的数据集,一共有十个特征
diabetes = datasets.load_diabetes()
#np.newaxis给列表增加一个轴,就是在加一组[]
'''
print(diabetes.data[0:2,2])
[ 0.06169621 -0.05147406]
print(diabetes.data[0:2,np.newaxis,2])
[[ 0.06169621]
[-0.05147406]]
在给scikit-learn传入数据x的时候,格式要为[[][]...]
'''
# 使用第三个特征,格式化数据x
diabetes_x = diabetes.data[:,np.newaxis,2]
#将数据集分为训练集和测试集,定义自变量
#取diabetes_x中的前19个
diabetes_x_train = diabetes_x[:-20]
#取diabetes_x中从19开始后面所有的x
diabetes_x_test = diabetes_x[-20:]
#定义因变量
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]
#根据因变量和自变量来拟合一个线性回归模型
regr = linear_model.LinearRegression()
#通过训练集来训练模型
regr.fit(diabetes_x_train,diabetes_y_train)
#根据训练好的模型来预测测试数据的结果
predict_test_y = regr.predict(diabetes_x_test)
#计算预测的结果与实际结果之间的平方差的平均值
miss_distance_mean = np.mean((predict_test_y - diabetes_y_test) ** 2)
print("miss_distance_mean:%.2f"%miss_distance_mean)
predict_score = regr.score(diabetes_x_test,diabetes_y_test)
print("predict_score:%.2f"%predict_score)
#绘图
#描点
plt.scatter(diabetes_x_test,diabetes_y_test,color="black")
#绘制预测的直线
plt.plot(diabetes_x_test,predict_test_y,color="blue",linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()

相关推荐

最简单方法!!用python生成动态条形图

最近非常流行动态条形图,在B站等视频网站上,此类视频经常会有上百万的播放量,今天我们通过第三方库:bar_chart_race(0.2版本)来实现动态条形图的生成;生成的效果如图:问题:...

Asterisk通道和ARI接口的通信(aau通道数)

Asterisk通道和ARI详解什么是通道Asterisk中,通道是介于终端和Asterisk自己本身的一个通信媒介。它包含了所有相关信息传递到终端,或者从终端传递到Asterisk服务器端。这些信...

Python GUI-长链转短链(长链接转化成短链接java)

当我们要分享某一个链接给别人,或是要把某个链接放入帖子中时,如果链接太长,则会占用大量空间,而且很不美观。这时候,我们可以结束长链转短链工具进行转换。当然可以直接搜索在线的网站进行转换,但我们可以借此...

Python 的hash 函数(python的hash函数)

今天在看python的hash函数源码的时候,发现针对不同的数据类型python实现了不同的hash函数,今天简单介绍源码中提到的hash函数。(https://github.com/pyth...

8款Python GUI开源框架,谁才是你的菜?

作为Python开发者,你迟早都会用到图形用户界面来开发应用。本文千锋武汉Python培训小编将推荐一些PythonGUI框架,希望对你有所帮助。1、Python的UI开发工具包Kivy...

python适合开发桌面软件吗?(python可不可以开发桌面应用软件)

其实Python/Java/PHP都不适合用来做桌面开发,Java还是有几个比较成熟的产品的,比如大名鼎鼎的Java集成开发环境IntelliJIDEA、Eclipse就是用Java开发的,不过PH...

CryptoChat:一款功能强大的纯Python消息加密安全传输工具

关于CryptoChatCryptoChat是一款功能强大的纯Python消息加密安全传输工具,该工具专为安全研究专家、渗透测试人员和红蓝队专家设计,该工具可以完全保证数据传输中的隐私安全。该工具建立...

为什么都说Python简单,但我觉得难?

Python普遍被大家认为是编程语言中比较简单的一种,但有一位电子信息的学生说自己已经学了C语言,但仍然觉得Python挺难的,感觉有很多疑问,像迭代器、装饰器什么的……所以他提出疑问:Python真...

蓝牙电话-关联FreeSwitch中继SIP账号通过Rest接口

蓝牙电话-关联FreeSwitch中继SIP账号通过Rest接口前言上一篇章《蓝牙电话-与FreeSwitch服务器和UA坐席的通话.docx》中,我们使用开源的B2B-UA当中经典的FreeSWIT...

技术分享|Sip与WebRTC互通-SRProxy开源库讲解

SRProxy介绍目前WebRTC协议跟SIP协议互通场景主要运用在企业呼叫中心、企业内部通信、电话会议(PSTN)、智能门禁等场景,要想让WebRTC与SIP互通,要解决两个层面的...

全网第N篇SIP协议之GB28181注册 JAVA版本

鉴于网上大部分关于SIP注册服务器编写都是C/C++/python,故开此贴,JAVA实现也贴出分享GB28181定义了了基于SIP架构的视频监控互联规范,而对于多数私有协议实现的监控系统...

「linux专栏」top命令用法详解,再也不怕看不懂top了

在linux系统中,我们经常使用到的一个命令就是top,它主要是用来显示系统运行中所有的进程和进程对应资源的使用等信息,所有的用户都可以使用top命令。top命令内容量丰富,可令使用者头疼的是无法全部...

Linux 中借助 perf 对 php 程序模拟CPU高的案例分析

导语本文是一篇Linux借助工具分析CPU高的优化案例,没有任何干货内容,很详细的展示了优化CPU高的具体步骤,非常适合初中级读者阅读!...

centos漏洞处理方法(centos podman)

centos服务器最近有诸多漏洞,修复命令及对应的漏洞整理后,分享给大家RHSA-2020:1176-低危:avahi安全更新yumupdateavahi-libsRHSA-2017:326...

Linux上的free命令详解(Buffer和Cache)

解释一下Linux上free命令的输出。下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。这样可以把free的输出看成一个二维数组FO(FreeOutput)。例如:FO[2][1]...

取消回复欢迎 发表评论:

请填写验证码