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. swift-字符和字符串

    OC定义字符: char charValue = 'a'; swift定义字符: var charValue : Character = "a" Unicode 国际标准的文本编码 ...

  2. 归档NSKeyedArchiver解归档NSKeyedUnarchiver与文件管理类NSFileManager (文件操作)

    ========================== 文件操作 ========================== 一.归档NSKeyedArchiver 1.第一种方式:存储一种数据. // 归档 ...

  3. Storm中遇到的日志多次重写问题(一)

    业务描述: 统计从kafka spout中读取的数据条数,以及写入redis的数据的条数,写入hdfs的数据条数,写入kafaka的数据条数.并且每过5秒将数据按照json文件的形式写入日志.其中保存 ...

  4. SQL语句中的where 1=1 和0=1

    摘自:http://blog.sina.com.cn/s/blog_afe616ab0101camd.html SQL where 1=1 和0=1的作用 where 1=1; 这个条件始终为True ...

  5. Linux下面安装MySQL

  6. 算法是什么我记不住,But i do it my way. (二)

    昨天做了一道算法题给大家分享了下我的解法,有给出建设性意见的,有支持的还有看得一知半解的.自己想了想的确有可以优化的地方,贴出优化方案.原题和解答过程在这里http://www.cnblogs.com ...

  7. 利用联合双边滤波或引导滤波进行升采样(Upsampling)技术提高一些耗时算法的速度。

    这十年来,在图像处理领域提出了很多新的图像分析和处理方法,包括是自动的以及一些需要有人工参与的,典型的比如stereo depth computations.image colorization.to ...

  8. windows系统下fis3安装教程

    注意:在安装fis3前必须安装node和npm,详情请见官网http://nodejs.org node版本要求 0.8.x,0.10.x, 0.12.x,4.x,6.x,不在此列表中的版本不予支持. ...

  9. Weekly Traning Farm 16

    先安利一下这套比赛,大概是doreamon搞的,每周五晚上有一场,虽然没人做题目质量挺高的 http://codeforces.com/group/gRkn7bDfsN/contests(报名前要先报 ...

  10. SQL用法操作合集

    SQL用法操作合集   一.表的创建 1.创建表 格式: 1 CREATE TABLE 表名 2 (列名 数据类型(宽度)[DEFAULT 表达式][COLUMN CONSTRAINT], 3 ... ...