目录
1 单变量的线性回归
本次的任务是根据城市人口数量,预测开小吃店的利润。数据在ex1data1.txt里,第一列是城市人口数量,第二列是该城市小吃店利润。
1.1 读取数据
读取数据的代码如下:
import numpy as np
import pandas as pd
path = 'C:\Users\Inuyasha\Desktop\ex1data1.txt' #用变量path存储要读取文件的地址
data = pd.read_csv(path, header=None, names=['Population', 'Profit']) #pd.read_csv函数打开csv文件(Comma-Separated Values 逗号分隔值)
data.head() #显示前五行
运行结果:
pd.read_csv()函数创建DataFrame数据帧
pd.read_csv(path,header=’’,names=(’’))
header: 指定第几行作为列名(忽略注解行),如果没有指定列名,默认header=0; 如果指定了列名header=None
names: 指定列名,如果文件中不包含header的行,应该显性表示header=None
1.2 数据处理
线性回归模型要向原始数据第一列添加全为1的一列,即添加x₀=1,代码如下:
data.insert(0, 'Ones', 1)
data.head()
实现效果:
Dataframe.insert()函数
Dataframe.insert(loc, column, value, allow_duplicates=False): 在Dataframe的指定列中插入数据。
函数参数介绍:
loc: int型,表示第几列;若在第一列插入数据,则 loc=0
column: 给插入的列取名,如 column=‘新的一列’
value:数字,array,series等都可(可自己尝试)
allow_duplicates: 是否允许列名重复,选择Ture表示允许新的列名与已存在的列名重复。
变量赋值初始化
为x,y,theta进行赋值初始化,代码如下:
cols = data.shape[1]
x = data.iloc[:,:-1]
y = data.iloc[:,cols-1:cols]
x = np.matrix(x)
y = np.matrix(y)
theta = np.mat([0,0])
df.shape()
df.shape[0]返回的是w的行数
df.shape[1]返回的是w的列数
df.shape():查看行数和列数
df.iloc[]
loc是根据dataframe的具体标签选取列,而iloc是根据标签所在的位置,从0开始计数。
x为m*2的矩阵,y为m*1的矩阵,theta为[0,0]。
1.3 梯度下降
代价函数公式
单变量线性回归模型使用的代价函数为方差:
将代价函数用代码实现。
代价函数公式实现
def computeCost(x, y, theta): #定义computeCost函数形参为θ、x、y三个参数
return np.sum(np.power((x@theta.T-y),2))/(len(x)*2)
矩阵转置.T和power()
matrix.T
np.power(a,b) = a^b
梯度下降算法
梯度下降算法的公式如下:
其中对θ求导部分在线性回归中可写成:
实现对θ求导部分的代码:
def gardient(x, y, theta)
m = x.shape[0]
inner = (x@theta.T - y).T@x
return inner/m
接着就可以实现对J(θ)的更新:
def gardientDescent(x, y, theta, alpha)
inner = theta - alpha*gardient(x, y, theta)
return inner
实现批量梯度下降算法:
def batchGradientDescent(x, y, theta, alpha, iters)
costList = [computeCost(x, y, theta)]
_theta = theta.copy()
for i in range(iters):
_theta = gardientDescent(x, y, _theta, alpha)
costList.append(computeCost(x, y, _theta))
return _theta, costList
运算结果
先计算初始的损失值:
lost = computeCost(theta,x,y)
lost
运行结果:
设置alpha = 0.01,iters = 1500进行批量梯度下降算法:
alpha = 0.01
iters = 1500
finalTheta,costDataList = batchGradientDescent(x, y, theta, alpha, iters)
2 多变量线性回归
任务是通过房屋大小和卧室数量预测房屋售价,ex1data2.txt里的数据,第一列是房屋大小,第二列是卧室数量,第三列是房屋售价。
2.1 数据处理
path2 = 'C:\\Users\\Inuyasha\\Desktop\\ex1data2.txt'
data2 = pd.read_csv(path2,header=None,names=('Size','Bedroom','Price'))
data2.head()
运行结果:
读取完数据后进行特征归一化处理。
data2 = (data2 - data2.mean(0))/data2.std()
data2.head()
运行结果:
DataFrame.mean()函数
df.mean()等价于df.mean(0)。把轴向数据求平均,得到每列数据的平均值。
df.mean(1)按照另外一个axis的方向来求平均,得到每行数据的平均值。
接下来对变量进行初始化赋值。
data2.insert(0,'Ones',1)
data2.head()
col2 = data2.shape[1]
x2 = data2.iloc[:,0:col2-1]
y2 = data2.iloc[:,col2-1:col2]
x2 = np.matrix(x2)
y2 = np.matrix(y2)
theta2 = np.matrix([0,0,0])
2.2 批量梯度下降算法
多变量线性回归算法的代码与单变量线性回归一致,可以直接使用之前定义的批量梯度下降算法:
finalTheta2,costDataList2 = batchGradientDescent(x2, y2, theta2, alpha, iters)