机器学习之逻辑回归模型
- 1、逻辑回归模型介绍
- 2、逻辑回归数学原理
- 3、算法及Python实现
- 4、小结
1、逻辑回归模型介绍
这里主要介绍二项逻辑回归模型,逻辑回归是一种分类模型,由条件概率分布P(Y|X)表示,形式为参数化的逻辑斯提分布。这里,随机变量X取值为实数,随机变量Y取值为1或0,通过监督学习的方法来估计模型参数。
2、逻辑回归数学原理
Logistic回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别),所以利用了Sigmoid函数(或称为Logistic函数),函数形式为:
Sigmoid 函数如下图所示
逻辑回归的损失函数定义如下(具体推导过程可以查阅其他资料,这里不再赘述)
注:公式中的h为sigmoid函数
梯度下降法求的最小值
θ更新过程:
即:
3、算法及Pyhton实现
输入:训练数据T={(
x1,y1),(x2,y2),⋯,(xm,ym
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
m
,
y
m
)},其中
xi=(x(1)i,x(2)i,⋯,x(n)i,)T,x(j)i
x
i
=
(
x
i
(
1
)
,
x
i
(
2
)
,
⋯
,
x
i
(
n
)
,
)
T
,
x
i
(
j
)
是第i个样本的第j个特征,
ym
y
m
表示第m个样本的标签。
输出:实例x的类。
Python实现代码如下(所用到的数据集horse.rar)
from numpy import *
def sigmoid(inX):
return 1.0/(1+exp(-inX))
def stocGradDescent1(dataMatrix,classLabels,numIter=150):
m,n = shape(dataMatrix)
weights = ones(n)
for j in range(numIter):
dataIndex = list(range(m))
for i in range(m):
alpha = 4/(1.0+j+i)+0.01
randIndex = int(random.uniform(0,len(dataIndex)))
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = h - classLabels[randIndex]
weights = weights - alpha *error*dataMatrix[randIndex]
del(dataIndex[randIndex])
return weights
def classifyVector(inX,weights):
prob = sigmoid(sum(inX*weights))
if prob > 0.5:
return 1.0
else:
return 0.0
def colicTest():
frTrain = open('./horse/horseColicTraining.txt')
frTest = open('./horse/horseColicTest.txt')
trainingSet =[]; trainingLabels = []
for line in frTrain.readlines():
currLine = line.strip().split('\t')
lineArr = []
for i in range(21):
lineArr.append(float(currLine[i]))
trainingSet.append(lineArr)
trainingLabels.append(float(currLine[21]))
trainWeights = stocGradDescent1(array(trainingSet),trainingLabels,500)
errorCount = 0; numTestVec = 0.0
for line in frTest.readlines():
numTestVec += 1.0
currLine = line.strip().split('\t')
lineArr = []
for i in range(21):
lineArr.append(float(currLine[i]))
predClass = int(classifyVector(array(lineArr),trainWeights))
groundLabel = int(currLine[21])
if predClass != groundLabel:
errorCount += 1
errorRate = (float(errorCount)/numTestVec)
print('The Predict Class is %d'%predClass),
print('The Ground Truth is %d'%groundLabel)
print('the error rate of this test is: %f'%errorRate)
return errorRate
def multiTest():
numTests = 10; errorSum = 0.0
for k in range(numTests):
errorSum += colicTest()
print("after %d iterations the average error rate is: %f"%(numTests,errorSum/float(numTests)))
执行程序
multiTest()
输出结果如下
4、小结
Logistic回归的目的是寻找一个非线性函数Sigmoid的最佳拟合参数,求解过程可以由最优化算法完成,最常见的是梯度下降算法,又可以简化为随机梯度下降算法(SGD),逻辑回归在机器学习中运用非常普遍,值得大家研究透彻。