准备:梯度下降算法;(来自吴恩达机器学习)
1.cost函数的引出
定义的引出:确定模型计算出的值与测试样本值之间的差距;更适合大量的数据集;
m代表样本点数,除以m是为了求平均误差(让参数m有了意义),除以2m是一样的,我的理解是:模型在样本值的中间波动,取一半就是一边点的距离,感觉和SVM里有点类似;
是模型函数,猜测的模型,关于x的函数;
是代价函数,关于参数的函数;
当将两个参数同时引入:
注意:上图是一个凸函数,线性回归都是这样的,不会出现局部最优的情况;
2.梯度下降算法
起始点不同,得到局部最优结果可能不同;
关于公式中的加减并不影响,因为斜率有正负,公式不断的迭代,当到达局部极值点,斜率为0,不会更新;
关于振荡的出现,可能因为步长太大;
自动采取了步长变小,因为斜率在不断的变化,等效于步长在不断变化;
功能介绍:
出现原因:线性回归不适合分类问题
当分类较散的情况,出现了距离较远的点,粉色拟合直线可能会变成蓝色的,继续按y轴判断会出现错误;
Logistic回归分类的主要思想:根据现有的数据对分类边界线建立回归公式,以此进行分类。
1.sigmoid函数
计算w,将特征xi归到z上;
方程变成了:
假设函数
(将特征的输出结果转换成了概率的问题)
,求出
的相对于0.5的大小就可以判断类别,Logistic就是通过学习得到w;
问题转换成:与0之间的关系;
代价函数:
根据代价函数的定义,最原本的代价函数应该是红色箭头所示,但是因为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