吴恩达机器学习课程Python实现(ex1:线性回归)

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)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值