线性回归-最小二乘python实现
import numpy as np
import pandas as pd
波士顿房价数据集字段说明
- CRIM:房屋所在镇的犯罪率
- ZN:面积大于25000平方英尺住宅所占的比例
- INDUS :房屋所在镇非零售区域所占比例
- CHAS:房屋是否位于河边 若位于河边,值为1,否则为0
- NOX:一氧化氮的浓度
- RM:平均房间的数量
- AGE:1940年前建成房屋所占比例
- DIS:房屋距离波斯顿五大就业中心的加权距离
- RAD:距离房屋最近的公路
- TAX:财产税额度
- PIRATIO:房屋所在镇师生比例
- B:计算公式(房屋所在镇非美籍人口所占比例):1000*(房屋所在镇非美籍人口所占比例-0.63)**2
- LSTAT:弱势群体人口所占比例
- MEDV:房间的平均价格
data=pd.read_csv(r"F:\数据集\dataset\boston.csv")
#data
#查看数据的基本信息,同时也可以用来查看,各个特征列是否存在缺失值
data.info()
#查看是否有重复值
data.duplicated().any()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 506 entries, 0 to 505
Data columns (total 15 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 Unnamed: 0 506 non-null int64 1 crim 506 non-null float642 zn 506 non-null float643 indus 506 non-null float644 chas 506 non-null int64 5 nox 506 non-null float646 rm 506 non-null float647 age 506 non-null float648 dis 506 non-null float649 rad 506 non-null int64 10 tax 506 non-null int64 11 ptratio 506 non-null float6412 black 506 non-null float6413 lstat 506 non-null float6414 medv 506 non-null float64
dtypes: float64(11), int64(4)
memory usage: 59.4 KBFalse
定义线性回归类
- 利用正规方程解出向量θ\thetaθ:
θ=(XTX)−1XTY\theta=(X^{T}X)^{-1}X^{T}Yθ=(XTX)−1XTY
class linearRegression:"""使用python实现的线性回归。(最小二乘法)"""def fit(self,X,y):"""根据提供的训练数据X ,对模型进行训练。Parameters:_________X:类数组类型。形状:[样本数量,特征数量]特征矩阵,用来对模型进行训练。y: 类数组类型,形状:[样本数量]"""# 将X转换成矩阵格式,注意:这里的X必须是一个完整的数组格式,不能是数组的一部分。所以这里用到X.copy()#说明:如果X是数组对象的一部分,而不是完整的对象数据(例如,X是其他对象通过切片传递过来),这是则无法完成矩阵的转换 #这里创建X的拷贝对象,避免转换矩阵的时候失败X=np.asmatrix(X.copy())# y 是一维结构(行向量或列向量),对于一维结构可以不用进行拷贝#注意:我们现在需要进行矩阵的计算,因此需要二维的结构,我们通过reshape方法进行转换#reshape(-1,1)表示根据实际情况转换成多少行(-1),一列。y=np.asmatrix(y).reshape(-1,1)#通过最小二乘公式求戒除最佳的权重值self.w_=(X.T*X).I*X.T*ydef predict(self,X):"""根据参数传递的样本X,对样本数据进行预测。Parameters:___________X:类数组类型。形状:[样本数量,特征数量]待预测的样本特征(属性)Returns:________result:数组类型预测的结果"""#将X转换成矩阵,注意,需要对X进行拷贝(理由同上)X=np.asmatrix(X.copy())result=X*self.w_#result是一个矩阵,且是二维的,所以将result转化为ndarray数组,进行扁平化(result.ravel())处理,然后返回结果#使用ravel()可以将数组进行扁平化处理return np.array(result).ravel()
不考虑截距的情况
#不考虑截距的情况
t=data.sample(len(data),random_state=0)
train_X=t.iloc[:400,:-1]
train_y=t.iloc[:400,-1]
test_X=t.iloc[400:,:-1]
test_y=t.iloc[400:,-1]
lr=linearRegression()
lr.fit(train_X,train_y)
result=lr.predict(test_X)
display(np.mean((result-test_y)**2))
#查看模型的权重值
display(lr.w_)
16.892575069960635matrix([[-2.25548227e-03],[-9.36187378e-02],[ 4.57218914e-02],[ 3.67703558e-03],[ 2.43746753e+00],[-2.96521997e+00],[ 5.61875896e+00],[-4.94763610e-03],[-8.73950002e-01],[ 2.49282064e-01],[-1.14626177e-02],[-2.50045098e-01],[ 1.49996195e-02],[-4.56440342e-01]])
考虑截距的情况
#考虑截距:增加一列,使该列的所有值都是1
t=data.sample(len(data),random_state=0)
#可以这样增加一列
#t["intercept"]=1,这是在最右边增加intercept列,且该列所有值都取1
#按照习惯,截距作为w0,我们为之而配上一个x0,x0列放在最前面
#t.columns 返回所有列的信息;insert(0,"Intercept"):将Intercept增加到第一列
new_columns=t.columns.insert(0,"Intercept")
#重新安排列的信息,如果值为空,则使用fail_value参数指定的值进行填充
t=t.reindex(columns=new_columns,fill_value=1)
#t
t=data.sample(len(data),random_state=0)
train_X=t.iloc[:400,:-1]
train_y=t.iloc[:400,-1]
test_X=t.iloc[400:,:-1]
test_y=t.iloc[400:,-1]
lr=linearRegression()
lr.fit(train_X,train_y)
result=lr.predict(test_X)
#不知为何lr.w_的值为“nan”
display(np.mean((result-test_y)**2))
#display(lr.w_)
16.892575069960635
可视化
import matplotlib as mpl
import matplotlib.pyplot as plt
#设置字体为黑体,以支持中文显示
mpl.rcParams["font.family"]="SimHei"
#设置在中文字体是,能正常显示负号(-)
mpl.rcParams["axes.unicode_minus"]=False
plt.figure(figsize=(10,10))
#绘制预测值
plt.plot(result,"ro-",label="预测值")
#绘制真实值
plt.plot(test_y.values,"go--",label="真实值")
plt.title("线性回归预测——最小二乘法")
plt.xlabel("样本序号")
plt.ylabel("房价")
plt.legend()
plt.show()
线性回归-最小二乘python实现相关推荐
- python做线性回归统计推断提取参数_线性回归及其Python实现(最大似然法)
线性回归及其Python实现(最大似然法) 标签: Python 机器学习 本节内容总结于博主在牛客网机器学习特训营的笔记 参考资料:<机器学习实战> 目录 1.什么是线性回归(Linea ...
- 十、简单线性回归的python实现(详解)
4. 简单线性回归的python实现 点击标题即可获取源代码和笔记 4.1 导入相关包 import numpy as np import pandas as pd import random imp ...
- [转载] 多元线性回归 及其Python实现
参考链接: 线性回归(Python实现) 多元线性回归 Python实现 多元线性回归求解过程 多元线性回归的形式: 目标函数: 将一个样本的向量化: 将所有样本的向量化: 向量化后的目标函数及 ...
- python一元线性回归绘制_简单一元线性回归实现python
简单一元线性回归实现python 简单一元线性回归实现python 简单一元线性回归实现python #线性回归梯度下降 import numpy as np import pandas as pd ...
- sklearn实现一元线性回归 【Python机器学习系列(五)】
sklearn实现一元线性回归 [Python机器学习系列(五)] 文章目录 1.获取数据 2.线性回归模型 大家好,我是侯小啾! 本期blog分享的内容是通过sklearn库实现一元线性回归.相比 ...
- 线性回归-最小二乘方法代码实现
线性回归-最小二乘方法 使用最小二乘的方法进行原始的计算方式编写 先把该导入的包全部导入了 # 首先需要导入对应的包 import pandas as pd # 数据处理 import numpy a ...
- 一元线性回归的Python编程实现
这篇文章主要是为了实现周志华老师的机器学习书涉及的:单变量的线性回归,即一元线性回归的Python编程实现. 代码如下: # -*- coding: cp936 -*- from numpy impo ...
- python建立回归模型_简单线性回归的Python建模方法
简单线性回归,就是两个随机变量存在一定大小的相关系数的前提下,结合散点图观察,采用最小二乘OLS方法,尝试建立一条回归直线,使得误差平方和SSE最小.OLS是一种参数方法,通过确定直线的斜率b和截距a ...
- 机器学习之线性回归(python)
目录 一.基本概念 二.概念的数学形式表达 三.确定w和b 1.读取或输入数据 2.归一化.标准化 2.1 均值 2.2 归一化 2.3 标准化 3.求解w和b 1.直接解方程 2.最小二乘法(lea ...
最新文章
- PHP和Javascript实现转换文件大小为人性化可读方式
- 游戏人物标记——腾讯笔试
- js ajax java传参_ajax参数传递与后台接收
- Linux 中 ctime,mtime,atime 的区别
- 修改Linux内核的启动Logo和禁用启动光标
- leetcode 1170 python
- CAS4搭建HTTP环境
- 映美精相机的数据流转成MAT
- numpy.dot()和x.dot(y)函数介绍和示例
- word 技巧 - 删除指定页页眉
- UE4 碰撞射线检测
- 墨画子卿第一章第1节
- 学而思python小学生课程_幼升小之路(26) 学而思测评
- 串口通信那些事儿:通信电平转换电路
- 三十六计解释及快速记忆
- String字符串的相关语法及JPI
- OCSP在线证书状态协议内容描述
- weblogic11g 后台无需密码启动设置
- 房屋安全鉴定报告的有效期及两种鉴定类型
- 【Tensorflow+Keras】tf.keras.layers.LSTM的解析与使用