前言
本人菜狗一个,啥也不懂,但是苦于夏令营面试,还是得来学习一下。
学习课程:
主要是吴承恩的课程:https://www.bilibili.com/video/BV164411b7dx?from=search&seid=4111199140701962956
这里根据课程进度记录一些知识,以便后面复习使用。
名词
监
督
学
习
:
s
u
p
u
e
r
v
i
s
e
d
l
e
a
r
n
i
n
g
监督学习:supuervised\ learning
监督学习:supuervised learning
回
归
问
题
:
r
e
g
r
e
s
s
i
o
n
p
r
o
b
l
e
m
回归问题:regression\ problem
回归问题:regression problem
分
类
问
题
:
c
l
a
s
s
i
f
i
c
a
t
i
o
n
p
r
o
b
l
e
m
分类问题:classification\ problem
分类问题:classification problem
无
监
督
学
习
:
u
n
s
u
p
e
r
v
i
s
e
d
l
e
a
r
n
i
n
g
无监督学习:unsupervised\ learning
无监督学习:unsupervised learning
代
价
函
数
:
c
o
s
t
f
u
n
c
t
i
o
n
代价函数:cost\ function
代价函数:cost function
组
合
优
化
:
C
o
m
b
i
n
a
t
o
r
i
a
l
O
p
t
i
m
i
z
a
t
i
o
n
组合优化:Combinatorial\ Optimization
组合优化:Combinatorial Optimization
最
小
二
乘
法
:
o
r
d
i
n
a
r
y
l
e
a
s
t
s
q
u
a
r
e
s
最小二乘法:ordinary\ least\ squares
最小二乘法:ordinary least squares
梯
度
下
降
:
G
r
a
d
i
e
n
t
d
e
s
c
e
n
t
梯度下降:Gradient\ descent
梯度下降:Gradient descent
等
高
线
图
:
C
o
u
n
t
o
u
r
P
l
o
t
s
等高线图:Countour\ Plots
等高线图:Countour Plots
局
部
最
优
:
L
o
c
a
l
O
p
t
i
m
u
m
局部最优:Local\ Optimum
局部最优:Local Optimum
P1-P2课程内容
课程中有一些规定:
x
(
i
)
代
表
x
列
第
i
行
,
y
(
i
)
x^{(i)}代表x列第i行,y^{(i)}
x(i)代表x列第i行,y(i)同理
P1只有一些基础知识,这里直接记录P2线性回归的内容
线性回归主要内容(以只有两个
θ
\theta
θ变量为例):
Hypothesis:
h
θ
(
x
)
=
θ
0
+
θ
1
x
h_\theta(x)=\theta_0+\theta_1x
hθ(x)=θ0+θ1x
Parameters:
θ
0
,
θ
1
\theta_0,\theta_1
θ0,θ1
Cost Function:
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\theta_0,\theta_1)=\frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2
J(θ0,θ1)=2m1∑i=1m(hθ(x(i))−y(i))2
Goal:
m
i
n
i
m
i
z
e
θ
0
,
θ
1
J
(
θ
0
,
θ
1
)
\underset{\theta_0,\theta_1}{minimize}J(\theta_0,\theta_1)
θ0,θ1minimizeJ(θ0,θ1)
解释:线性回归就是利用线性函数来拟合数据,所以Hypothesis就是线性函数的通式,关键在于如何找出
θ
0
,
θ
1
\theta_0,\theta_1
θ0,θ1两个参数,这里使用的代价函数就是为了找出这两个参数的东西。代价函数有很多,但这个代价函数在线性回归问题里很常用,所以使用它。并且,我们观察式子可以这样认为,当J取值尽量小时,拟合程度越好,所以问题转变为找到最小值,这里通过取其最小值可以办到,下面介绍的梯度下降算法就是求其最优解(值):
梯度下降算法
可以参考这篇文章,更好更详细:
https://www.cnblogs.com/pinard/p/5970503.html
梯度下降算法不仅仅只能应用于上面的那个代价函数,也可以应用于其更一般形式的
J
(
θ
0
,
θ
1
,
θ
2
.
.
.
.
)
J(\theta_0,\theta_1,\theta_2....)
J(θ0,θ1,θ2....)
这里配合下面的图说明梯度下降算法流程:
首先解释一下图,Z轴代表的就是J值,所以我们要找到最小值,就是找到最低点。
步骤如下:
**细节:
- θ 0 \theta_0 θ0和 θ 1 \theta_1 θ1应该同步更新
- 这里的 α \alpha α指定是下降的倍率(步长),决定下降的快慢,要预先设置
- θ 0 \theta_0 θ0对应偏导 α φ φ θ 0 J = 1 m ∑ i = 1 m J ( h θ ( x ( i ) ) − y ( i ) ) 2 ∗ 1 \alpha\frac{\varphi}{\varphi\theta_0}J=\frac{1}{m}\sum_{i=1}^mJ(h_\theta(x^{(i)})-y^{(i)})^2*1 αφθ0φJ=m1∑i=1mJ(hθ(x(i))−y(i))2∗1
- θ 1 \theta_1 θ1对应偏导 α φ φ θ 1 J = 1 m ∑ i = 1 m J ( h θ ( x ( i ) ) − y ( i ) ) 2 ∗ x \alpha\frac{\varphi}{\varphi\theta_1}J=\frac{1}{m}\sum_{i=1}^mJ(h_\theta(x^{(i)})-y^{(i)})^2*x αφθ1φJ=m1∑i=1mJ(hθ(x(i))−y(i))2∗x
- 注意求和符,可以看出当前点的梯度方向是由所有的样本决定的
**
练习
题目来自于课程的配套习题
博客不是很适合记录,建议参照这个大佬的做一遍:
https://www.heywhale.com/mw/project/5da16a37037db3002d441810
单变量回归:
记录一下代码和结果:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
path='/home/flokken/workspace/Machine_Learning/data_sets/ex1data1.txt'
data=pd.read_csv(path,header=None,names=['Population','Profit'])
data.head()
data.plot(kind='scatter',x='Population',y='Profit',figsize=(12,8))
data.insert(0,'Ones',1)
cols=data.shape[1]
X=data.iloc[:,:-1]
y=data.iloc[:,cols-1:cols]
X=np.matrix(X.values)
y=np.matrix(y.values)
theta=np.matrix(np.array([0,0]))
def computeCost(X,y,theta):
inner=np.power(((X*theta.T)-y),2)
return np.sum(inner)/(2*len(X))
alpha=0.01
iters=1500
def gradientDescent(X,y,theta,alpha,iters):
temp=np.matrix(np.zeros(theta.shape))
parameters=int(theta.ravel().shape[1])
cost=np.zeros(iters)
for i in range(iters):
error=(X*theta.T)-y
for j in range(parameters):
term =np.multiply(error,X[:,j])
temp[0,j]=theta[0,j]-((alpha/len(X))*np.sum(term))
theta =temp
cost[i]=computeCost(X,y,theta)
return theta,cost
g,cost=gradientDescent(X,y,theta,alpha,iters)
predict1=[1,3.5]*g.T
predict2=[1,7]*g.T
x=np.linspace(data.Population.min(),data.Population.max(),100)
f=g[0,0]+g[0,1]*x
fig,ax=plt.subplots(figsize=(12,8))
ax.plot(x,f,'r',label='Prediction')
ax.scatter(data.Population,data.Profit,label='Traning Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()
多变量回归: