原任务是在Octave/MATLAB实现,本次编程作业全部以python完成。
01 简单的练习
总结下题目:输出一个5*5的单位矩阵
- 在此我们用np.eye(N,M=None, k=0, dtype=<type ‘float’>),首先N代表的是输出方阵的维度,第二个参数不用设置默认M=N,主要看第三个参数,默认是对角线为1,其余全为0;如果k为正数,则对角线往上第k个全为1,其余全为0;如果k为负数,则对角线往下第k个全为1,其余全为0。
import numpy as np
A = np.eye(5)
print(A)
"""
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
"""
02 单变量线性回归
根据这座城市的人口数量及该城市小吃店的利润,来预测开小吃店的利润。
2.1 绘制数据
- 读入数据:在此我们引入pandas库,该库可以帮助我们从诸如 csv 类型的文件导入数据,并且可以用它快速的对数据进行转换和过滤的操作。
import pandas as pd
path = "machine-learning-ex1\machine-learning-ex1\ex1\ex1data1.txt"
data = pd.read_csv(path,header=None,names=['Population','Profit'])#header决定要不要原始的表头,name给出自定义的表头。
print(data.head())#从头查询数据
"""
population profit
0 6.1101 17.5920
1 5.5277 9.1302
2 8.5186 13.6620
3 7.0032 11.8540
4 5.8598 6.8233
"""
- 数据可视化:在此我们引入matplotlib.pyplot库,使用plot函数画图。
import matplotlib.pyplot as plt
data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))#生成图形,kind‘指定所画图的类型,figsize 指定图片大小。
plt.show()#显示图形
2.2 梯度下降
这部分需要使用梯度下降将线性回归参数 θ 拟合到数据集上。
2.21 公式
- 代价函数
- 假设函数
- 参数更新
- 随着梯度下降不断地更新参数,参数也就越接近使代价函数最小的最优值
2.22 实现
- 我们要为我们之前读取的数据添加一列x,用来更新θ_0。
data.insert(0, 'Ones', 1) #相当于在第0列,添加一个表头名为Ones,并且该列均为1
print(data.head())
"""
Ones Population Profit
0 1 6.1101 17.5920
1 1 5.5277 9.1302
2 1 8.5186 13.6620
3 1 7.0032 11.8540
4 1 5.8598 6.8233
"""
- 分割X和y。使用pandas的iloc来进行选择训练集X和目标y
# 分割X和y
lists = data.shape[1]#输出列数
X = data.iloc[:,:-1]#X是第一列到最后一列,但不包括最后一列,因为 python的范围/切片不包括终点
y = data.iloc[:,lists-1:lists]#最后一列
#y = data.iloc[:,-1]#也是最后一列
print(X.head())
"""
Ones Population
0 1 6.1101
1 1 5.5277
2 1 8.5186
3 1 7.0032
4 1 5.8598
"""
print(y.head())
"""
Profit
0 17.5920
1 9.1302
2 13.6620
3 11.8540
4 6.8233
"""
- 我们还要将θ初始化为0,并将θ、X、y全部转化为矩阵
X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix(np.array([0,0]))
print(X.shape)#(97, 2)
print(y.shape)#(97, 1)
print(theta.shape)#(1, 2)
2.23 计算J(θ)
- 计算代价函数来检测代价函数的收敛性。根据上面的公式我们写出代价函数。
def computeCost(X, y, theta)