吴恩达老师的机器学习课程是机器学习入门者必看的经典之一,其课后习题也是典中典。下面将在以Python为语言工具完成课后习题。
问题一:单元线性回归
问题:根据城市人口数量,预测开小吃店的利润
下面我将介绍两部分算法,一个是利用单纯的循环减少算法,算法内容冗长,另一个为吴老师所讲的向量化,减少循环部分,以达到优化算法的目的。首先介绍一下算法Ⅰ(超新手算法)
导入数据文件,并读出数据前五项内容以检查。
path = 'C://Users//xzl//PycharmProjects//machinelearning//linear//ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])
data.head()
进行梯度下降并计算代价函数值。
# 迭代1500次的线性回归算法
# a0、a1为参数,初值分别设为0,0,t为学习率
a0 = 0
a1 = 0
t = 0.01
i = 0
list_cost = [] #存放代价函数值
while i < 1501:
temp0 = 0
temp1 = 0
temp2 = 0
for xi, yi in zip(data.Population, data.Profit):
temp0 = temp0 + ((a0 + a1 * xi) - yi)
temp1 = temp1 + ((a0 + a1 * xi) - yi) * xi
# 由于在参数初值都是0时无需计代价函数值,因此用一个if循环跳过第一次循环。
# 但是,这样一来,在第i+1次循环中得到的代价函数值是由第i次梯度下降的得到的参数计算而来
# 于是总循环数改为1501,使得第1500次迭代得到的参数能计算出代价函数值。
if i > 0:
temp2 = temp2 + math.pow(a0 + a1 * xi - yi, 2)
temp_a0 = a0 - t * temp0 / len(data.Profit)
temp_a1 = a1 - t * temp1 / len(data.Profit)
# 由于总循环数改为1501时,循环次数变味了1501次,因此使用if循环跳过最后一次迭代
if i < 1500:
a0 = temp_a0
a1 = temp_a1
if i > 0:
temp2 = temp2 / (2 * len(data.Profit))
list_cost.append(temp2)
i = i + 1
由于在参数初值都是0时无需计代价函数值,因此用一个if循环跳过第一次循环。,但是,这样一来,在第i+1次循环中得到的代价函数值是由第i次梯度下降的得到的参数计算而来 ,于是,总循环数改为1501,使得第1500次迭代得到的参数能计算出代价函数值。同时,由于总循环数改为1501时,循环次数变味了1501次,因此使用if循环跳过最后一次迭代。
将线性回归函数和代价函数值可视化。如下图。