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