机器学习:logistics回归与sigmoid函数的一点理解(来源于知乎:我爱小徐子)

0 人赞了该文章


逻辑回归

逻辑回归实际上是一种监督学习,需要搞清楚的一个问题是什么叫回归? 回归可以简单的理解为,假设现在有一些数据点,我们用一条直线对这些数据点进行拟合,拟合的这个过程就叫回归。利用logistics回归进行分类的主要思想是:根据现有数据,对分类边界线进行回归的过程。


logistics回归它的优点是计算代价不高,易于理解和实现,但是它可能因为拟合度不高,导致分类精度不高。 对数值型和标称型变量都适用。


个人理解,实际上就是要找到不同分类的“边界线”,而且这条边界线的精度越高越好。它实际上应该是一个二值型分类器。

现在我们要解决的问题就是:当我输入一个物体的时候,能够存在一个函数,这个函数它能给一个答案:0或者1。也就是给出我输入这个物体的种类。 实际上数学上存在这种函数:单位阶跃函数。但是单位阶跃函数的的阶跃点不好控制,所以一般使用sigmiod函数来代替。sigmoid函数的数学表达式为:



其中z为输入参数据,它等于参数向量与输入数据的向量积,所以现在的关键问题就是要确定参数的最佳值,即最佳回归系数。

基于最优化方法的最佳回归系数的确定

z=w0x0+w1x1+w2x2+w3x3+...+wnxn

这里举个例子:假设有一批训练集,有两个特征,最终需要确定一个标称变量,如图:



基于logistics回归梯度上升算法: 代码如下,我来解释以下下面的代码: *代码区***

#coding=utf-8
from numpy import *
def loadSet():
dataMat=[]
labelMat=[]
with open(r'C:\Users\13016\Desktop\2ToData.txt','r',encoding='utf-8') as f:
for i in f.readlines():
lineAttr=i.strip().strip("\ufeff").split()
dataMat.append([1.0,float(lineAttr[0]),float(lineAttr[1])])
labelMat.append(float(lineAttr[2]))
return dataMat,labelMat

def sigmoid(Inx):
return 1.0/(1+exp(-Inx))

def getFactor(dataMat,labelMat):
dataMatrix=mat(dataMat)
labelMatrix=mat(labelMat).transpose()
m,n=shape(dataMatrix)
alpha=0.001
maxCycles=500
weights=ones((n,1),dtype=float)
for k in range(maxCycles):
h=sigmoid(dataMatrix*weights)
error=(labelMatrix-h)
weights=weights+alpha*dataMatrix.transpose()*error
return weights

loadSet函数用来读取训练集,strip方法是出去首尾的空格和tab,split是以空格为间隔切割字符串,最终返回列表。注意将字符串转化为float类型。在python中没有double类型。最终返回特征矩阵dataMat,和已知的分类结果labelMmat。


sigmoid方法,用来进行sigmoid函数拟合。


getFactor方法为主要方法,首先将数组转化为矩阵,求labelMat的转置矩阵(这里我给大家标注一下,此时矩阵的行和列。labelMatrix(n,1),dataMatrix(n,3)) 给定的alpha是梯度优化上升的步长,maxCycles是循环次数。weights为特征权值,(weights(3,1)),经过sigmoid函数求得的h即为“分类结果”,dataMatrix*weights就是z,即w0x0+w1x1+...+wnxn。(h的行和列为h(n,1)). 这里的error可以理解为当为weights权值时,算法所求得的分类,与真实的分类之间的偏差。


最后这条迭代语句即为根据一定的步长和error调整回归系数,使其接近真实值。


最终训练的回归系数结果为:



以上就是最简单的一个基于梯度上升优化算法的logistics回归,下篇文章继续。


转载于:

机器学习:logistics回归与sigmoid函数的一点理解--文章|HUBU生信社区


评论

暂无评论