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

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

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

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


上一篇:深度学习算法研究现状
下一篇:传统编程遇上机器学习会擦出怎样的火花
精选推荐
2022年全球工业机器人市场将达到790亿美元
2022年全球工业机器人市场将达到790亿美元

[2017-09-04]  预计到 2022年, 全球工业机器人市场将达到790亿美元, 并在预测期内登记11 5% 的复合年增长率。随着发展中国家中小型企业需求的不断增长, 采用自动化技术以确保生产质量......

[2017-03-21]  虽然有很多关于机器人取代工人的担心,但哈佛经济学家James Bessen的论文指出,在过去的67年里机器人仅仅淘汰掉人类工作中的一个。在1950 ...

这些人型机器人是如此真实,你的肉眼几乎无法区分
这些人型机器人是如此真实,你的肉眼几乎无法区分

[2017-09-03]   我们生活在一个区分现实与幻想变得越来越困难的世界。由于机器人技术的进步,创造人工的人类正在逐渐接近完美的最终目标。我们现在看到的机器人不再只是一块发光二极管,......

Crossbar将电阻式RAM推入嵌入式AI
Crossbar将电阻式RAM推入嵌入式AI

[2018-05-17]  电阻RAM技术开发商Crossbar表示,它已与航空航天芯片制造商Microsemi达成协议,允许后者在未来的芯片中嵌入Crossbar的非易失性存储器。此举是在先进制造业节点的领先代工厂选......

受大脑控制的机器人
受大脑控制的机器人

[2017-03-21]   想让机器人做我们想做的,首先,他得全面地了解我们。通常,这就意味着人类需要要付出更多。比如,教机器人复杂的人类语言或者把一项任务 ...

科学家从蟑螂获得启发 教机器人更好地走路
科学家从蟑螂获得启发 教机器人更好地走路

[2017-12-11]  Weihmann指出:“我特别感到惊讶的是,动物运动稳定机制的变化与腿部协调的变化是一致的。昆虫的慢运行非常稳定,因为它的重心很低,三条腿总是以协调的方式运动。...

7种常见的机器人焊接类型
7种常见的机器人焊接类型

[2017-12-17]  机器人焊接是工业领域最常见的机器人应用之一,近几十年来主要由汽车行业驱动。机器人焊接在完成大批量,重复性的焊接任务时效率最高。...

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

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

本周栏目热点

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

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

深度学习反向传播算法(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(鸢尾花)数据集上训练一个感知器模型,自适应线性神......