机器学习实战记录-Logistic回归

准备:梯度下降算法;(来自吴恩达机器学习)

1.cost函数的引出

定义的引出:确定模型计算出的值与测试样本值之间的差距;更适合大量的数据集;

机器学习实战记录-Logistic回归_第1张图片

m代表样本点数,除以m是为了求平均误差(让参数m有了意义),除以2m是一样的,我的理解是:模型在样本值的中间波动,取一半就是一边点的距离,感觉和SVM里有点类似;

是模型函数,猜测的模型,关于x的函数;是代价函数,关于参数的函数;

机器学习实战记录-Logistic回归_第2张图片

机器学习实战记录-Logistic回归_第3张图片

机器学习实战记录-Logistic回归_第4张图片

当将两个参数同时引入:

机器学习实战记录-Logistic回归_第5张图片

注意:上图是一个凸函数,线性回归都是这样的,不会出现局部最优的情况;

机器学习实战记录-Logistic回归_第6张图片机器学习实战记录-Logistic回归_第7张图片

2.梯度下降算法

机器学习实战记录-Logistic回归_第8张图片

机器学习实战记录-Logistic回归_第9张图片

起始点不同,得到局部最优结果可能不同;

机器学习实战记录-Logistic回归_第10张图片

关于公式中的加减并不影响,因为斜率有正负,公式不断的迭代,当到达局部极值点,斜率为0,不会更新;

机器学习实战记录-Logistic回归_第11张图片

关于振荡的出现,可能因为步长太大;

机器学习实战记录-Logistic回归_第12张图片

自动采取了步长变小,因为斜率在不断的变化,等效于步长在不断变化;

 

功能介绍

出现原因:线性回归不适合分类问题

机器学习实战记录-Logistic回归_第13张图片

当分类较散的情况,出现了距离较远的点,粉色拟合直线可能会变成蓝色的,继续按y轴判断会出现错误;

Logistic回归分类的主要思想:根据现有的数据对分类边界线建立回归公式,以此进行分类。

1.sigmoid函数

机器学习实战记录-Logistic回归_第14张图片

计算w,将特征xi归到z上;

方程变成了:

假设函数

(将特征的输出结果转换成了概率的问题)

,求出的相对于0.5的大小就可以判断类别,Logistic就是通过学习得到w;

问题转换成:与0之间的关系;

机器学习实战记录-Logistic回归_第15张图片

代价函数:

机器学习实战记录-Logistic回归_第16张图片

根据代价函数的定义,最原本的代价函数应该是红色箭头所示,但是因为sigmod死非线性函数,导致代价函数式非凸函数,会导致代价函数出现如图左很多局部最优值,只有转换为右边的凸函数利用梯度算法能找到最优值;

(PS:线性函数

2.梯度上升法

梯度上升算法求函数最大值,梯度下降算法求函数最小值;

对于方向导数和梯度的理解:

https://www.zhihu.com/question/36301367

公式推导过程:https://blog.csdn.net/c406495762/article/details/77723333

def loadDataSet():
    dataMat = []; labelMat = []
    fr = open('testSet.txt')
    for line in fr.readlines():
        lineArr = line.strip().split()
        #???????
        #在(x,y)前面加个1.0,为啥要有1这个特征呢,其实他是直线的常量y=ax+b的b,不懂得到画图时就明白了
        #在这里添加的特征值必须是1,因为只有是1的情况下载后面的计算中可以直接用w0计算,否则 需要*X0
        dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])#
        labelMat.append(int(lineArr[2]))
    return dataMat, labelMat

#梯度上升算法
def gradAscent(dataMatIn, classLabels):
    dataMatrix = mat(dataMatIn)
    labelMat = mat(classLabels).transpose()#转置矩阵
    m, n = shape(dataMatrix)
    alpha = 0.001#步长
    maxCycles = 500
    weights = ones((n, 1))#weight是待求的
    for k in range(maxCycles):
        h = sigmoid(dataMatrix*weights)
        error = (labelMat - h)
#利用的是梯度上升算法的结论,推导过程看上述的链接
        weights = weights + alpha*dataMatrix.transpose()*error
    return weights

 

你可能感兴趣的:(机器学习实战记录-Logistic回归)