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

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

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

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


上一篇:深度学习算法研究现状
下一篇:传统编程遇上机器学习会擦出怎样的火花
精选推荐
苹果AI主管透露自动驾驶汽车项目关于机器学习方面的进展
苹果AI主管透露自动驾驶汽车项目关于机器学习方面的进展

[2017-12-11]  苹果隐秘的自动驾驶汽车项目多年来一直在转移焦点,但今年似乎正在加速。 4月份,公司获得了在加利福尼亚州进行自动驾驶汽车测试的许可证,而在6月份,苹果公司首席执行官库......

谷歌大脑发布ROBEL基准 鼓励用低成本机器人训练AI系统
谷歌大脑发布ROBEL基准 鼓励用低成本机器人训练AI系统

[2019-10-11]  训练AI系统的机器人D& 39;Claw和D& 39;Kitty用于控制机器人的人工智能系统,测量其性能所使用的基准通常仅限于为工业环境设计的昂贵硬件, ...

机器人工程师具体都做什么?
机器人工程师具体都做什么?

[2017-12-08]  机器人工程师是幕后设计师,负责创建机器人和机器人系统,能够执行人类无法完成或不愿意完成的任务。 通过他们的创造,机器人工程师帮助工作更安全,更轻松,更高效,特别是......

美国Natilus公司试飞水上无人货机 设计简单成本降低
美国Natilus公司试飞水上无人货机 设计简单成本降低

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

南加州大学机器人学家:机器人更适合粗暴的爱
南加州大学机器人学家:机器人更适合粗暴的爱

[2019-11-07]  图片来自JOHN MADERE GETTY IMAGES打是疼骂是爱,当人类粗暴的将物体从机器人手中敲掉,看似残忍,实际上却能帮助机器人找到最好的握持物 ...

搭载人工智能的太空机器人CIMON 2乘SpaceX抵达国际空间站
搭载人工智能的太空机器人CIMON 2乘SpaceX抵达国际空间站

[2019-12-09]  12月5日,搭载人工智能的太空机器人西蒙2号(CIMON 2)乘坐SpaceX火箭Dragon货运舱,从佛罗里达州卡纳维拉尔角空军基地升空,前往国际空间 ...

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

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

亚马逊CEO杰夫·贝佐斯操控巨型有人驾驶机器人(巨型机甲)
亚马逊CEO杰夫·贝佐斯操控巨型有人驾驶机器人(巨型机甲)

[2017-03-21]  近日,亚马逊CEO杰夫·贝佐斯实现了每一个6岁儿童都会有的梦想,他控制了一个巨大的机甲机器人。据国外媒体Verge报道,前天(3月19日),贝 ...

本周栏目热点

关于应用机器学习作为搜索问题的入门简介

[2018-01-03]  机器学习的应用可以理解为一个搜索问题,即根据某个项目的已知信息和可获取的资源,找到从输入到输出的最好的映射。在本文你即将看到把应用机器学习当作搜索问题的概念...

[2017-03-02]   随着人工智能的不断发展,许多新的机器学习技术、架构和算法被提出,但这里有三个宏观趋势,将成为机器学习中,游戏规则的改变者。 机 ...

顶级AI会议NIPS压轴2017(附PPT、视频、代码大汇总)

[2017-12-19]  NIPS,全称神经信息处理系统大会(Conference and Workshop on Neural Information Processing Systems),是一个关于机器学习和计算神经科学的国际会议。该会议固定在每年的12月举行...

机器学习之——正则化

[2018-05-18]  最近在刷李航的《统计学习方法》这本书,在很多算法的损失函数里,都出现类似的描述:损失函数最小化原则一般就是用正则化的极大似然估计进 ...

机器学习算法可预测出乳腺癌治疗率(图)

[1970-01-01]    据外媒报道,患有同种疾病的不同病人在接受同一种治疗方案时,其获得的疗效也会存在不同,这就给医生留下了一个难题:他们怎样才能知道 ...