梯度下降 && 线性回归 && 逻辑回归 && softmax

来源:互联网 发布:应用引擎怎么上传源码 编辑:程序博客网 时间:2024/04/30 08:39

生成模型和判别模型不同

判别方法:由数据直接学习决策函数Y=f(X)或者条件概率分布P(Y|X)作为预测的模型,即判别模型。基本思想是有限样本条件下建立判别函数,不考虑样本的产生模型,直接研究预测模型。典型的判别模型包括k近邻,感知级,决策树,支持向量机等。

生成方法:由数据学习联合概率密度分布P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型,即生成模型:P(Y|X)= P(X,Y)/ P(X)。
参考

梯度下降(上升)

概念

梯度下降法(Gradient decent),用来求函数的极小值,且是一种迭代算法,由于计算效率高,在机器学习中常常使用。
梯度下降法经常求凸函数(convex function)的极小值,因为凸函数只有一个极小值,梯度下降法求得的极小值就是最小值。
梯度上升法(Gradient ascent),用来求函数的极大值,两种方法原理一样,只是计算的过程中正负号不同而已。

梯度是一个矢量,方向导数是一个标量,梯度所指向的方向是方向导数最大的方向,且梯度的模和方向导数的最大值相等。

求梯度的方法很简单,对每一个自变量求偏导数,然后将其偏导数作为自变量方向的坐标即可。梯度的符号为∇,则函数f(x,y)的梯度为: f(x,y)=(f(x,y)x,f(x,y)y)

计算方法

先选择一个初始点,计算该点的梯度,然后按照梯度的方向更新自变量。
x(k+1)=x(k)αf(x(k))

示例:f(x)=x2 , f(x)=2x

迭代次数(n) 自变量(x) 梯度(2x) 步长(α) 因变量(x2) 0 3 6 0.1 9 1 2.4 4.8 0.1 5.76 2 1.92 3.84 0.1 3.69 3 1.536 3.072 0.1 2.36 10 0.32 0.64 0.1 0.10 20 0.03 0.06 0.1 0.0009

对应代码

if __name__ == "__main__":    x = 3    y = x * x    alpha = 0.1    count = 3    while (count > 0):        x = x - alpha * 2 * x        y = x * x        count = count - 1    print x, y

线性回归

处理回归问题最朴素的方法。假设方程满足y=w0x0+w1x1+...+wnxn
损失函数为J=(ywx)2 ,使用最小二乘

线性回归有两种方式求解,一种是矩阵求逆求解。w=(XTX)1XTy
另一种是梯度下降。

# -*- coding:utf-8 -*- # y=Wx   b 放到其中统一处理x.shape=n+1# 梯度下降 最小二乘矩阵求解# SGD BatchGDimport numpy as npfrom sklearn import datasets# J=(y-wx)^2   J'=2x^T(y-wx) = 0  w=(xTx)^-1 * X^T * y# x 矩阵,一列代表一个样本  y一行 每个其中为分数# def leastSquare(x,y):    return x.T.dot(x).I.dot(xx.T.dot(y))def myCost(w,x,y):    return (w*x-y) * (w*x-y).Tdef myFunc(w,x):    return w*xdef myFuncPrime(w,x,y):    t=(y-w*x)    return t * x.Tdef gradentDescend(x,y,alpha=0.01,epochs=10,eps=1e-3):    # 生成随机w    x=np.mat(x)    y=np.mat(y)    w=np.mat(np.random.rand(1,x.shape[0]))    for loop in range(epochs):        # print myFuncPrime(w,x,y)        # 梯度下降,这里是+是因为导数前有负号        w=w + alpha * myFuncPrime(w,x,y)        cost=myCost(w,x,y)        print 'loop=%d,cost=%s,w=%r' %(loop,cost,w)        if myCost(w,x,y) < eps:            return w    return wfrom matplotlib import pyplot as pltdef drawSetter(x,original,calc):    ax=plt.subplot(111,projection='3d') #创建一个三维的绘图工程    #将数据点分成三部分画,在颜色上有区分度    ax.scatter(x[0],x[1],original,c='y') #绘制数据点    ax.scatter(x[0],x[1],calc,c='r') #绘制数据点    ax.set_zlabel('Z') #坐标轴    ax.set_ylabel('Y')    ax.set_xlabel('X')    plt.show()x=np.mat(np.random.rand(2,10))*10answ=np.random.rand(1,2)*10y=answ*xret=gradentDescend(x,y,0.001,10)drawSetter(x.tolist(),y.tolist(),(ret*x).tolist())

逻辑回归

处理的是在某条件下,一件事情的概率为多大。常用于预测疾病发生的概率。
这里计算的是在某种条件θ下,事情的可能性。
损失函数是cross-entropy ,通过最大似然推导
具体参考Link
即所有样本点出现概率最大。

P(y|x)=f(x)=sigmod(x) 求的是 maxwmi=1P(xiyi)=P(xi)f(xi)

正负样本为+1,-1所以可以化简仅和f(x)有关再用去对数将累乘化为累加。
L(θ)=P(x1)h(x1)×P(x2)(1h(x2))×.....
同时因为sigmod有个比较好的特性1h(x)=h(x)
L(θ)=P(x1)h(x1)×P(x2)h(x2)×.....
L(θ)=Nn=1h(ynxn)
求导后w的更新就是

θj:=θjα1mmi=1(hθ(xi)yi))xji


l(θ)=mi=1P(yi|xi;θ)=mi=1(hθ(xi))yi((1hθ(xi)))1yi

J(θ)=1ml(θ)

softmax

多分类
是逻辑回归扩展到多元的情况,深度学习中经常将其作为最后一层的输出softmax

原创粉丝点击