@多变量线性回归和特征缩放
前言
斯坦福大学吴恩达老师的机器学习课程几乎是每位热爱人工智能领域同学的必修课。网上虽然有许多基于python实现的代码,但大多使用python交互模式解释器ipython实例讲解。本人基于自己的理解采用pycharm提供源代码及个人理解,部分代码可能参考他人代码部分,如有侵权请私信我
一、问题探讨
参考视频4.2-4.3,多变量线性回归需要我们根据多个特征数据,建立模型,预测房屋的售价ex1data2.txt里的数据,第一列是房屋大小,第二列是卧室数量,第三列是房屋售价。
同时由于多变量线性回归与单变量线性回归结题思路和代码大同小异,故只给出个人认为比较重要的代码部分(如特征缩放)和总代码,方便大家学习阅读
二、代码解析
1.特征缩放
data2 = (data2 - data2.mean()) / data2.std()
在机器学习课程中我们已经了解到不同的特征需要保证具有相近的尺度,才能使梯度下降算法更快地收敛。所以我们需要做的是:将每类特征减去他的平均值后除以标准差。(其中data2.mean()表示平均值,data2.std()表示标准差)
2.数据处理
代码如下(示例):
2…处理数据
ata2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])
data2 = (data2 - data2.mean()) / data2.std()#特征归一化,将每类特征减去他的平均值后除以标准差
data2.insert(0, 'Ones', 1)#在第0列插入一列,这列值全为1
clos=data2.shape[1] #shape[1]取列数,[0]取行数,clos=4
x2=data2.iloc[:,0:clos-1]#iloc,行全选,选0,1列,是前闭后开集合.X为DataFrame形式,既有行索引,也有列索引
y2=data2.iloc[:,clos-1:clos]#行全选,选最后一列,即房价price
#print(X.head()) #验证X,y
#print(y.head())
x2 = np.matrix(x2.values)#将X,y转化成矩阵
y2 = np.matrix(y2.values)
theta2=np.matrix([0,0,0]) #将theta转化成空矩阵j
另外需要注意的一点便是:由于出现了新的特征数据(在该题中共有两列特征值,即房屋大小和卧室数量),故theta要根据实际情况设定参数,即theta个数=特征值个数+1
3.总代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
path ='D:\machine learning data\ex1data2.txt'
data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])
data2 = (data2 - data2.mean()) / data2.std()#特征归一化,将每类特征减去他的平均值后除以标准差
data2.insert(0, 'Ones', 1)#在第0列插入一列,这列值全为1
clos=data2.shape[1] #shape[1]取列数,[0]取行数,clos=4
x2=data2.iloc[:,0:clos-1]#iloc,行全选,选0,1列,是前闭后开集合.X为DataFrame形式,既有行索引,也有列索引
y2=data2.iloc[:,clos-1:clos]#行全选,选最后一列,即房价price
#print(X.head()) #验证X,y
#print(y.head())
x2 = np.matrix(x2.values)#将X,y转化成矩阵
y2 = np.matrix(y2.values)
theta2=np.matrix([0,0,0]) #将theta转化成空矩阵j
def computeCost(x2, y2, theta2):#计算代价函数
inner=np.power(((x2*theta2.T)-y2),2)
return np.sum(inner)/(2 * len(x2))#len(X)为行数,即公式中的m
print(computeCost(x2, y2, theta2))
def gradientDescent(x2, y2, theta, alpha, iters):#alpha学习率,iters迭代次数,梯度下降法找局部最优解
temp = np.matrix(np.zeros(theta.shape))#一个与theta相同维度的0矩阵
parameters=int(theta.ravel().shape[1]) #ravel()将多维降为一维
cost = np.zeros(iters)#保存迭代之后的cost
for i in range(iters):
error=(x2*theta.T)-y2
for j in range(parameters):
term=np.multiply(error,x2[:,j])
temp[0,j]=theta[0,j] - np.sum(term)*(alpha/len(x2))
theta=temp
cost[i]=computeCost(x2, y2, theta)
return theta, cost
alpha = 0.01
iters= 1500
g,cost = gradientDescent(x2, y2, theta2, alpha, iters)
print(g)
print(computeCost(x2, y2, g))#使用拟合值来计算代价函数(误差)
在pycharm中计算结果为:0.4893617021276595(theta均为0时的误差值)
[[-1.10845139e-16 8.84042349e-01 -5.24551809e-02]](梯度下降计算后的theta值)
0.130686706060959(误差值)
总结
在保证理解单变量线性回归解题思路的情况下,其实多变量线性回归也会变得十分简单,写这篇博客最大的目的也是为了方便大家随时对照自己的代码进行参考修改。如果大家对部分代码存在疑惑,可以私聊询问!