ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

机器学习实验一线性回归

2021-04-13 21:03:04  阅读:249  来源: 互联网

标签:plt 机器 room area color 回归 np fontsize 线性


机器学习实验一线性回归

实验题目

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

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

标签:plt,机器,room,area,color,回归,np,fontsize,线性
来源: https://blog.csdn.net/banxia_hnu_zjw/article/details/115630681

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有