爱吧机器人网 » 技术 > 机器学习 > 正文

机器学习:看懂逻辑回归,实现用户分类

九哥使用的开发语言为Python3.5,不同版本请自动调整版本之间的用法差异。
 
本demo为九哥学习过程中的一个实例,训练数据和测试数据请自备。
 
###Logistic回归梯度上升算法
 
#conding:utf-8
 
from numpy import *
 
import math
 
import matplotlib.pyplot as plt
 
###导入数据
 
def loadDataSet():
 
dataMat = []
 
labelMat = []
 
fr = open(r'D:*****testSet.txt') #打开本地文件
 
for line in fr.readlines(): #逐行读取文本中的数据
 
lineArr = line.strip().split() #将文本中的每行的字符一个个分开,变成list。strip() 方法用于移除字符串头尾指定的字符(默认为空格)。
 
dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])]) #将读取的数据列表的前2个字段添加到列表dataMat,为了好计算在dataMat列表中添加值1.0
 
labelMat.append(int(lineArr[2])) #将读取数据的第三个字段赋值给列表labelMat
 
return dataMat,labelMat
 
###定义sigmoid函数
 
def sigmoid(inX):
 
return 1.0/(1+exp(-inX))
 
###梯度上升方法求出回归系数
 
def gradAscent(data,label):
 
dataMat = mat(data) #将获取的数据转换为numpy矩阵类型
 
labelMat = mat(label).transpose() #将行向量转变为列向量
 
m,n = shape(dataMat) #返回dataMat矩阵向量的纬数(m),和行数(n)
 
alpha = 0.001 #设置移动步长
 
maxCycles = 500 #设置迭代次数
 
weights = ones((n,1)) #生成一个n行1列全由数字1组成的数组,初始回归系数
 
for item in range(maxCycles): #迭代500次训练回归系数
 
h = sigmoid(dataMat * weights) #预测每个样本的类别,h是一个列向量,向量元素等于样本个数
 
error = (labelMat - h) #计算真实类别与预测类别的差值,labelMat元素数据类型应是int
 
weights = weights + alpha * dataMat.transpose() * error #乘以误差值和步长,更新系数
 
return weights
 
测试:
 
\
 
data,label =logRegres.loadDataSet()
 
logRegres.plotBestFit(logRegres.gradAscent(data,label).getA())
 
####画出数据集和Logistic回归最佳拟合直线的函数
 
def plotBestFit(weights):
 
import matplotlib.pyplot as plt #导入Matplotlib画图工具
 
dataMat,labelMat = loadDataSet()
 
dataArr = array(dataMat) #将列表转为数组
 
n = shape(dataArr)[0] #获取样本的行数
 
xcode1 = []
 
ycode1 = []
 
xcode2 = []
 
ycode2 = []
 
for i in range(n):
 
if int(labelMat[i]) == 1: #遍历所有样本,分别抽取i样本类别为1和0的x,y坐标
 
xcode1.append(dataArr[i,1])
 
ycode1.append(dataArr[i,2])
 
else:
 
xcode2.append(dataArr[i,1])
 
ycode2.append(dataArr[i,2])
 
fig = plt.figure() #建图
 
ax = fig.add_subplot(111) #111表示画一行一列的第一幅图
 
ax.scatter(xcode1,ycode1,s = 30,c = 'red',marker = 's')
 
ax.scatter(xcode2,ycode2,s = 30,c = 'green')
 
x = arange(-3.0,3.0,0.1) #x线的范围,-3到3之间,间隔为0.1
 
###画出直线,weights[0]*1.0+weights[1]*x+weights[2]*y=0
 
###之前计算时对原始数据做了拓展,将2维拓展为三维,第一位全部设置为1.0
 
y = (-weights[0] - weights[1] * x) / weights[2]
 
ax.plot(x,y)
 
plt.xlabel('x1')
 
plt.ylabel('y1')
 
plt.show()
 
测试:
 
data,label = loadDataSet()weights = gradAscent(data,label)plotBestFit(weights.getA())

\
 
###梯度上升优化
 
def stocGradAscent1(dataMatrix,classLabels,numIter=150):
 
m,n = shape(dataMatrix) #返回参数dataMatrix向量参数的纬数(m)和行数(n)
 
weights = ones(n) #生成一个n行全由数字1组成的数组,初始回归系数
 
for j in range(numIter): #遍历150次
 
dataIndex = list(range(m)) #原因是python3中range不返回数组对象,而是返回range对象,所以range前加list转变类型
 
for i in range(m):
 
alpha = 4/(1.0+j+i)+0.0001 #遍历优化步长,每次迭代时调整。j是迭代次数,i是样本点的下标
 
randIndex = int(random.uniform(0,len(dataIndex))) #随机选取一个0到dataIndex长度之间的实数
 
h = sigmoid(sum(dataMatrix[randIndex]*weights)) #通过sigmoid算法预测每个样本的类别,h是一个列向量,向量元素等于样本个数
 
error = classLabels[randIndex] - h ##计算真实类别与预测类别的差值
 
weights = weights + alpha * error * dataMatrix[randIndex] #乘以误差值和步长,更新系数
 
del(dataIndex[randIndex]) #删除dataIndex集合的下标第randIndex个元素
 
return weights
 
###贷款用户Logistic回归分类函数
 
def classifyVector(inx,weights):
 
prob = sigmoid(sum(inx*weights)) #将测试集上每个特征向量乘以最优化方法得来回归系数,再将乘积结果求和,输入到sigmoid函数中
 
if prob > 0.5 : return 1.0
 
else : return 0.0
 
###打开训练集和测试集,对数据进行格式化处理
 
def BorrowerTest():
 
frTrain = open(r'D:Machine LearningmachinelearninginactionCh05horseColicTraining.txt') #打开训练集
 
frTest = open(r'D:Machine LearningmachinelearninginactionCh05horseColicTest.txt') #打开测试集
 
trainingSet = [] #建立训练原数据集合
 
trainingLabels = [] #建立类别标签集合
 
for line in frTrain.readlines(): #逐行读取训练集中的数据
 
currLine = line.strip().split('') #每行数据按制表符分割
 
lineArr = []
 
for i in range(21):
 
lineArr.append(float(currLine[i])) #将每行的24个特征数据添加到集合,range(24)下标0-24,但是不包含24
 
trainingSet.append(lineArr)
 
trainingLabels.append(float(currLine[21])) #将每行样本数据的类别加入到类别集合
 
trainWeights = stocGradAscent1(array(trainingSet),trainingLabels,1000) #计算回归系数
 
errorCount = 0
 
numTestVec = 0
 
for line in frTest.readlines():
 
numTestVec += 1.0 #记录行数
 
currLine = line.strip().split('')
 
lineArr = []
 
for i in range(21):
 
lineArr.append(float(currLine[i]))
 
#计算回归系数与测试数据原类别是否相等
 
if int(classifyVector(array(lineArr), trainWeights)) != int(currLine[21]):
 
errorCount += 1
 
print('类别:',int(classifyVector(array(lineArr), trainWeights)))
 
errorRate = (float(errorCount)/numTestVec) #计算误差值
 
print('错误率是:',errorRate)
 
return errorRate

\
 
###调用BorrowerTest()函数并求10次结果的平均值
 
def multiTest():
 
numTests = 10
 
errorSum = 0.0
 
for k in range(numTests):
 
errorSum += BorrowerTest()
 
print('平均错误率是:', (numTests,errorSum/float(numTests)))

\
下一期九哥将会附上学习决策树的思路和代码。


上一篇:深度学习算法研究现状
下一篇:传统编程遇上机器学习会擦出怎样的火花
精选推荐
人工智能准确预测患者一年内的死亡风险,原理却无法解释
人工智能准确预测患者一年内的死亡风险,原理却无法解释

[2019-11-13]  图片来自BURGER PHANIE SCIENCE PHOTO LIBRARY美国最新研究显示,人工智能通过查看心脏测试结果,以高达85%以上的准确率预测了一个人在一 ...

可编辑神经网络,有望简化深度学习?
可编辑神经网络,有望简化深度学习?

[2019-10-04]  深度学习是一个计算繁重的过程。 降低成本一直是 Data curation 的一大挑战。 关于深度学习神经网络大功耗的训练过程,已经有研究人员 ...

人工神经网络技术解码人类行为和想象时的大脑活动信号
人工神经网络技术解码人类行为和想象时的大脑活动信号

[2017-08-23]  为搜索引擎过滤信息,棋盘游戏对弈,识别图像 人工智能在某些任务中远远超过了人类智能。来自弗莱堡由神经科学家私人讲师Tonio Ball博士领导的几个杰出的BrainLinks-Bra......

助力卷积神经网络时空特征学习 史上最大行人重识别视频数据集被提出
助力卷积神经网络时空特征学习 史上最大行人重识别视频数据集被提出

[2017-12-25]  本文提出了一个大型的、长序列的、用于行人重识别的视频数据集,简称LVreID。与现有的同类数据集相比,该数据集具有以下特点:1)长序列:平均每段视频序列长为200帧,包含丰......

国外眼科手术机器人为视网膜静脉阻塞患者带来希望
国外眼科手术机器人为视网膜静脉阻塞患者带来希望

[2017-03-20]  视网膜静脉阻塞,简称RVO,对患者来说是一种严重的疾病。该病病因为视网膜静脉中存在血液凝块,这可能导致视力严重下降,在某些情况下,病 ...

从AI中窥探人性
从AI中窥探人性

[2018-01-03]  人们对人造智能的恐惧早已成为科幻书籍和电影的极好题材。但现在,一些同样的担忧开始影响关于现实世界AI技术的政策讨论。如果这样的担忧演变成为一种技术恐慌...

如何让人工智能机器人快速自我纠正错误并吃一堑长一智?
如何让人工智能机器人快速自我纠正错误并吃一堑长一智?

[2017-08-23]  莱斯特大学数学系的研究人员在《Neural Networks》杂志上发表了一篇文章,概述了新算法的数学基础,可以使人工智能收集错误报告并立即纠正,而不影响现有技能 ,同时还会积......

比利时研发出可以自我愈合伤口的软体机器人
比利时研发出可以自我愈合伤口的软体机器人

[2017-09-03]  软体机器人是机器人技术的新兴领域; 他们“可以与人类相互作用,而不会杀死他们,并拿起像西红柿这样柔软的物体。” 从长远来看,布鲁塞尔大学队伍正在努力创建一个类似的材......

本周栏目热点

深度学习反向传播算法(BP)原理推导及代码实现

[2017-12-19]  分析了手写字数据集分类的原理,利用神经网络模型,编写了SGD算法的代码,分多个epochs,每个 epoch 又对 mini_batch 样本做多次迭代计算。这其中,非常重要的一个步骤,......

如何在机器学习项目中使用统计方法的示例

[2018-07-23]  事实上,机器学习预测建模项目必须通过统计学方法才能有效的进行。在本文中,我们将通过实例介绍一些在预测建模问题中起关键作用的统计学方法。...

[2017-08-28]  模拟退火(Simulated Annealing,简称SA)是一种通用概率算法,用来在一个大的搜寻空间内找寻命题的最优解。1、固体退火原理:将固体加温 ...

Machine Learning-感知器分类算法详解

[2018-05-31]  今天我们来讲解的内容是感知器分类算法,本文的结构如下:什么是感知器分类算法,在Python中实现感知器学习算法,在iris(鸢尾花)数据集上训练一个感知器模型,自适应线性神......

机器人是怎么深度学习的?

[2016-03-29]      一个人独处时,感觉有点孤单,怎么办?微软亚洲研究院推出的微软小冰,或许 ...