1.基于Logistic回归和Sigmoid函数的分类

2.基于最优化方法的最佳回归系数确定

2.1 梯度上升法

参考:机器学习——梯度下降算法

2.2 训练算法:使用梯度上升找到最佳参数

Logistic回归梯度上升优化算法

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])]) #加上第0维特征值
labelMat.append(int(lineArr[2]))
return dataMat,labelMat #返回数据矩阵和标签向量 def sigmoid(inX):
return 1.0/(1+exp(-inX)) def gradAscent(dataMatIn, classLabels): #Logistic回归梯度上升优化算法
dataMatrix = mat(dataMatIn) #由列表转换成NumPy矩阵数据类型,dataMatrix是一个100×3的矩阵
labelMat = mat(classLabels).transpose() #由列表转换成NumPy矩阵数据类型,labelMat是一个100×1的矩阵
m,n = shape(dataMatrix) #shape函数取得矩阵的行数和列数,m=100,n=3
alpha = 0.001 #向目标移动的步长
maxCycles = 500 #迭代次数
weights = ones((n,1)) #3行1列的矩阵,这个矩阵为最佳的回归系数,和原来的100×3相乘,可以得到100×1的结果
for k in range(maxCycles):
h = sigmoid(dataMatrix*weights) #矩阵相乘,得到100×1的矩阵,即把dataMat的每一行的所有元素相加
error = (labelMat - h) #求出和目标向量之间的误差
#梯度下降算法
weights = weights + alpha * dataMatrix.transpose()* error #3×100的矩阵乘以100×1的矩阵,weights是梯度算子,总是指向函数值增长最快的方向
return weights #返回一组回归系数,确定了不同类别数据之间的分割线
    dataMat,labelMat = loadDataSet()
print gradAscent(dataMat,labelMat) #输出回归系数
[[ 4.12414349]
[ 0.48007329]
[-0.6168482 ]]

2.3 分析数据:画出决策边界

 画出数据集和Logistic回归最佳拟合直线的函数

def plotBestFit(wei):			#画出数据集和Logistic回归最佳拟合直线的函数
import matplotlib.pyplot as plt
weights = wei.getA()
dataMat,labelMat=loadDataSet() #数据矩阵和标签向量
dataArr = array(dataMat) #转换成数组
n = shape(dataArr)[0]
xcord1 = []; ycord1 = [] #声明两个不同颜色的点的坐标
xcord2 = []; ycord2 = []
for i in range(n):
if int(labelMat[i])== 1:
xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])
else:
xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
ax.scatter(xcord2, ycord2, s=30, c='green')
x = arange(-3.0, 3.0, 0.1)
#最佳拟合曲线,这里设w0x0+w1x1+w2x2=0,因为0是两个分类(0和1)的分界处(Sigmoid函数),且此时x0=1
#图中y表示x2,x表示x1
y = (-weights[0]-weights[1]*x)/weights[2]
ax.plot(x, y)
plt.xlabel('X1'); plt.ylabel('X2');
plt.show()

    dataMat,labelMat = loadDataSet()
#print dataMat
#print labelMat
#print gradAscent(dataMat,labelMat) #输出回归系数
plotBestFit(gradAscent(dataMat,labelMat))

2.4 训练算法:随梯度上升

def stocGradAscent0(dataMatrix, classLabels):	#随机梯度上升算法
m,n = shape(dataMatrix)
alpha = 0.01
weights = ones(n) #3行1列的矩阵,初始最佳回归系数都为1,
for i in range(m):
h = sigmoid(sum(dataMatrix[i]*weights)) #计算出是数值,而不是向量,dataMatrix[100×3]中取得[1×3],乘以[3×1],得到数值
error = classLabels[i] - h
weights = weights + alpha * error * dataMatrix[i]
return weights def plotBestFit(weights): #画出数据集和Logistic回归最佳拟合直线的函数
import matplotlib.pyplot as plt
#weights = wei.getA()
dataMat,labelMat=loadDataSet() #数据矩阵和标签向量
dataArr = array(dataMat) #转换成数组
n = shape(dataArr)[0]
xcord1 = []; ycord1 = [] #声明两个不同颜色的点的坐标
xcord2 = []; ycord2 = []
for i in range(n):
if int(labelMat[i])== 1:
xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])
else:
xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
ax.scatter(xcord2, ycord2, s=30, c='green')
x = arange(-3.0, 3.0, 0.1)
#最佳拟合曲线,这里设w0x0+w1x1+w2x2=0,因为0是两个分类(0和1)的分界处(Sigmoid函数),且此时x0=1
#图中y表示x2,x表示x1
y = (-weights[0]-weights[1]*x)/weights[2]
ax.plot(x, y)
plt.xlabel('X1'); plt.ylabel('X2');
plt.show()
    dataMat,labelMat = loadDataSet()
#print dataMat
#print labelMat
#print gradAscent(dataMat,labelMat) #输出回归系数
#plotBestFit(gradAscent(dataMat,labelMat))
plotBestFit(stocGradAscent0(array(dataMat),labelMat))

改进的随机梯度上升算法

def stocGradAscent1(dataMatrix, classLabels, numIter=150):
m,n = shape(dataMatrix)
weights = ones(n) #初始化回归系数
for j in range(numIter): #从0到149开始循环
dataIndex = range(m)
for i in range(m): #从0到99开始循环
alpha = 4/(1.0+j+i)+0.0001 #步进alpha的值逐渐减小,j=0-150,i=1-100,使得收敛的速度加快
randIndex = int(random.uniform(0,len(dataIndex))) #样本随机选择0-99中的一个数计算回归系数,减小周期性波动的现象
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex] - h
weights = weights + alpha * error * dataMatrix[randIndex]
del(dataIndex[randIndex])
return weights

示例:从疝气病症预测病马的死亡率

 1.准备数据:处理数据中的缺失值

2.测试算法:使用Logistic回归进行分类

def classifyVector(inX, weights):	#输入回归系数和特征向量,计算出Sigmoid值,如果大于0.5则返回1,否则返回0
prob = sigmoid(sum(inX*weights))
if prob > 0.5: return 1.0
else: return 0.0 def colicTest():
frTrain = open('horseColicTraining.txt'); frTest = open('horseColicTest.txt')
trainingSet = []; trainingLabels = []
for line in frTrain.readlines(): #导入训练数据
currLine = line.strip().split('\t')
lineArr =[]
for i in range(21): #把0-20个病症加到列表中
lineArr.append(float(currLine[i]))
trainingSet.append(lineArr) #把得到的每个列表加到训练集合中
trainingLabels.append(float(currLine[21])) #把标签加到训练标签中
trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 1000) #使用改进的随机梯度上升算法,递归1000次,计算回归系数
errorCount = 0; numTestVec = 0.0
for line in frTest.readlines(): #导入测试数据
numTestVec += 1.0 #测试数据的总数
currLine = line.strip().split('\t')
lineArr =[]
for i in range(21): #把0-20个病症加到列表中,作为分类器的输入
lineArr.append(float(currLine[i]))
if int(classifyVector(array(lineArr), trainWeights))!= int(currLine[21]): #计算分类错误的次数,currLine[21]表示真正死亡与否
errorCount += 1
errorRate = (float(errorCount)/numTestVec) #计算错误率
print "the error rate of this test is: %f" % errorRate
return errorRate def multiTest(): #调用colicTest()十次并求结果的平均值
numTests = 10; errorSum=0.0
for k in range(numTests):
errorSum += colicTest()
print "after %d iterations the average error rate is: %f" % (numTests, errorSum/float(numTests))

机器学习——Logistic回归的更多相关文章

  1. 机器学习——Logistic回归

    参考<机器学习实战> 利用Logistic回归进行分类的主要思想: 根据现有数据对分类边界线建立回归公式,以此进行分类. 分类借助的Sigmoid函数: Sigmoid函数图: Sigmo ...

  2. 机器学习——logistic回归,鸢尾花数据集预测,数据可视化

    0.鸢尾花数据集 鸢尾花数据集作为入门经典数据集.Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理.Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集.数据集包含150个数 ...

  3. 机器学习--Logistic回归

    logistic回归 很多时候我们需要基于一些样本数据去预测某个事件是否发生,如预测某事件成功与失败,某人当选总统是否成功等. 这个时候我们希望得到的结果是 bool型的,即 true or fals ...

  4. coursera机器学习-logistic回归,正则化

    #对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...

  5. 机器学习 Logistic 回归

    Logistic regression 适用于二分分类的算法,用于估计某事物的可能性. logistic分布表达式 $ F(x) = P(X<=x)=\frac{1}{1+e^{\frac{-( ...

  6. 机器学习-- Logistic回归 Logistic Regression

    转载自:http://blog.csdn.net/linuxcumt/article/details/8572746 1.假设随Tumor Size变化,预测病人的肿瘤是恶性(malignant)还是 ...

  7. 吴恩达-机器学习+Logistic回归分类方案

  8. 机器学习简易入门(四)- logistic回归

    摘要:使用logistic回归来预测某个人的入学申请是否会被接受 声明:(本文的内容非原创,但经过本人翻译和总结而来,转载请注明出处) 本文内容来源:https://www.dataquest.io/ ...

  9. 机器学习(4)之Logistic回归

    机器学习(4)之Logistic回归 1. 算法推导 与之前学过的梯度下降等不同,Logistic回归是一类分类问题,而前者是回归问题.回归问题中,尝试预测的变量y是连续的变量,而在分类问题中,y是一 ...

随机推荐

  1. 使用gulp解决RequireJS项目前端缓存问题(一)

    1.前言 前端缓存一直是个令人头疼的问题,你有可能见过下面博客园首页的资源文件链接: 有没有发现文件名后面有一串不规则的东东,没错,这就是运用缓存机制,我们今天研究的就是这种东西. 先堵为快,猛戳链接 ...

  2. SQL SERVER 2008复制数据库时发生执行SQL Server代理作业错误

    1. 情况说明 在利用SQL SERVER数据库复制向导,能够很方便的将一个数据库从一台服务器复制到另一台服务器上,具体操作步骤也十分简单. 不过在实际操作过程常发生“执行SQL SERVER代理作业 ...

  3. MySQL 5.7.10 自动备份、自动清理旧备份集

    http://blog.csdn.net/mchdba/article/details/51527081 MySQL版本是5.7.10-log社区版本,需要进行备份,但是备份时间长了后,磁盘不够用,所 ...

  4. WinformWPF 多线程访问控件【转】

    大家知道WPF中多线程访问UI控件时会提示UI线程的数据不能直接被其他线程访问或者修改,该怎样来做呢? 分下面两种情况 1.WinForm程序 )第一种方法,使用委托: private delegat ...

  5. MFC快速入门 - 菜单

    本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6231104.html 打开VS2010,依次打开File – New – Proje ...

  6. Appium+python的一个简单完整的用例

    最近一直在忙,终于有时间来整理一下,传一个简单的用例,运行之后可以看到用例的报告,希望对大家有帮助. HTMLTestRunner这个包网上有很多,大家可以自己下载. 1 import unittes ...

  7. [LeetCode] Restore IP Addresses 复原IP地址

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  8. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

  9. C语言中函数的传入值与传出值

    看到一个函数的原型后,怎么样一眼看出来哪个参数做输入哪个做输出? 函数传参如果传的是普通变量(不是指针)那肯定是输入型参数: 如果传指针就有 2 种可能性了,为了区别,经常的做法是: 如果这个参数是做 ...

  10. 信鸽推送 10004,os文件配置出错,解决办法

    信鸽推送注册失败 返回码 10004 是 os  配置出现问题 经过询问客服,得到以下解决办法 将SDK中的so文件复制下来 新建文件夹jniLibs,并将 so 配置文件粘贴进去 便可完成注册