2016-11-06 90 views
0

考虑以下几点:Sigmoid总是返回1?

def sigmoid(inSig): 
    return 1.0/(1.0+np.exp(-inSig)) 

def classifyVector(inX, weights): 
    prob = sigmoid(sum(inX*weights)) 
    if prob > 0.5: return 1.0 
    else: return 0.0 

我的理解是乙状结肠结果范围从0到1。根据此信息(http://clear-lines.com/blog/post/Logistic-Regression.aspx):

“正值将返回一个值大于0.5 ,输入值越大,越接近1.可以认为函数返回概率:对于x的非常高或低的值,有很高的确定性,它属于两组中的一组,并且对于值接近零,每组的概率是50%/ 50%。“

但是,如果Sigmoid(0),sigmoid似乎只产生0.5(即,零分类)。除非inX或权重为零(或零向量),否则classifyVector总是返回1?

例如,请考虑以下数据:

trainset = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]]) 
trainlbl = np.array([1,12,11,40]) 

这里,INX将永远是零。如果算出数学,权重也不会为零。那么,乙状结肠怎么能提供一个公平的分析呢?

+0

可能取代l中的1。 2用1.0吗?据我记得Python,这可能会改变整个类型的devision。 [这是神经网络吗?] – Unknown

+1

param为什么叫inSig和var inX? – Unknown

+0

我编辑它。这是为了逻辑回归。 – swabygw

回答

0

但是,如果Sigmoid(0),sigmoid似乎只产生0.5(即,零分类)。除非inX或权重为零(或零向量),否则classifyVector总是返回1?

0.5是一个阈值,而不是人们必须达到的。 classifyVector将返回1 iff sigmoid生成超过 0.5。还有很多剩余值 - 一切在0和0.5之间。您正确地获得0.5的确实非常罕见,但这不是问题,因为每个小于0.5的值都会导致分类“0”。基本上(如果你计算数学),你将得到分类1 iff inSig是正数(如果是负数则为0)。由于通过S形挤压使得正值变得大于0.5并且负值小于0.5(同时,如你所述 - 零变换为0.5)。