当前位置: 首页 > news >正文

实验4 线性回归

实验4 线性回归

【实验目的】掌握正规化法和梯度下降法实现线性回归算法
【实验内容】处理样本,使用梯度下降法和正规化法算法进行函数模型预测
【实验要求】写明实验步骤,必要时补充截图

1.使用正规化方法计算下列样本的预测函数(特征归一化后参数有什么变化)
在这里插入图片描述
在这里插入图片描述

预测函数为:h(x) = 188.40031946 + 0.3866255 * X1 - 56.13824954 * X3 -92.9672536 * X4 - 3.73781915 * X5

2.读取ex1data2.txt中的数据,建立样本集,使用正规化法获取(房屋面积,房间数量)与房屋价格间的预测函数
在这里插入图片描述

预测函数为: h(x)=89597.90954361 + 139.21067402 * X1 - 8738.01911255* X2

3.读取ex1data1.txt中的数据,建立样本集,使用梯度下降法获取公司人数与利润关系的预测函数。并在坐标图中显示预测函数和样本点
在这里插入图片描述

4.读取ex1data2.txt中的数据,建立样本集,使用梯度下降法获取(房屋面积,房间数量)与房屋价格间的预测函数。并在三维坐标图中显示预测函数和样本点
在这里插入图片描述

🐱具体代码

1.使用正规化方法计算下列样本的预测函数(特征归一化后参数有什么变化)

在这里插入图片描述

import numpy as np # 导入 NumPy 库
X = np.array([  [1, 2104, 5, 1, 45],    [1, 1416, 3, 2, 40],   [1, 1534, 3, 2, 30],   [1, 852, 2, 1, 36]     
]) 
y = np.array([460,232,315,178])
theta=np.linalg.pinv(X.T@X)@X.T@y #求theta公式
theta
#X 是特征矩阵,y 是目标变量向量
#使用正规化方法来解决线性回归问题
#首先计算 X 的转置与自身的乘积(X.T@X),
#然后计算这个乘积的伪逆,并与 X 的转置和目标向量 y 的乘积相乘,
#从而得到参数向量 theta

2.读取ex1data2.txt中的数据,建立样本集,使用正规化法获取(房屋面积,房间数量)与房屋价格间的预测函数

import pandas as pd # 导入 pandas 库
import numpy as np # 导入 numpy 库
# 1.读取数据,建立样本集
path = 'ex1data2.txt'
data2 = pd.read_csv(path,names=['Size','Bedrooms','Price'])
data2.head()
# 2.设置 x y
# 获取设置数据
clos = data2.shape[1]
# 添加偏置项到特征矩阵 X 中 
# 提取 0-倒数第二列 数据
X = np.hstack([np.ones((data2.shape[0], 1)), data2.iloc[:,:-1].values])
y = data2.iloc[:,-1].values # 提取 最后一列 数据
# 3.计算theta
theta = np.linalg.pinv(X.T@X)@X.T@y
theta

3.读取ex1data1.txt中的数据,建立样本集,使用梯度下降法获取公司人数与利润关系的预测函数。并在坐标图中显示预测函数和样本点

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 1.导入数据并产生训练集
#导入数据,并查看
path =  'ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])  data.head()
data.describe()#数据可视化
data.plot(kind='scatter', x='Population', y='Profit', figsize=(8,5))
plt.show()
# 2.设置x、y
#训练集中添加一列1
data.insert(0, 'Ones', 1)
#获取训练集数据
X = data.iloc[:, :-1].values
#X = data.iloc[:, :-1].as_matrix()
y = data.iloc[:, -1].values
#y = data.iloc[:, -1].as_matrix()
theta = np.zeros(X.shape[1])#检查维度
X.shape, theta.shape, y.shape #期待输出(97, 2), (2,), (97,)
# 3、开始计算
temp=np.zeros((1000,X.shape[1]))
temp.shape
# 4、显示预测函数
fig, ax = plt.subplots(figsize=(6,4))
x = np.linspace(data.Population.min(), data.Population.max(), 100) #设置直线x坐标的数据集
y=theta[0]+theta[1]*x  #设置直线y坐标的数据集
ax.plot(x, y, 'r', label='Prediction')   #画直线
ax.scatter(data.Population, data.Profit, label='Traning Data')  #画点,前两个参数是点的x和y坐标的数据集
ax.legend(loc=2)    #点和线的图例,2表示在左上角。不写这句的话图例出现不了
ax.set_xlabel('Population')   #接下来设置坐标轴名称和图题
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

4.读取ex1data2.txt中的数据,建立样本集,使用梯度下降法获取(房屋面积,房间数量)与房屋价格间的预测函数。并在三维坐标图中显示预测函数和样本点

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 1.读入数据
path = 'ex1data2.txt'
data2 = pd.read_csv(path, names=['Size', 'Bedrooms', 'Price'])
data2.head()
# 2、归一化
#特征归一化(为了使梯度下降得更方便)
data2 = (data2 - data2.mean()) / data2.std()# 检查 'Ones' 列是否存在,如果存在则删除  
if 'Ones' in data2.columns:  data2.drop('Ones', axis=1, inplace=True)  data2.insert(0, 'Ones', 1)
data2.head()
# 3、分开x、y
#获取设置数据
cols = data2.shape[1]
X = data2.iloc[:, :-1].values#提取0-倒数第二列数据
y = data2.iloc[:, -1].values #提取最后一列数据
theta=np.zeros(X.shape[1])
X.shape, y.shape, theta.shape
# 4、计算theta
#定义梯度下降函数
def gradient(X,y,theta):m=len(y)for i in range(1000):theta=theta-(0.01/m)*X.T@(X@theta-y)# X@theta=np.dot(X, theta)  theta=theta-(0.01/97)*X.T@(X@theta-y)return theta
#计算最终theta值
theta=gradient(X,y,theta)
theta
# 5、显示
%matplotlib auto
import matplotlib.pyplot as mp
from mpl_toolkits.mplot3d import axes3d
x = data2.iloc[:, 1].values
y = data2.iloc[:, 2].values
z = data2.iloc[:, -1].values
fig=plt.figure()# 生成画布
ax = fig.add_subplot(111, projection="3d")# 画三维散点图
ax.scatter(x, y, z,s=100, marker=".")# 设置坐标轴图标
ax.set_xlabel("Size")
ax.set_ylabel("Room Number")
ax.set_zlabel("Price")# 设置坐标轴范围
ax.set_xlim(-3, 3)
ax.set_ylim(-3, 3)
ax.set_zlim(-3, 3)#画3维函数
n = 300
x, y = np.meshgrid(np.linspace(-3, 3, n),np.linspace(-3, 3, n))
z = theta[0]+theta[1]*x+theta[2]*y
# ax = mp.gca(projection='3d')
ax.plot_wireframe(x, y, z, rstride=30,cstride=30, linewidth=0.5,color='orangered')
mp.show()

http://www.mrgr.cn/news/57116.html

相关文章:

  • 【蚂蚁面试】Springcloud 核心组件的底层原理,你知道多少?
  • 地图导航平台怎么标注店铺定位?
  • 代码工艺:写代码的好习惯
  • MySQL 回收表碎片实践教程
  • Leetcode - 周赛419
  • 【网络协议栈】Tcp协议(上)结构的解析 和 Tcp中的滑动窗口(32位确认序号、32位序号、4位首部长度、6位标记位、16为窗口大小、16位紧急指针)
  • 基于FFT + CNN -Transformer时域、频域特征融合的电能质量扰动识别模型
  • NotesGPT:开源 AI 语音笔记工具,实现自动多语言转录、总结和任务生成
  • 基于ADC方法的系统效能评估代码实现
  • solidworks许可证将于30天过期或者提示产品激活
  • 【vue】树的初始化展开
  • AD如何制作原理图的模版、原理图模板绘制修改以及如何导入原理图模版
  • MySQL 索引
  • Linux下的基本指令
  • 隐式类型转换
  • 借助keras的层知识理解理解神经网络层的构成相关概念
  • SchoolWeb1--基于课堂教学所汲取的知识点1
  • 【python】ord() chr()
  • 基于Java+Springboot+Vue开发的旅游景区管理系统
  • MySQL-日志
  • Android Studio Gradle版本、插件以及Android API对应关系(持续更新)
  • faiss向量数据库实现rag
  • 搭建知识库:快消行业中知识管理的重要性
  • 奖金居然高达十几万美金!最大素数到底有啥用?
  • RTOS之队列
  • 看完这篇,轻松搞定JavaScript复杂的问题