《HCIA-AI》实验报告

-
实验名称:
回归算法的实现
(图片来源网络,侵删) -
实验目的:
了解机器学习算法的使用流程和功能。
掌握通过Python基础工具包numpy等从零实现线性回归、梯度下降等算法
掌握一些关于机器学习库sklearn的基本用法和一些基本的数据处理方法。
-
实验内容
实验一线性回归,通过Python工具包scikit-learn实现简单线性回归算法的使用。
实验二为线性回归拓展实验,通过Python基础工具包numpy等从零实现线性回归、梯度下降等算法,加深理解。
实验三所使用的数据集样本量较小,数据来自于scikit-learn自带的开源波士顿房价数据。波士顿房价预测项目是一个回归模型,通过该项目的学习可以学会一些关于机器学习库sklearn的基本用法和一些基本的数据处理方法。
-
4.1线性回归
本实验包主要是回归算法的使用,通过从零开始构建线性回归算法和基于scikit-learn调用实现,帮助您更加了解机器学习算法的使用流程和功能。
步骤 1 引入相关依赖的包
from sklearn.linear_model import LinearRegression#导入线性回归模型
import matplotlib.pyplot as plt#绘图库
import numpy as np
步骤 2 构建房价数据集并可视化
x = np.array([121, 125, 131, 141, 152, 161]).reshape(-1,1)#x是房屋面积,作为特征
y = np.array([300, 350, 425, 405,496,517])#y是房屋的价格
plt.scatter(x,y)
plt.xlabel(“area”)#添加横坐标面积
plt.ylabel(“price”)#添加纵坐标价格
plt.show()
输出:
步骤 3 模型训练
lr = LinearRegression()#将线性回归模型封装为对象
lr.fit(x,y)#模型在数据上训练
步骤 4 模型的可视化
w = lr.coef_#存储模型的斜率
b = lr.intercept_#存储模型的截距
print(‘斜率:’,w)
print(‘截距:’,b)
输出: 斜率: [4.98467124]
截距: -274.87696651875774
plt.scatter(x,y)
plt.xlabel(“area”)#添加横坐标面积
plt.ylabel(“price”)#添加纵坐标价格
plt.plot([x[0],x[-1]],[x[0]*w+b,x[-1]*w+b])
输出:
步骤 5 模型预测
testX = np.array([[130]])#测试样本,面积为130
lr.predict(testX)
输出:array([373.13029447])
4.2线性回归算法实现(扩展)
在“线性回归算法实现”部分,使用的数据集为lr2_data.txt,主要是自行模拟的房屋面积与房屋价格数据。该数据集可在实验环境搭建中获取。
步骤 1 导入依赖
import numpy as np
import matplotlib.pyplot as plt
步骤 2 定义函数,计算梯度
def generate_gradient(X, theta, y):
sample_count = X.shape[0]
# 计算梯度,采用矩阵计算 1/m ∑(((h(xi)-yi)) x_j^i)
return (1./sample_count)*X.T.dot(X.dot(theta)-y)
步骤 3 定义函数,用于读取数据集
def get_training_data(file_path):
orig_data = np.loadtxt(file_path,skiprows=1) #忽略第一行的标题
cols = orig_data.shape[1]
return (orig_data, orig_data[:, :cols - 1], orig_data[:, cols-1:])
步骤 4 定义函数,初始化参数
初始化θ数组
def init_theta(feature_count):
return np.ones(feature_count).reshape(feature_count, 1)
步骤 5 定义函数,实现梯度下降法
def gradient_descending(X, y, theta, alpha):
Jthetas= [] # 记录代价函数J(θ)的变化趋势,验证梯度下降是否运行正确
# 计算损失函数,等于真实值与预测值差的平方。(yi-h(xi))^2
Jtheta = (X.dot(theta)-y).T.dot(X.dot(theta)-y)
index = 0
gradient = generate_gradient(X, theta, y) #计算梯度
while not np.all(np.absolute(gradient)