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