今天公式不是很多,还是用电子的吧,就不拍照了,最后在附上python代码。内容要点有:
- 基本模型(Hypothesis)
- 特征缩放(Feature Scaling)
- α参数的评价和选择(Estimating)
- 正规方程(Normal Equation)
- Python代码
基本模型
h
Θ
(
x
)
=
Θ
T
X
,
θ
是
n
+
1
维
的
向
量
\ h_\Theta(x) = \Theta^TX, θ是n+1维的向量
hΘ(x)=ΘTX,θ是n+1维的向量
对于参数下降,任然采用梯度下降的方法。为了统一 θ_0 和 θ_j(j>=1)时偏导数的差别,加上一个X_0 = 1,则迭代方程为:
Θ
j
:
=
Θ
j
−
α
∗
1
m
∑
i
=
1
m
(
h
Θ
(
x
i
)
−
y
i
)
x
i
\ \Theta_j := \Theta_j - \alpha*\frac{1}{m}\sum_{i=1}^{m}(h_\Theta(x^i) - y^i)x^i
Θj:=Θj−α∗m1∑i=1m(hΘ(xi)−yi)xi
特征缩放
使数据大概在-1到1这个区间范围,否则梯度下降的时候,影响效率,甚至难以收敛。常见的方法有均值归一化(Mean Normalization):
X := (X-u)/(Maximum - Minimum)
当然你也没必要太纠结于精确度,只要特征数据都在一个数量级就好。
对α的评估
记录每次迭代后cost的值,然后画出散点图,若不是下降的,证明α值太大了,需要小一点。在视频中,吴恩达老师采用的方法是三倍三倍的调整α的值。
正规方程
最后讲一下正规方程吧,多项式的就不谈了,这里也只是简单提了一下,之后的学习中应该会详细讲吧。
正规方程的原理就是J(θ)函数对各个θ_i求偏微分=0得到的,应该没理解错吧。
最后推导出一个求θ向量的矩阵方程:
Θ
=
(
X
T
X
)
−
1
X
T
y
\ \Theta = (X^TX)^{-1}X^Ty
Θ=(XTX)−1XTy
最后比较了一下两种方法的优劣,简单来说,梯度下降的方法需要选择合适的α、需要不断迭代,但无论n的值有多大,即数据规模无论多大,梯度下降都有比较好的效率。而正规方程正好相反,虽然不需要选择α,但一旦数据规模过大(可能10的5次方的量级以上时),它的时间复杂度是O(n^3),就难以忍受它的效率了。
而对于这个方程,还有一个小知识点要补充,就是求逆矩阵,众所周知,求逆矩阵是有条件的,当数据有冗余,也就是矩阵行列式=0吧;或者样本量太小,小于特征量个数,都无法求逆。但在编程语言中有一个pinv()函数用于求伪逆矩阵,具体数学原理也没讲,估计挺复杂的吧,笑。
Python方程
- cost函数
- gradient decent函数
- 正规方程
#计算cost值,返回的是一个数,所以用了sum,否则会返回一个(1,1)的矩阵
def computeCost(X, y, theta):
h_x = X.dot(theta.T)
return np.sum((h_x - y).T.dot(h_x - y)/(2*len(y)))
#梯度下降函数
def gradientDescent(X, y, theta, alpha, iters):
temp = np.matrix(np.zeros(theta.shape))
parameters = int(theta.ravel().shape[0])
cost = np.zeros(iters)
for i in range(iters):
error = (X*theta.T) - y
for j in range(parameters):
term = (alpha/len(y))*np.sum(np.multiply(error,X[:,j]))
temp[0,j] = theta[0,j] - term
theta = temp
cost[i] = computeCost(X, y, theta)
return theta, cost
#数据归一化操作
data = (data - data.mean()) / data.std()
#正规方程
def normalEqn(X, y):
theta = np.linalg.pinv(X.T.dot(X)).dot(X.T).dot(y)
return theta