机器学习实验一线性回归

机器学习实验一线性回归

实验题目

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()
 
    
    

注:细节方面大家自己看
实验工程链接实验工程链接

上一篇:【lssvm预测模型】基于蝙蝠算法改进的最小二乘支持向量机lssvm预测


下一篇:数据挖掘实战—航空公司客户价值分析