吴恩达机器学习作业(多变量线性回归)---maxchet

本文档展示了如何使用Python实现线性回归,以预测食品卡车的利润。通过导入numpy、pandas等库,对数据进行预处理,包括特征缩放和添加常数项。接着,定义代价函数和梯度下降算法,进行模型训练,并利用正规方程求解。最终,展示了训练后的模型参数及代价函数的变化。
摘要由CSDN通过智能技术生成

题目描述:在本部分的练习中,您将使用多个变量实现线性回归,以预测食品卡车的利润。假设你是一家餐馆的首席执行官,正在考虑不同的城市开设一个新的分店。该连锁店已经在各个城市拥有卡车,而且你有来自城市的利润和人口数据。
您希望使用这些数据来帮助您选择将哪个城市扩展到下一个城市。房屋价格数据集,其中2个变量(房子大小,卧室数量)和目标(房子价格)

第一步 导入相应的库

import numpy as np                          #本次我依旧导入这4个库,同单
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

第二步 读取数据

df = pd.read_csv('D:\machine learning\Linear learing\data2\ex1data2.csv',names = ['房屋面积','卧室数量','价格'])   #将数据调入
df.head()

output:
房屋面积 卧室数量 价格
0 2104 3 399900
1 1600 3 329900
2 2400 3 369000
3 1416 2 232000
4 3000 4 539900

第三步 特征缩放
在多项式回归模型中,在执行梯度下降之前,特征缩放尤为重要

df = (df - df.mean()) / df.std()         
df.head()     #df.mean()均值函数    df.std()标准差

output:
房屋面积 卧室数量 价格
0 0.130010 -0.223675 0.475747
1 -0.504190 -0.223675 -0.084074
2 0.502476 -0.223675 0.228626
3 -0.735723 -1.537767 -0.867025
4 1.257476 1.090417 1.595389

第四步:(容易忽视)

df.insert(0,'ONE',1)           #添加一列,跟theta矩阵相匹配
df.head()

第五步:从数据集df中取得X,y

X = df.iloc[:,0:3]
y = df.iloc[:,3:4]  
X.head()

output: ONE 房屋面积 卧室数量
0 1 0.130010 -0.223675
1 1 -0.504190 -0.223675
2 1 0.502476 -0.223675
3 1 -0.735723 -1.537767
4 1 1.257476 1.090417

y.head()

output:
价格
0 0.475747
1 -0.084074
2 0.228626
3 -0.867025
4 1.595389

第六步:转换为矩阵形式(容易忽视)

X = np.matrix(X.values)                         #与例程不同,我打算在代价函数前面就将X,y,theta转换为矩阵。但这一块我不熟练
y = np.matrix(y.values)
theta = np.matrix(np.array([0,0,0]))

第七步****代价函数部分

def computecost(X,y,theta):
    h = np.power((X * theta.T)- y ,2)                  
    J = np.sum(h)/(2*len(X))                             #终于晓得为啥sum,否则代价函数那里会形成一个47列的
    
    return J
computecost(X,y,theta)

output:
0.48936170212765967

第八步:梯度下降

def gradientdescent(X,y,theta,alpha,iters):      #alpha是学习率,iters为迭代次数
    temp=np.matrix(np.zeros(theta.shape)) #np.zeros(theta.shape)=[0.,0.],然后将temp变为矩阵[0.,0.],即theta1,theta2
      
    #theta.ravel():将多维数组theta降为一维,.shape[1]是统计这个一维数组有多少个元
    #parameters表示参数
    cost=np.zeros(iters)     #初始化代价函数值为0数组,元素个数为迭代次数
    
    for i in range(iters):   #循环iters次
        error=(X*theta.T)-y
        
        
        for j in range(3):
            term = np.multiply(error, X[:,j])  #将误差与训练数据相乘,term为偏导数,参考笔记P27
            temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term)) #分别更新theta1,theta2
        
        
        theta=temp
        cost[i] = computecost(X,y,theta)  #计算每一次的代价函数,放到cost[i]中
           
    return theta,cost
alpha = 0.1
iters =1000
g,cost = gradient_descent(X, y, theta, alpha, iters)
g

output:matrix([[ -1.09486888e-16, 8.84765988e-01, -5.31788197e-02]])

cost

output:array([ 0.4893617 , 0.34617152, 0.30110291, 0.26742183, 0.24202804,
0.22268634, 0.20778332, 0.19615275, …总之是个巨大的数组,这里就不展开了

computecost(X, y, g)

output:
0.13068648053904197

***正规方程解法***适用于线性回归方程
当特征数量小于10000时,更推荐用正规方程来解决问题

def normalEqn(X, y):
    theta = np.linalg.inv(X.T@X)@X.T@y
    return theta
final_theta2=normalEqn(X, y)
final_theta2
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

maxchet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值