一、实验目的
(1)探究自变量与因变量之间的线性关系。
(2)通过数据拟合,找到最佳线性模型以预测因变量的值。
二、实验内容
(1)收集自变量和因变量的对应数据。
(2)利用线性回归算法建立回归模型。
(3)求解模型参数,得到线性回归方程。
(4)利用回归方程进行预测,并评估模型的准确性。
三、实验要求
(1)数据准备:收集自变量和因变量的观测数据,确保数据的准确性和完整性。
(2)数据探索:对数据进行初步的探索性分析,了解数据的分布、特征之间的关系等,以便后续建模。
(3)模型假设检验:验证数据是否满足线性回归的基本假设,包括线性关系、独立性、正态性、方差齐性等。
(4)模型建立:根据研究问题和数据特点,建立线性回归模型,明确自变量和因变量的关系。
(5)参数估计:利用最小二乘法或其他优化算法,对模型的参数(如斜率、截距)进行估计。
(6)模型诊断:通过残差分析等方法,评估模型的拟合优度,检查模型假设是否满足,确保模型的稳定性和可靠性。
四、实验过程及结果
1.线性回归的具体步骤:
1)数据准备:收集自变量和因变量的数据,确保数据的准确性和完整性。
2)数据探索与预处理:通过绘制散点图、计算统计量等方式探索数据分布和特征;处理缺失值、异常值等,确保数据质量。
3)模型建立:根据研究目的和数据特点,选择合适的线性回归模型(单变量或多变量)。
4)参数估计:使用最小二乘法或其他优化算法估计线性回归模型的参数(如斜率、截距)。
5)模型诊断:评估模型的拟合优度(如R²值)、进行残差分析、共线性检验等,确保模型的有效性和稳定性。
2.实验代码及结果展示:
单变量线性回归:
import numpy as np #导入numpy库
import pandas as pd #导入pandas库
import matplotlib.pyplot as plt #导入画图库
path = 'ex1data1.txt' #数据
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])
#利用pandas库中的read_csv函数读取ex1data1.txt中的数据
data.head() #展示数据的前五行
data.describe()#统计数据的合计、平均值、标准差、最大值、最小值等展示出来
data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))
#绘制散点图并展示
plt.show()
def computeCost(X, y, theta): #使用梯度下降来实现线性回归
inner = np.power(((X * theta.T) - y), 2)
return np.sum(inner) / (2 * len(X))
data.insert(0, 'Ones', 1) #在数据集中添加一列
cols = data.shape[1] #进行变量初始化
X = data.iloc[:,0:cols-1]#X是所有行,去掉最后一列
y = data.iloc[:,cols-1:cols]#X是所有行,最后一列
X.head() #head()是观察前5行
y.head() #展示前五行
X = np.matrix(X.values) #转换X为Numpy矩阵
y = np.matrix(y.values) #转换y为Numpy矩阵
theta = np.matrix(np.array([0,0])) #初始化theta
theta
X.shape, theta.shape, y.shape #查看theta的形状
computeCost(X, y, theta) #计算代价函数
def gradientDescent(X, y, theta, alpha, iters): #批量梯度下降
temp = np.matrix(np.zeros(theta.shape))
parameters = int(theta.ravel().shape[1])
cost = np.zeros(iters)
for i in range(iters):
error = (X * theta.T) - y
for j in range(parameters):
term = np.multiply(error, X[:,j])
temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))
theta = temp
cost[i] = computeCost(X, y, theta)
return theta, cost
alpha = 0.01 #初始化学习率
iters = 1000 #初始化迭代次数
g, cost = gradientDescent(X, y, theta, alpha, iters) #运行梯度下降法
g
computeCost(X, y, g) #使用拟合的参数计算训练模型的代价函数
#横坐标
x = np.linspace(data.Population.min(), data.Population.max(), 100)
#绘制线性模型
f = g[0, 0] + (g[0, 1] * x) #纵坐标
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction')
#绘制散点图
ax.scatter(data.Population, data.Profit, label='Traning Data')
ax.legend(loc=2) #设置图例,表示在左上角
ax.set_xlabel('Population') #添加x轴标签
ax.set_ylabel('Profit') #添加y轴标签
ax.set_title('Predicted Profit vs. Population Size') #添加标题
plt.show() #展示图形
fig, ax = plt.subplots(figsize=(12,8))
#np.arange返回等差数组
ax.plot(np.arange(iters), cost, 'r') #绘制折线图,折线颜色设置为红色
ax.set_xlabel('Iterations') #添加x轴标签
ax.set_ylabel('Cost') #添加y轴标签
ax.set_title('Error vs. Training Epoch') #添加标题
plt.show() #展示图形
多变量线性回归:
path = 'ex1data2.txt' #数据
data2=pd.read_csv(path,header=None,names=['Size','Bedrooms','Price'])
#用pandas库中的read_csv函数读取数据
data2.head() #展示数据前五行
data2 = (data2 - data2.mean()) / data2.std() #预处理-特征归一化
data2.head() #展示处理过的数据的前五行
# add ones column
#预处理数据
data2.insert(0, 'Ones', 1) #在数据集中添加一列
# set X (training data) and y (target variable)
cols = data2.shape[1] #进行变量初始化
X2 = data2.iloc[:,0:cols-1] #X是所有行,去掉最后一列
y2 = data2.iloc[:,cols-1:cols] #X是所有行,最后一列
# convert to matrices and initialize theta
X2 = np.matrix(X2.values) #将X2转换为numpy矩阵
y2 = np.matrix(y2.values) #将y2转换为numpy矩阵
theta2 = np.matrix(np.array([0,0,0])) #初始化theta2
# perform linear regression on the data set
g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters)
# get the cost (error) of the model
computeCost(X2, y2, g2) #计算代价函数
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iters), cost2, 'r') #绘制折线图,折线颜色为红色
ax.set_xlabel('Iterations') #设置x轴标签
ax.set_ylabel('Cost') #设置y轴标签
ax.set_title('Error vs. Training Epoch') #设置标题
plt.show() #展示图形
from sklearn import linear_model #导入sklearn库中的linear_model模块
model = linear_model.LinearRegression()
model.fit(X, y) #训练模型
#LinearRegression()
#scikit-learn model的预测表现
x = np.array(X[:, 1].A1)
f = model.predict(X).flatten() #扁平化数据
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction') #绘制折线图且折线颜色为红色
#绘制散点图
ax.scatter(data.Population, data.Profit, label='Traning Data')
ax.legend(loc=2) #设置图例,表示在左上角位置
ax.set_xlabel('Population') #设置x轴标签
ax.set_ylabel('Profit') #设置y轴标签
ax.set_title('Predicted Profit vs. Population Size') #设置标题
plt.show() #展示图形
五. 实验总结
单变量线性回归和多变量线性回归实验都是统计学和机器学习中的重要内容。通过实验,我们不仅掌握了线性回归的基本原理和方法,还学会了如何利用这些方法进行数据分析和预测。这些知识和技能对于我们未来的学习和工作都将产生积极的影响。