logistic regression教程1

实现线性拟合

我们用python2.7实现上一篇的推导结果。请先安装python matplotlib包和numpy包。

具体代码如下:

#!/usr/bin/env python
#! -*- coding:utf-8 -*-

import matplotlib.pyplot as plt
from numpy import *

#创建数据集
def load_dataset():
    n = 100
    X = [[1, 0.005*xi] for xi in range(1, 100)]
    Y = [2*xi[1]  for xi in X]
    return X, Y

#梯度下降法求解线性回归
def grad_descent(X, Y):
    X = mat(X)
    Y = mat(Y)
    row, col = shape(X)
    alpha = 0.001
    maxIter = 5000
    W = ones((1, col))
    for k in range(maxIter):
        W = W + alpha * (Y - W*X.transpose())*X
    return W

def main():
    X, Y = load_dataset()
    W = grad_descent(X, Y)
    print "W = ", W

    #绘图
    x = [xi[1] for xi in X]
    y = Y
    plt.plot(x, y, marker="*")
    xM = mat(X)
    y2 = W*xM.transpose()
    y22 = [y2[0,i] for i in range(y2.shape[1]) ]
    plt.plot(x, y22, marker="o")
    plt.show()

if __name__ == "__main__":
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

代码超级简单,load_dataset函数创建了一个y=2x的数据集,grad_descent函数求解优化问题。

在grad_descent里多了两个小东西,alpha是学习速率,一般取0.001~0.01,太大可能会导致震荡,求解不稳定。maxIter是最大迭代次数,它决定结果的精确度,通常是越大越好,但越大越耗时,所以通常需要试算以下,也可以另外写一个判定标准,比如当Y−WXT小于多少的时候就不再迭代。

我们来看一下效果: 
当maxIter=5时,拟合结果是这样的: 

如果maxIter=50,拟合结果是这样的: 

如果maxIter=500,拟合结果是这样的: 

如果maxIter=1000,拟合结果是这样的: 

如果maxIter=5000,拟合结果是这样的: 

5000次的结果几乎完美,两条曲线图形重合。就酱。 
本篇到此结束,下一篇,我们开始把logistic函数加进来,推导logistic regression。

时间: 2024-10-07 05:06:24

logistic regression教程1的相关文章

logistic regression教程3

在线性拟合的基础上,我们实现logistic regression. 如前所述,样本集是 {x1,y1},{x2,y2},...,{xn,yn}[1] 其中,xi=[1,xi,1,xi,2,xi,3,...,xi,k]T,且yi∈(0,1).注意,这里对yi有值上的要求,必须如此,如果值不再这个区间,要以归一化的方式调整到这个区间.对于分类问题,则yi的取值或者是0,或者是1,也就是yi∈{0,1}. 当然,从严格的意义上说,logistic regression拟合后,yi的值只能无限地逼近0

最详细的基于R语言的Logistic Regression(Logistic回归)源码,包括拟合优度,Recall,Precision的计算

这篇日志也确实是有感而发,我对R不熟悉,但实验需要,所以简单学了一下.发现无论是网上无数的教程,还是书本上的示例,在讲Logistic Regression的时候就是给一个简单的函数及输出结果说明.从来都没有讲清楚几件事情: 1. 怎样用训练数据训练模型,然后在测试数据上进行验证(测试数据和训练数据可能有重合)? 2. 怎样计算预测的效果,也就是计算Recall,Precision,F-measure等值? 3. 怎样计算Nagelkerke拟合优度等评价指标? 发现这些书本和一些写博客的朋友,

ufldl学习笔记与编程作业:Logistic Regression(逻辑回归)

ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl. 于是最近就开始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节学习链接:http://ufldl.stanford.edu/tutorial/supervised/LogisticRegression/ 有了线性回归的基础再来学

[机器学习] Coursera ML笔记 - 逻辑回归(Logistic Regression)

引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等,主要学习资料来自Standford Andrew Ng老师在Coursera的教程以及UFLDL Tutorial,Stanford CS231n等在线课程和Tutorial,同时也参考了大量网上的相关资料(在后面列出). 前言 本文主要介绍逻辑回归的基础知识,文章小节安排如下: 1)逻辑回归定义 2)假设函数(Hypothesis function

logistic regression 以及梯度下降

先说下线性回归(直接上图) 如上图所示,根据肿瘤尺寸数据进行判断.设hypothesis函数为根据上图可以看出线性h(x)能够将上述数据进行有效分类,当h(x)>0.5,则为肿瘤患者,当h(x)<0.5,则为正常.但是线性模型会出现下面的一种情况 此时通过调整线性模型的参数后最终得到的线性模型为蓝色的直线,此时就会发现最右侧的红色叉号被预测成了正常,这显然是不合理的,并且后果是严重的(人家有病,你预测正常,影响治疗.....),此外以二分类为例子,假设label={0,1},但是我们使用线性模

Logistic Regression & Classification (1)

一.为什么不使用Linear Regression 一个简单的例子:如果训练集出现跨度很大的情况,容易造成误分类.如图所示,图中洋红色的直线为我们的假设函数 .我们假定,当该直线纵轴取值大于等于0.5时,判定Malignant为真,即y=1,恶性肿瘤:而当纵轴取值小于0.5时,判定为良性肿瘤,即y=0. 就洋红色直线而言,是在没有最右面的"×"的训练集,通过线性回归而产生的.因而这看上去做了很好的分类处理,但是,当训练集中加入了右侧的"×"之后,导致整个线性回归的结

对Logistic Regression 的初步认识

线性回归 回归就是对已知公式的未知参数进行估计.比如已知公式是y=a∗x+b,未知参数是a和b,利用多真实的(x,y)训练数据对a和b的取值去自动估计.估计的方法是在给定训练样本点和已知的公式后,对于一个或多个未知参数,机器会自动枚举参数的所有可能取值,直到找到那个最符合样本点分布的参数(或参数组合).也就是给定训练样本,拟合参数的过程,对y= a*x + b来说这就是有一个特征x两个参数a b,多个样本的话比如y=a*x1+b*x2+...,用向量表示就是y =  ,就是n个特征,n个参数的拟

Coursera台大机器学习课程笔记9 -- Logistic Regression

这一节课主要讲如何用logistic regression做分类. 在误差衡量问题上,选取了最大似然函数误差函数,这一段推导是难点. 接下来是如何最小化Ein,采用的是梯度下降法,这个比较容易. 参考:http://beader.me/mlnotebook/section3/logistic-regression.html http://www.cnblogs.com/ymingjingr/p/4330304.html

logistic regression编程练习

本练习以<机器学习实战>为基础, 重现书中代码, 以达到熟悉算法应用为目的 1.梯度上升算法 新建一个logRegres.py文件, 在文件中添加如下代码: from numpy import * #加载模块 numpy def loadDataSet(): dataMat = []; labelMat = [] #加路径的话要写作:open('D:\\testSet.txt','r') 缺省为只读 fr = open('testSet.txt') #readlines()函数一次读取整个文件