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

xiaoxiao2021-02-28  109

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))

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

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

转载请注明原文地址: https://www.6miu.com/read-75717.html

最新回复(0)