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

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

九哥使用的开发语言为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)))

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


上一篇:深度学习算法研究现状
下一篇:传统编程遇上机器学习会擦出怎样的火花
精选推荐
美国Natilus公司试飞水上无人货机 设计简单成本降低
美国Natilus公司试飞水上无人货机 设计简单成本降低

[2017-12-28]  Natilus创业公司成立于2014年,其梦想是建造大型无人机,以半价提供比船舶快得多国际货运。在十二月份,Natilus计划在旧金山湾测试一个9米翼展的小型原型无人机的水上滑行能力......

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

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

美国人工智能公司Skymind进入福建全面开展业务
美国人工智能公司Skymind进入福建全面开展业务

[2017-12-11]  人工智能在当今这个时代对大家来说想必是非常熟悉的,这也是我国近十几年来一直追求的目标,未来的时间里这也将是全人类追求的目标。就目前来看,近年来,人工智能或在我国迎......

2023年服务机器人市场将超过250亿美元
2023年服务机器人市场将超过250亿美元

[2017-09-04]  全球服务机器人市场预计到2023年将达到250亿美元, 并在预测期内登记15% 的复合年增长率。短期中期回收期和投资回报率高 (ROI), 以及在教育和研究、临场感、防御、救援和安......

智能机器人困惑的时候知道该问什么问题
智能机器人困惑的时候知道该问什么问题

[2017-03-20]   照片:Nick Dentamaro 布朗大学 上周,我们提到了麻省理工学院的一些研究,即通过链接人的大脑来帮助机器人在他们将要犯错误的时 ...

瑞士研发出微型机器人集群 可像蚂蚁一样互相交流并协同工作
瑞士研发出微型机器人集群 可像蚂蚁一样互相交流并协同工作

[2019-07-12]  EPFL(瑞士联邦理工学院)的研究人员受到了蚂蚁的启发,开发了一款仅有10克重的小型机器人:他们可以相互交流,分配角色并完成复杂的任务。 ...

英国首台月球车是个小型四腿机器人 将于2021年登月
英国首台月球车是个小型四腿机器人 将于2021年登月

[2019-10-12]  探测器将用四条腿探测月球表面,并将数据传回着陆器,后者将把数据传回地球图 詹姆斯温斯皮尔英国即将成为继美国、俄罗斯、中国之后的又一 ...

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

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

本周栏目热点

盘点全球十大最具影响力的机器人摇篮

[1970-01-01]    人工智能(AI)研究现正迅速发展,如无人驾驶汽车、计算机在《危险边缘》智力竞赛节目中获胜、数字私人助手Siri、GoogleNow和语音助手C ...

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

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

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

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

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

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

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