python实现logistics回归,以及从 疝 气 病 症 预 测 病 马 的 死 亡 率

logistics回 归 的 目 的 是 寻 找 一 个 非 线 性 函 数sigmod的 最 佳 拟 合 参 数。通过迭代来更改参数。选取出最佳拟 合的参数。可以通过梯度上升算法,随机梯度上升算法,牛顿法,拟牛顿法等方法来实现。而一般随机梯度上升算法是用的比较多的一个方法,主要原因是牛顿法的海塞矩阵在数据很多的时候难以计算

数据处理函数
打开文 本文 件 并 逐 行 读 取 。每 行 前 两 个 值 分 别 是 X1 和 X 2 , 第 三 个 值 是 数 据 对 应的 类 别 标 签

def loadDataSet():
    dataMat=[]; labelMat=[]
    fr = open('testSet.txt')
    for line in fr.readlines():
        lineArr=line.strip().split()
        dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
        labelMat.append(int(lineArr[2]))
    return dataMat,labelMat


函 数sigmod
def sigmoid(inX):
    return longfloat( 1.0/(1+exp(-inX)))

改进的 随 机 梯 度 上 升 算 法 第一个参数是训练样本 第二个参数 类 别 标 签 通过迭代选取出最佳的拟 合参数 ,对于超参数随机梯度算法的步长,在迭代过程中一直在变,但是不会变为0

def changgradAscent(dataMatrix,classLabels,numIter):
    m,n = shape(dataMatrix)
    weights = ones(n)
    for j in range(numIter):
        dataIndex = range(m)
        for i in range(m):
            alpha = 4/(1.0+j+i)+0.0001   #每次迭代的时候改变步长   步长会 随 着 迭 代 次 数 不 断 减 小 , 但 永 远 不 会 减 小 到 0
            randIndex = int(random.uniform(0,len(dataIndex)))
            h = sigmoid(sum(dataMatrix[randIndex]*weights))
            error = classLabels[randIndex] - h
            weights = weights + alpha * error * dataMatrix[randIndex]
            del(dataIndex[randIndex])
    return weights # 返回权值

分类函数 ,sigmod 的值大于0.5 返回1

def classfiy(intx ,weight):
    pro=sigmoid(sum(intx*weight))
    if pro> 0.5:
        return 1.0
    else: return 0.0

下面的函数是从 疝 气 病 症 预 测 病 马 的 死 亡 率

def coli():
    Train=open('horseColicTraining.txt');# 训练样本
    Test = open('horseColicTest.txt')#测试样本
    trainSet= []; trainLabel=[]
    for line in Train.readlines():
        currLine=line.strip().split('\t')
        linArr=[]
        for i in range(21):
            linArr.append(float(currLine[i]))
        trainSet.append(linArr)
        trainLabel.append(float(currLine[21]))
    trainWeight=changgradAscent(array(trainSet),trainLabel,100)  # 获取训练后的最佳拟合权值参数
    errorCount = 0;numTest=0.0
    for line in Test.readlines():
        numTest +=1.0
        currLine=line.strip().split('\t')
        lineArr =[]
        for i in range(21):
            lineArr.append(float(currLine[i]))
        if int(classfiy(array(lineArr), trainWeight))!= int(currLine[21]):
            errorCount += 1
    errorRate = (float(errorCount)/numTest)
    print u"错误率是: %f" % errorRate
    return errorRate


测试训练后的结果

def multiTest():
    numTests = 10; errorSum=0.0
    for k in range(numTests):
        errorSum += coli()
    print u"在 %d训练后,评价错误率是: %f" % (numTests, errorSum/float(numTests))

由于数据中有很多噪音,所以测试的正确率并不是很高

采用回归来求最佳拟合参数,求 解 过 程 可 以 由 最 优 化算 法 来 完成 。在 最 优 化 算 法 中 , 最 常 用 的 就 是 梯 度 上 升 算 法 , 而 梯 度 上 升 算 法 又 可 以 简 化 为 随 机梯 度 上 升 算 法 .随 机 梯 度 上 升 算 法 与 梯 度 上 升 算 法 的 效 果 相 当 , 但 占 用 更 少 的 计 算 资 源 。此外 , 随 机 梯 度 上升 是 一 个 在 线 算 法 , 它 可 以 在 新 数 据 到 来 时 就 完成 参 数 更 新 , 而 不 需 要 重 新 读 取 整 个 数 据 集 来 进行 批 处 理 运 算

你可能感兴趣的:(机器学习个人笔记,python,算法,logistics回)