最近在听吴恩达老师的ML网课,作为一个即将入学的研一菜鸟,我觉得有必要将一些自认为比较重要的知识点记录下来,同时我还找到了对应的练习题以及对应的代码,每一次分享的学习笔记都会对关键代码进行一个review。
本人才疏学浅,不足之处请多指正!
1.什么是机器学习?
卡内基梅隆大学Tom Mitchell教授提出了如下定义:
A computer programm is said to learn from experience E with respect to some task T and some performance P, if its performance on T, as measured by P, improves with experince E.
读一下就会发现这段话十分押韵。
2.监督学习
监督学习就是通过对已有的带标志(label)的数据集(data set)进行学习,从而能够对无标记数据进行标志的预测。
上图是一个监督学习的模型,假设我们要通过已知的房屋的大小(长、宽、高等)信息来预测房屋的价格,可以用学习算法通过训练集数据的训练找到这样的一个预测函数
h
h
h,达到预测的目的。
3.无监督学习
无监督学习就是通过对不带标志的数据集的学习,从而能够对数据进行分类,找到数据的结构
4.单变量线性回归
回归:根据之前的数据预测出一个准确的输出值
如果将预测函数
h
h
h设置为一个单变量的线性方程如:
h
θ
(
x
)
=
θ
0
+
θ
1
x
(1)
h_{\theta}(x)=\theta_0+\theta_1x\tag{1}
hθ(x)=θ0+θ1x(1)
这样就变成了单变量线性回归问题
4.1代价函数
选好了模型之后,对于单变量线性回归,我们需要找到一组最理想的参数
θ
0
\theta_0
θ0和
θ
1
\theta_1
θ1来让模型的预测结果达到最精确。为此我们用代价函数来评估当前参数下模型的性能。
代价函数可以有多种选择,其中一种为模型预测值与真实值的差值,差值越小,代表预测结果越好。代价函数
J
J
J表示如下:
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
M
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
(2)
J(\theta_0,\theta_1)=\frac{1}{2m}\sum_{i=1}^M(h_\theta(x^{(i)})-y^{(i)})^2\tag{2}
J(θ0,θ1)=2m1i=1∑M(hθ(x(i))−y(i))2(2)
于是我们可以得到如下的无约束优化问题:
m i n i m i z e θ 0 , θ 1 J ( θ 0 , θ 1 ) (3) \mathop{minimize}\limits_{\theta_0,\theta_1} J(\theta_0,\theta_1) \tag{3} θ0,θ1minimizeJ(θ0,θ1)(3)
4.2 梯度下降
梯度下降法是解决这类问题的常用算法,其主要思想就是从初始的参数开始,不断改变参数以使得函数值不断变小,其找到的最小值被称为局部最优值(local minimum),对于凸问题,其局部最优值即为全局最优值(global minimum)。针对问题(3)的梯度下降法的具体表示为:
Gradient Decent Algorithm:
r
e
p
e
a
t
u
n
t
i
l
l
c
o
n
v
e
r
g
e
n
c
e
{
θ
j
:
=
θ
j
−
α
∂
∂
θ
j
J
(
θ
0
,
θ
1
)
(
f
o
r
j
=
0
a
n
d
j
=
1
)
}
(4)
repeat\ untill\ convergence\ \{\theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1)\quad (for\ j=0\ and\ j=1)\} \tag{4}
repeat untill convergence {θj:=θj−α∂θj∂J(θ0,θ1)(for j=0 and j=1)}(4)
其中
α
\alpha
α是学习率(learning rate)。我们可以简单地将整个流程理解为不停地沿着与梯度相反的方向“走一步”,这个步长由
α
\alpha
α决定,
α
\alpha
α越大步长越长。合理地选择
α
\alpha
α,经过多次迭代后就能够找到最优解
5.代码回顾
用机器学习算法去解决实际问题的过程大致可以分为六个步骤:
1、根据需要选取合适的模型
2、获取数据
3、选择评价标准并设计代价函数
4、选择一个合适的解法
5、训练模型
6、检验模型
假设我们要预测一家餐厅的年收益与餐厅附近人口数量的关系,并且选择了单变量线性回归模型(由公式(1)给出)。
接下来应该去获取各个餐厅的收益以及附近的人口数量
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
path = 'ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])
data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))
plt.show()
在这里,与之相应的数据事先存放在了ex1data1.txt文件中并且被提取出来,进而得到了data这样的一个DataFrame类。接着我们将数据画出来得到如下结果
接着我们选择最小二乘法最为评判标准(由公式(2)给出),定义代价函数。
def computeCost(X, y, theta):
inner = np.power(((X * theta.T) - y), 2)
return np.sum(inner) / (2 * len(X))
接着再用gradient desent的解法迭代地使代价函数收敛,这部分代码太长,于是就以空函数体的形式给出。
def gradientDescent(X, y, theta, alpha, iters):
return theta, cost
其中X代表人口数量,y代表年收益,theta是与X相对应的权重,alpha代表学习率,iters代表迭代的数量。最后两个参数可以根据用户需要来设置。该函数返回经过iters次迭代后的theta值与cost值。
这可以看做是选择解法与训练模型一起完成的过程,得到了使cost最小(非严格)的theta之后,带回公式(1)就能够得到训练后的模型。
最后,要想检验模型,必须要有在训练集之外的测试集数据,在这个练习中并没有这些数据,所以我们只能看到模型的拟合程度(cost),而不能看到泛化程度。