机器学习一(梯度下降法)

课件和视频地址

http://cs229.stanford.edu/notes/cs229-notes1.pdf
http://open.163.com/movie/2008/1/M/C/M6SGF6VB4_M6SGHFBMC.html

1.前言

最近偶触python,感ctrl c和ctrl v无比顺畅,故越发膨胀。怒拾起python数据分析一PDF读之,不到百页,内心惶恐,叹:卧槽,这都tm是啥,甚是迷茫。遂感基础知识薄弱,随意搜了机器学习教程,小看一翻。此文给出课件中几个算法,自己都不知道对不对,感觉还可以吧。

2.环境配置

不多说,用的python3.x,numpy包,环境下载pycharm,然后file->setting->Project Interpreter->右侧绿色+号->搜索输入numpy->install,然后可能有报错日志,根据日志循环上述过程安装缺少的包。

3.求解问题

本文以线性回归为例,在给出若干(x, y)下,找到方程y=b+ax中b和a,从而给出线性方程。具体理论实在理解尚浅,只给出求解公式。下面代码放在一个python文件中即可。代码部分用到矩阵和向量乘法,作为求和,有一个numpy符号*、dot、multipy区别写在末尾
具体公式如下(课件抄的),已知样本符合如下线性方程:

h(x)=i=0nθixi=θTx,(x0=1)

求解下面cost function最小值时, θ 的值,i是样本编号,m是样本总数
J(θ)=12i=1m(hθ(x(i))y(i))2

转换为梯度下降法求解如下公式:
θj=θjαθjJ(θ)

θjJ(θ)=(hθ(x)y)xj

(1)批量梯度下降算法(batch gradient descent)

伪代码如下
Repeat until convergence{

θj=θj+αi=1m(y(i)hθ(x(i)))x(i)j(for every j)
}

import numpy as np

# y=theta*x
def h(theta, example_x):
    return theta * example_x.T

def batch_gradient_descent(x, y, theta0, alpha, iterator):
    example_x = np.matrix(x)
    label_y = np.matrix(y)
    theta = np.matrix(theta0, dtype=float)
    for i in range(iterator):
        error = (label_y - h(theta, example_x))
        sum_gradient = error * example_x
        theta = theta + alpha * sum_gradient
    return theta

(2)随机梯度下降算法(stochastic gradient descent)

伪代码如下
loop{
 for i=1 to m{

θj=θj+α(y(i)hθ(x(i)))x(i)j(for every j)
 }
}
代码如下

def stochastic_gradient_descent(x, y, theta0, alpha, iterator):
    example_x = np.matrix(x)
    label_y = np.matrix(y)
    theta = np.matrix(theta0, dtype=float)
    m, n = np.shape(example_x)
    for i in range(iterator):
        for j in range(m):
            gradient = (label_y[0, j] - h(theta, example_x[j])) * example_x[j]
            theta = theta + alpha * gradient
    return theta

(3)locally weighted linear regression algorithm

这个也不知道怎么翻译,就是带权重的线性回归,求解方法也就叫权重梯度下降法吧。这个自己不知道对不对,课件没给出具体步骤,也没搜到具体内容。感觉和上两个算法也不该放一起比较,场景不太一致。这就放一起吧。
求解公式,按照下面公式在(2)上加了个w,算法步骤与(2)一样

Fit θ to minimizeiw(i)(y(i)θTx(i))2

w(i)=exp((x(i)x)22τ2)

上公式中x看做所有样本X每列的平均值,暂时这样处理吧。
代码如下:

def w(xi, ex, t):
    return np.exp(-np.multiply((xi - ex), (xi - ex))/2*t*t)

# locally weighted linear regression algorithm
def locally_gradient_descent(x, y, theta0, alpha, iterator, t):
    example_x = np.matrix(x)
    label_y = np.matrix(y)
    theta = np.matrix(theta0, dtype=float)
    m, n = np.shape(example_x)
    ex = np.mean(example_x, axis=0)
    for i in range(iterator):
        for j in range(m):
            wj = w(example_x[j], ex, t)
            gradient = np.multiply(wj, (label_y[0, j] - h(theta, example_x[j])) * example_x[j])
            theta = theta + alpha * gradient
    return theta

注意:numpy的matrix,负号*与dot是一样的,都表示矩阵乘法,行列对应一致。multiply是矩阵各对应位置相乘。例:[1,2]*[[1],[2]]=numpy.dot([1,2],[[1],[2]])=[5],numpy.multiply([1,2], [[1],[2]])=[[1,2],[2,4]]

4测试结果

数据明显给出y=1+2x

x = [[1, 1], [1, 2], [1, 3]]
y = [3, 5, 7]
theta0 = [2, 3]
print(batch_gradient_descent(x=x, y=y, theta0=theta0, alpha=0.1, iterator=50))
print(stochastic_gradient_descent(x=x, y=y, theta0=theta0, alpha=0.1, iterator=50))
print(locally_gradient_descent(x=x, y=y, theta0=theta0, alpha=0.1, iterator=50, t=2))

求解结果如下( θ0θ1 ),是不是很像1,2
[[ 1.0748101 1.96709091]]
[[ 1.04498802 1.98500399]]
[[ 0.99706172 2.0013277 ]]

猜你喜欢

转载自blog.csdn.net/bjjoy2009/article/details/79122640