吴恩达--机器学习--多变量线性回归实例

1.问题描述:
ex1data2.txt里的数据,第一列是房屋大小,第二列是卧室数量,第三列是房屋售价 根据已有数据,建立模型,预测房屋的售价

2.代码示例:

# -*- coding: utf-8 -*-
"""
Created on Tue Aug  4 16:32:09 2020

@author: X
"""

#问题描述:ex1data2是已知数据,第一列是房屋大小,第二列是卧室数量,第三列是房屋售价已有数据,建模预测房屋售价
#1.导入所需库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#2.导入数据
path = 'ex1data2.txt'
data = pd.read_csv(path, header = None, names = ['Size', 'Bedrooms', 'Price'])
data.head(5)#检查前5项

#3.特征缩放归一化
#说明:size变量是bedrooms变量的1000倍大小,统一量级会让梯度下降收敛的更快。
#做法就是,将每类特征减去他的平均值后除以标准差
data_copy = data.copy()
data_copy.insert(0, 'Ones', 1)
data = (data - data.mean()) / (data.std())

#4.梯度下降法:
#加常数项
data.insert(0, 'Ones', 1)
#初始化X,y
cols = data.shape[1]
X = data.iloc[:, 0:cols-1]
y = data.iloc[:, cols-1:cols]

#转换为矩阵操作,并初始化theta
X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix(np.array([0, 0, 0]))


def gradientDescent(X, y, theta, alpha, iters):
    temp = np.matrix(np.zeros(theta.shape))
    parameters = int(theta.shape[1])
    
    for i in range(iters):
        error = ( X * theta.T ) - y

        
        for j in range(parameters):
            term = np.multiply(error, X[:,j])
            temp[0, j] = theta[0, j] - ( np.sum(term) * (alpha / len(X)) )
        theta = temp
        
    return theta

alpha = 0.01 
iters = 1500
g = gradientDescent(X, y, theta, alpha, iters)

#5.计算梯度下降法还原后的theta矩阵,还原后为temp_theta
theta_len = theta.shape[1]
temp_theta = np.zeros(theta_len)
sum_theta = 0
mean_y = data_copy.mean().iloc[theta_len]
std_y = data_copy.std().iloc[theta_len]
for each in range(1,theta_len):
    sum_theta += (g[0,each] * data_copy.mean().iloc[each]) / data_copy.std().iloc[each]

for i in range(theta_len):
    if i == 0:
        temp_theta[i] = ( g[0, 0] - sum_theta ) * std_y + mean_y
    else:
        temp_theta[i] = ( g[0, i] * std_y ) / data_copy.std().iloc[i]

temp_theta = np.matrix(temp_theta)


#使用正规方程法之前首先获得X1,y1。data_copy获得原始数据
X1 = data_copy.iloc[:, 0:cols -1]
y1 = data_copy.iloc[:,cols-1:cols]
X1 = np.matrix(X1.values)
y1 = np.matrix(y1.values)
#正规方程法
def normalEqn(X, y):
    theta = np.linalg.inv(X.T@X)@X.T@y#X.T@X等价于X.T.dot(X)
    return theta

theta2 = normalEqn(X1, y1)

结果展示:

#梯度下降法利用特征缩放后的结果为:
matrix([[-1.10856950e-16,  8.84042349e-01, -5.24551809e-02]])
#还原后temp_theta结果为:
matrix([[89448.75365485,   139.09681537, -8619.11]])
#正规方程法:(不需要特征缩放)
matrix([[89597.9095428 ],
        [  139.21067402],
        [-8738.01911233]])

注解:
–>特征缩放后还原的方法:
知乎转载链接
在这里插入图片描述
–>矩阵减法相关知识:(对于特征缩放部分的理解,即data = (data - data.mean()) / (data.std())部分减法的解释)

import numpy as np
a = np.array([[1, 2, 3, 4],[2, 3, 4, 5], [3, 4, 5, 6]])
b = np.array([1, 2, 3, 4])
#此时a.shape为(3,4),b.shape为(4,)
print(b - a)
#结果为:
array([[0, 0, 0, 0],
       [1, 1, 1, 1],
       [2, 2, 2, 2]])
#即相当于把b转换为了
b = np.array([[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值