- 实验目的
1.将数据集拆分成训练集(前450个样本)和测试集(后56个样本)
2.利用多元线性回归模型(最小二乘法或者梯度下降法均可)对训练数据进行拟合
3.对拟合得到的模型在测试集上进行测试,使用均方误差作为实验的准确结果并输出。
- 实验内容:
1、使用文件是txt文件,使用open和readlines()函数进行逐行读取,但是读入的是一行带空格回车的字符串,使用strip(‘\n’), split(' '),强制类型转换等进行处理,得出x矩阵和y矩阵。并且按照实验要求进行数据集划分。
2、使用最小二乘法对线性回归方程的w,b求极值,误差使用均方误差。最后的期望是均方误差最小,根据表达式(y-xw)T(y-xw),要使其最小,可以对w求偏导,取0时是极值。可以得出w的表达式是(xTx)-1xTy。里面的变量都已知,可以直接求出,并和测试集相乘得出结果。
使用np.asmatrix可以把二维列表变为矩阵,可以直接使用*、T、I等矩阵的乘法、转置、求逆等操作。
在矩阵相乘时要注意矩阵的行列是否符合规定,否则无法进行。
3、把得到的w矩阵作用到测试集上,得出结果
4、根据公式得出均方误差的公式
实验结果:
- 实验原理:
- 心得体会:
通过这次实验,对于课堂上讲的最小二乘法进行了一次实践,并且对波士顿房价这一经典数据集进行训练和预测。学习了均方误差这一损失函数。巩固上课所学的知识,对机器学习有了初步的认识和了解,为以后的学习打下坚实的基础。
import numpy as np
import pandas as pd
class Linear_Regression():
def __init__(self, data_path):
self.data_path = data_path
self.read_data()
def read_data(self):
f = open(self.data_path)
lines = f.readlines()
x = []
y = []
for line in lines:
line.strip('\n')
data = [float(num) for num in line.split(' ') if num != '']
x.append(data[:-1] + [1]) # w和b合并,则x每行后面加上1
y.append(data[-1])
self.train_x = np.array(x[:450])
self.train_y = np.array(y[:450])
self.test_x = np.array(x[450:])
self.test_y = np.array(y[450:])
def train(self):
x = np.asmatrix(self.train_x)
y = np.asmatrix(self.train_y).reshape(-1, 1)
self.w = (x.T * x).I * x.T * y
def test(self):
self.result = np.array(np.asmatrix(self.test_x) * self.w).ravel()
def Mean_Square_Loss(self): # 均方误差
print(np.mean((self.result - self.test_y) ** 2))
a = Linear_Regression(r"D:波士顿房价数据集\housing_data.txt")
a.train()
a.test()
a.Mean_Square_Loss()