文档详情

数学专业论文 逻辑回归初步

飞***
实名认证
店铺
DOC
2.55MB
约17页
文档ID:42800802
数学专业论文 逻辑回归初步_第1页
1/17

数学专业论文数学专业论文 逻辑回归初步逻辑回归初步1、总述、总述逻辑回归是应用非常广泛的一个分类机器学习算法,它将数据拟合到一个 logit 函数(或者叫做 logistic 函数)中,从而能够完成对事件发生的概率进行预测 2、由来、由来要说逻辑回归,我们得追溯到线性回归,想必大家对线性回归都有一定的了解,即对于多维空间中存在的样本点,我们用特征的线性组合去拟合空间中点的分布和轨迹如下图所示:线性回归能对连续值结果进行预测,而现实生活中常见的另外一类问题是,分类问题最简单的情况是是与否的二分类问题比如说医生需要判断病人是否生病,银行要判断一个人的信用程度是否达到可以给他发信用卡的程度,邮件收件箱要自动对邮件分类为正常邮件和垃圾邮件等等当然,我们最直接的想法是,既然能够用线性回归预测出连续值结果,那根据结果设定一个阈值是不是就可以解决这个问题了呢?事实是,对于很标准的情况,确实可以的,这里我们套用 Andrew Ng 老师的课件中的例子,下图中 X 为数据点肿瘤的大小,Y 为观测结果是否是恶性肿瘤通过构建线性回归模型,如 hθ(x)所示,构建线性回归模型后,我们设定一个阈值 0.5,预测 hθ(x)≥0.5 的这些点为恶性肿瘤,而 hθ(x)∞,这很好地惩罚了最后的结果。

而对于 y=0 的情况,如下图所示,也同样合理:下面我们说说梯度下降,梯度下降算法是调整参数 θ 使得代价函数 J(θ)取得最小值的最基本方法之一从直观上理解,就是我们在碗状结构的凸函数上取一个初始值,然后挪动这个值一步步靠近最低点的过程,如下图所示:我们先简化一下逻辑回归的代价函数:从数学上理解,我们为了找到最小值点,就应该朝着下降速度最快的方向(导函数/偏导方向)迈进,每次迈进一小步,再看看此时的下降最快方向是哪,再朝着这个方向迈进,直至最低点用迭代公式表示出来的最小化 J(θ)的梯度下降算法如下:5、代码与实现、代码与实现我们来一起看两个具体数据上做逻辑回归分类的例子,其中一份数据为线性判定边界,另一份为非线性示例 1第一份数据为 data1.txt,部分内容如下:我们先来看看数据在空间的分布,代码如下[python] view plaincopy1.from numpy import loadtxt, where 2.from pylab import scatter, show, legend, xlabel, ylabel 3. 4.#load the dataset 5.data = loadtxt('/home/HanXiaoyang/data/data1.txt', delimiter=',') 6. 7.X = data[:, 0:2] 8.y = data[:, 2] 9. 10. pos = where(y == 1) 11. neg = where(y == 0) 12. scatter(X[pos, 0], X[pos, 1], marker='o', c='b') 13. scatter(X[neg, 0], X[neg, 1], marker='x', c='r') 14. xlabel('Feature1/Exam 1 score') 15. ylabel('Feature2/Exam 2 score') 16. legend(['Fail', 'Pass']) 17. show() 得到的结果如下:下面我们写好计算 sigmoid 函数、代价函数、和梯度下降的程序:[python] view plaincopy1.def sigmoid(X): 2. '''''Compute sigmoid function ''' 3. den =1.0+ e **(-1.0* X) 4. gz =1.0/ den 5. return gz 6.def compute_cost(theta,X,y): 7. '''''computes cost given predicted and actual values''' 8. m = X.shape[0]#number of training examples 9. theta = reshape(theta,(len(theta),1)) 10. 11. J =(1./m)*(-transpose(y).dot(log(sigmoid(X.dot(theta))))- transpose(1-y).dot(log(1-sigmoid(X.dot(theta))))) 12. 13. grad = transpose((1./m)*transpose(sigmoid(X.dot(theta))- y).dot(X)) 14. #optimize.fmin expects a single value, so cannot return grad 15. return J[0][0]#,grad 16. def compute_grad(theta, X, y): 17. '''''compute gradient''' 18. theta.shape =(1,3) 19. grad = zeros(3) 20. h = sigmoid(X.dot(theta.T)) 21. delta = h - y 22. l = grad.size 23. for i in range(l): 24. sumdelta = delta.T.dot(X[:, i]) 25. grad[i]=(1.0/ m)* sumdelta *-1 26. theta.shape =(3,) 27. return grad 我们用梯度下降算法得到的结果判定边界是如下的样子:最后我们使用我们的判定边界对 training data 做一个预测,然后比对一下准确率:[python] view plaincopy1.def predict(theta, X): 2. '''''Predict label using learned logistic regression parameters''' 3. m, n = X.shape 4. p = zeros(shape=(m,1)) 5. h = sigmoid(X.dot(theta.T)) 6. for it in range(0, h.shape[0]): 7. if h[it]>0.5: 8. p[it,0]=1 9. else: 10. p[it,0]=0 11. return p 12. #Compute accuracy on our training set 13. p = predict(array(theta), it) 14. print'Train Accuracy: %f'%((y[where(p == y)].size / float(y.size))*100.0) 计算出来的结果是 89.2%示例 2.第二份数据为 data2.txt,部分内容如下:我们同样把数据的分布画出来,如下:我们发现在这个例子中,我们没有办法再用一条直线把两类样本点近似分开了,所以我们打算试试多项式的判定边界,那么我们先要对给定的两个 feature 做一个多项式特征的映射。

比如说,我们做了如下的一个映射:代码如下:[python] view plaincopy1.def map_feature(x1, x2): 2. ''''' 3. Maps the two input features to polonomial features. 4. Returns a new feature array with more features of 5. X1, X2, X1 ** 2, X2 ** 2, X1*X2, X1*X2 ** 2, etc... 6. ''' 7. x1.shape =(x1.size,1) 8. x2.shape =(x2.size,1) 9. degree =6 10. mapped_fea = ones(shape=(x1[:,0].size,1)) 11. m, n = mapped_fea.shape 12. for i in range(1, degree +1): 13. for j in range(i +1): 14. r =(x1 **(i - j))*(x2 ** j) 15. mapped_fea = append(out, r, axis=1) 16. return mapped_fea 17. mapped_fea = map_feature(X[:,0], X[:,1]) 接着做梯度下降:[python] view plaincopy1.def cost_function_reg(theta, X, y, l): 2. '''''Compute the cost and partial derivatives as grads 3. ''' 4. h = sigmoid(X.dot(theta)) 5. thetaR = theta[1:,0] 6. J =(1.0/ m)*((-y.T.dot(log(h)))-((1- y.T).dot(log(1.0- h)))) \ 7. +(l /(2.0* m))*(thetaR.T.dot(thetaR)) 8. delta = h - y 9. sum_delta = delta.T.dot(X[:,1]) 10. grad1 =(1.0/ m)* sumdelta 11. XR = X[:,1:X.shape[1]] 12. sum_delta = delta.T.dot(XR) 13. grad =(1.0/ m)*(sum_delta + l * thetaR) 14. out = zeros(shape=(grad.shape[0], grad.shape[1]+1)) 15. out[:,0]= grad1 16. out[:,1:]= grad 17. return J.flatten(), out.T.flatten() 18. m, n = X.shape 19. y.shape =(m,1) 20. it = map_feature(X[:,0], X[:,1]) 21. #Initialize theta parameters 22. initial_theta = zeros(shape=(it.shape[1],1)) 23. #Use regularization and set parameter lambda to 1 24. l =1 25. # Compute and display initial cost and gradient for regularized logistic 26. # regression 27. cost, grad = cost_function_reg(initial_theta, it, y, l) 。

下载提示
相似文档
正为您匹配相似的精品文档