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))
由于数据中有很多噪音,所以测试的正确率并不是很高
采用回归来求最佳拟合参数,求 解 过 程 可 以 由 最 优 化算 法 来 完成 。在 最 优 化 算 法 中 , 最 常 用 的 就 是 梯 度 上 升 算 法 , 而 梯 度 上 升 算 法 又 可 以 简 化 为 随 机梯 度 上 升 算 法 .随 机 梯 度 上 升 算 法 与 梯 度 上 升 算 法 的 效 果 相 当 , 但 占 用 更 少 的 计 算 资 源 。此外 , 随 机 梯 度 上升 是 一 个 在 线 算 法 , 它 可 以 在 新 数 据 到 来 时 就 完成 参 数 更 新 , 而 不 需 要 重 新 读 取 整 个 数 据 集 来 进行 批 处 理 运 算
全部评论 (0)
还没有任何评论哟~
