机器学习作业—Python实现
吴恩达老师的机器学习视频一直以来备受广大学习机器学习同胞们的青睐,也是很多学者的入门必学课程。在课程中老师使用的是Matlab/Octave编程,但如今Python已经成为了机器学习最主流的编程语言,因此我想将课程中的作业用Python进行实现,希望对广大初学者能有所帮助。
1.包的导入
在用Python实现单变量线性回归的过程中,需要用到矩阵运算以及绘图工具,因此导入matplotlib.pyplot和numpy包,这里不对其详细介绍,如果有需要可以访问下面的网址:
numpy包
Matplotlibpyplot包
import matplotlib.pyplot as plt
import numpy as np
- 从作业数据集文件中(ex1data1.txt)导出数据
arr = np.loadtxt('ex1data1.txt', delimiter=",") #直接从TXT文件中导出数据集
x = arr[:, 0] #取出数据集中的“第一列“
y = arr[:, 1] #取出数据集中的“第二列”
- 建立假设函数和成本函数模型
假设函数的表达形式:
h θ ( x ) = θ 0 + θ 1 x h_\theta(x) = \theta_0 + \theta_1x hθ(x)=θ0+θ1x
用矩阵形式表达:
h θ ( x ) = θ T x h_\theta(x) = \theta^Tx hθ(x)=θTx
其中: θ = [ θ 0 θ 1 ] \theta = \begin{bmatrix} \theta_0 \\ \theta_1 \\ \end{bmatrix} θ=[θ0θ1]
x = [ 1 x j ] x = \begin{bmatrix} 1 \\ x_j \\ \end{bmatrix} x=[1xj]
因此在建立假设函数模型之前,首先要对x数据集进行处理,使其成为m x 2的矩阵(第一列数据全为1)
x = np.c_[np.ones((len(x), 1)), x.T] #在x.T数据集中加入一列全为1的向量
y = np.c_[y.T] #将y矩阵进行转置
根据假设函数的矩阵形式建立模型:
def model(x, theta):
h = x.dot(theta)
return h
代价函数的表达形式为:
J
(
θ
)
=
1
2
m
∑
i
=
1
∞
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\theta) = \quad {1 \over 2m} \sum_{i = 1} ^\infty (h_\theta(x^{(i)}) - y^{(i)}) ^2
J(θ)=2m1i=1∑∞(hθ(x(i))−y(i))2
根据代价函数的数学表达式建立模型:
def cost(h, y):
m = len(h)
e = h - y # 误差
J = 1.0 / (2 * m) * np.sum(e.T.dot(e))
return J
- 梯度下降算法
批量梯度下降算法的公式为:
θ j : = θ j − α Δ Δ θ j J ( θ 0 , θ 1 ) \theta_j := \theta_j - \alpha \quad{\Delta \over \Delta\theta_j}J(\theta_0,\theta_1) θj:=θj−αΔθjΔJ(θ0,θ1)
根据梯度下降算法的数学表达式建立模型:
# 梯度下降算法
# alpha=0.001学习率
# count_iter=2000 迭代次数
def gradDesc(x, y, alpha=0.01, count_iter=2000):
m, n = x.shape # sharp返回值是元组(行,列)并赋值给m,n
theta = np.zeros((n, 1)) # 定义theta初始值,theta为矩阵(从初始值开始,沿着初始值下降)
jarr = np.zeros(count_iter) # 代价数组(多维数组<class ‘numpy.ndarray’>)[0,0,0,0,...]
# 对theta进行更新
for i in range(count_iter):
h = model(x, theta) # 计算预估值
jarr[i] = cost(h, y) # 计算代价并存入数组
e = h - y
deltatheta = (1.0 / m) * x.T.dot(e)
theta -= alpha * deltatheta
return jarr, theta
######学习率以及迭代次数根据实际情况选择
得到迭代结果:
5.作做出数据的散点图、线性回归所拟合的图形以及随着迭代次数的增加代价函数的变化曲线
# 做出散点图
plt.figure("Gradient Descent of one various ")
plt.scatter(x[:, -1], y, s=2, c="red", marker='o')
plt.plot(x[:, -1], h, c="r")
plt.title("Scatter plot of training data", fontsize=14)
plt.xlabel("Population of City in 10,000s", fontsize=14)
plt.ylabel("Profit in $10,000s", fontsize=14)
plt.tick_params(labelsize=4, axis="both")
plt.figure("下降趋势")
plt.plot(jarr)
plt.tick_params(labelsize=4, axis="both")
plt.show()
原始数据散点图以及拟合结果
随着迭代次数的增加代价函数的变化曲线
至此,机器学习作业第一部分——单一变量线性回归已经用python完全实现,希望能够对大家有所帮助。如果有什么错误和建议欢迎大家在评论区批评指正!