逻辑回归常用于分类问题,最简单诸如二分类问题:是否是垃圾邮件?比赛是赢是输?
对于线性回归问题, z = w0*x0+w1*x1+w2*x2+...
一般的通过最小二乘法学习参数w来预测 给定一个x值时z的大小,其值域在(-∞,+∞),而对于分类问题,显然预测值是离散的,通过引入S函数先将值域y缩小到(0,1),这样子,
当y>=0.5, 可分为正例
当y<0.5,可分为负例。这样预测问题就转化为分类问题了。
那么预测函数就写成
其中Z=ω.T x , ω是参数列向量,x是样本向量
那么样本xj为 正例的概率可以表示成
import numpy as np def predict(x,w): return 1.0/1.0+np.e**(-x.dot(w)))
平方损失函数
def cost(x, y, w): m = y.size prediction = predict(x,w) error = prediction - y co = (1.0/(2.0*m)) * error.T.dot(error) return co
现在的问题是如何求出w , 再回头看看也没发现可以求出w的表达式,这时候我们想如果损失函数越小,那么我们的预测结果就会越好,而损失函数是个凸函数,凸函数有全局最优解,这样子就比较好办了,可以考虑SGD方法,通过迭代更新w来逐渐求得最小值。
α是步长,也称为学习速率,α旁边的因子就是由损失函数计算出来梯度值。
def iter_w(x, y, a, w): prediction = predict(x,w) g = (prediction - y) * x w = w+ a * g * (1.0 / y.size) return w
迭代,max_epochs表示迭代数
while counter < max_epochs: counter += 1 for i in range(len(Y)): w = update(X[i,:], Y[i], a, w)
在实际学习中需要测试 不同的步长对学习结果的影响,进而选取比较合适的步长
from sklearn.cross_validation import KFold
时间: 2024-10-08 17:05:49