机器学习实验一线性回归
实验题目
1 、 一元线性回归 题目: 应用一元线性回归预测移动餐车的利润。假设你是一家餐饮连锁店的CEO, 考虑在不同的城市开辟新店。该餐饮店已在许多城市拥有移动餐车,现有各个城 市移动餐车的利润和城市人口的数据。这些数据将帮助你选择在哪个城市进行新 店扩张。请按要求完成实验。
数据集: 文件ex1data1.txt 为该实验部分的数据集,第一列表示城市人口(单位为万 人),第二列表示该城市的移动餐车的利润(单位为万美元,若利润为负值,表 示损失)。
步骤与要求: 1)在开始任务之前,进行数据的可视化对于了解数据特征是很有帮助的。 请你导入数据并以人口为横坐标,利润为纵坐标画出散点图并观察数据分布特征。 (建议:用python 的matplotlib) 2)将线性回归参数初始化为0,然后计算代价函数(cost function)并求出 初始值。 3)使用线性回归的方法对数据集进行拟合,并用梯度下降法求解线性回归 参数。(eg:迭代次数=1500,alpha=0.01) 4)画出数据的拟合图形。 5)预测人口数量为35000 和70000 时,利润为多少。
2 、 多元线性回归 题目: 应用多元线性回归预测房价。假设你打算出售你的房子,你想知道房子的市 场价应该设为多少比较合适。一种方法就是收集最近的房屋销售信息并设计一个 房屋价格模型。请按要求完成实验。
数据集: 文件ex1data2.txt 为该实验部分的数据集,第一列表示房屋的面积(平方英 尺),第二列表示房间数目,第三列表示房屋价格。
步骤与要求: 1)导入数据,通过观察,容易发现房屋面积的大小约是房间数量的1000 倍。 当特征数量级不同时,对进行特征缩放能够使梯度下降更快地收敛。请对这两个 特征进行归一化处理。 2)使用梯度下降法求解线性回归参数。尝试使用不同的alpha(学习率)进 行实验,找到一个合适的alpha 使算法快速收敛。思考alpha 的大小对于算法性 能的影响。 3)使用你认为最佳的alpha 运行梯度下降法求出线性回归参数,然后预测房 屋面积为 1650 平方英尺,房间数量为 3 时,房屋的价格。
题目一
import numpy as np
import matplotlib.pyplot as plt
#设置字体
plt.rcParams['font.sans-serif'] =['SimHei']
def LoadFile(filename):
data = np.loadtxt(filename, delimiter=',', unpack=True, usecols=(0, 1))
x = np.transpose(np.array(data[0]))
y = np.transpose(np.array(data[1]))
return x, y
#加载样本数据
if __name__ == '__main__':
x, y = LoadFile('ex1data1.txt')
learn_rate=0.01 #设置超参数,学习率
iter=1500 #迭代次数
display_step=50 #每50次迭代显示一下效果
#初始化为0
w=0
b=0
#训练模型
mse=[] #存放每次迭代的损失值
for i in range(0,iter+1):
#求偏导
dL_dw=np.mean(x*(w*x+b-y))
dL_db=np.mean(w*x+b-y)
#更新模型参数
w=w-learn_rate*dL_dw
b=b-learn_rate*dL_db
#得到估计值
pred=w*x+b
#计算损失(均方误差)
Loss=np.mean(np.square(y-pred))/2
mse.append(Loss)
if i%display_step==0:
print("i:%i,Loss:%f,w:%f,b:%f"%(i,mse[i],w,b))
print("城市人口为35000时的预测餐车利润:%f"%(3.5*w+b))
print("城市人口为70000时的预测餐车利润:%f"%(7*w+b))
#模型和数据可视化
plt.figure(figsize=(20,4))
plt.subplot(1,3,1)
#绘制散点图
#张量和数组都可以作为散点函数的输入提供点坐标
plt.scatter(x,y,color="red",label="数据集")
plt.scatter(x,pred,color="green",label="梯度下降法")
plt.plot(x,pred,color="blue")
#设置坐标轴的标签文字和字号
plt.xlabel("城市人口(万人)",fontsize=14)
plt.ylabel("餐车利润(万美元)",fontsize=14)
#在左上方显示图例
plt.legend(loc="upper left")
#损失变化可视化
plt.subplot(1,3,2)
plt.plot(mse)
plt.xlabel("迭代次数",fontsize=14)
plt.ylabel("损失值",fontsize=14)
#估计值与标签值比较可视化
plt.subplot(1,3,3)
plt.plot(y,color="red",marker="o",label="数据集")
plt.plot(pred,color="blue",marker="o",label="预测利润")
plt.legend()
plt.xlabel("sample",fontsize=14)
plt.ylabel("price",fontsize=14)
#显示整个绘图
plt.show()
题目二
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def LoadFile(filename):
data = np.loadtxt(filename, delimiter=',', unpack=True, usecols=(0, 1, 2))
x = np.transpose(np.array(data[0]))
y = np.transpose(np.array(data[1]))
z = np.transpose(np.array(data[2]))
return x, y, z
if __name__ == '__main__':
area, room, price = LoadFile('ex1data2.txt')
num=len(area) #样本数量
x0=np.ones(num)
#归一化处理,这里使用线性归一化
x1=(area-np.average(area))/(area.max()-area.min())
x2=(room-np.average(room))/(room.max()-room.min())
#堆叠属性数组,构造属性矩阵
#从(16,)到(16,3),因为新出现的轴是第二个轴所以axis为1
X=np.stack((x0,x1,x2),axis=1)
#print(X)
#得到形状为一列的数组
Y=price.reshape(-1,1)
#print(Y)
learn_rate=0.001 #设置超参数
iter=1500 #迭代次数
display_step=50 #每50次迭代显示一下效果
#设置模型参数初始值
W=[[0],
[0],
[0]]
#训练模型
mse=[]
for i in range(0,iter+1):
#求偏导
dL_dW=np.matmul(np.transpose(X),np.matmul(X,W)-Y) #XT(XW-Y)
#更新模型参数
W=W-learn_rate*dL_dW
#得到估计值
PRED=np.matmul(X,W)
#计算损失(均方误差)
Loss=np.mean(np.square(Y-PRED))/2
mse.append(Loss)
if i % display_step==0:
print("i:%i,Loss:%f"%(i,mse[i]))
xx0=np.ones(1)
xx1=(1650.0-np.average(area))/(area.max()-area.min())
xx2=(3.0-np.average(room))/(room.max()-room.min())
XX=[xx0,xx1,xx2]
print("房屋面积为1650平方英尺房间数量为3时预测房屋的价格:%f"%(np.matmul(XX,W)))
#结果可视化
plt.rcParams['font.sans-serif'] =['SimHei']
plt.figure(figsize=(12,4))
#损失变化可视化
plt.subplot(1,2,1)
plt.plot(mse)
plt.xlabel("迭代次数",fontsize=14)
plt.ylabel("损失值",fontsize=14)
#估计值与标签值比较可视化
plt.subplot(1,2,2)
PRED=PRED.reshape(-1)
plt.plot(price,color="red",marker="o",label="数据集")
plt.plot(PRED,color="blue",marker="o",label="预测房价")
plt.xlabel("sample",fontsize=14)
plt.ylabel("price",fontsize=14)
plt.legend()
plt.show()
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(area, room, price, color="red")
ax.set_zlabel('price', fontdict={'size': 15, 'color': 'red'})
ax.set_ylabel('room', fontdict={'size': 15, 'color': 'red'})
ax.set_xlabel('area', fontdict={'size': 15, 'color': 'red'})
ax.scatter(area, room, PRED,color="b")
XX, YY = np.meshgrid(area, room)
ax.plot_surface(XX,
YY,
Z=W[:,0][0]*x0+W[:,0][1]*((XX-np.average(area))/(area.max()-area.min()))
+W[:,0][2]*((YY-np.average(room))/(room.max()-room.min())),
color='g',
alpha=0.9
)
plt.show()
注:细节方面大家自己看
实验工程链接实验工程链接