logistic regression就是逻辑回归。感觉上就是把数据进行分类,然后对输入样本进行预测。
为了区分许多邮件中存在的垃圾邮件,
我们假设:
y = 1 不是垃圾邮件
y = 0 是垃圾邮件
要是y只能去0或1,提出了sigmoid函数
定义:
g(z) >= 0.5, y=1
g(z) < 0.5, y=1
然后定义一组数据{x1,x2,x3..,xn}代表邮件信息
所以当h(x) >= 0.5 ,y = 1;h(x) < 0.5, y = 0;
cost function :
Gradient Descent:
伪代码如下:
每一个回归系数为1:
重复R次:
计算数据
更新回归系数
返回回归系数
书上例举了三种更新回归系数的方法。
1.计算alphas*回归系数的向量(计算整个数据集)
def gradient(dataArr,labelArr):
dataArr = np.mat(dataArr)
labelArr = np.mat(labelArr).transpose()
m,n = np.shape(dataArr)
alphas = 0.001
weights = np.ones((n,1))
for i in range(500):
h = sigmoid(dataArr*weights)
error = labelArr - h
weights = weights + alphas * dataArr.transpose() * error
return weights.tolist()
结果图
2.计算alphas*回归系数的向量(计算当前样本的)
def gradient0(dataArr,labelArr):
m,n = np.shape(dataArr)
weights = np.ones(n)
alphas = 0.01
for i in range(m):
h = sigmoid(sum(dataArr[i]*weights))
error = labelArr[i] - h
weights = weights + alphas * error * np.array(dataArr[i])
return weights
结果图:
3.时时更新alphas*回归系数(随机取样)
def gradient1(dataArr,labelArr,num=150):
m,n = np.shape(dataArr)
weights = np.ones(n)
for i in range(num):
dataIndex = range(m)
for j in range(m):
alphas = 4/(1.0+j+i) + 0.01
randomIndex = int(np.random.uniform(0,len(dataIndex)))
h = sigmoid(sum(dataArr[randomIndex]*weights))
error = labelArr[randomIndex] - h
weights = weights + alphas * error * np.array(dataArr[randomIndex])
np.delete(dataIndex,dataIndex[randomIndex])
return weights
结果图