Logistic回归python实现
2017-08-12
Logistic 回归,作为分类器:
分别用了梯度上升,牛顿法来最优化损失函数:
# -*- coding: utf-8 -*- '''
function: 实现Logistic回归,拟合直线,对数据进行分类;
利用梯度上升,随机梯度上升,改进的随机梯度上升,牛顿法分别对损失函数优化;
这里没有给出最后测试分类的函数;
date: 2017.8.12
''' from numpy import * #从文件加载处理数据
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])])
labelMat.append(int(lineArr[2]))
return dataMat, labelMat #sigmoid function X: w1*x1+w2*x2+...+wn*xn
def sigmoid(x):
return 1 / (1 + exp(-x)) #梯度上升求函数的最大值时取得的权重
def gradAscent(dataMatIn, classLabels):
dataMatrix = mat(dataMatIn)
labelMat = mat(classLabels).transpose() #将m维行向量转制为m维列向量
m,n = shape(dataMatrix)
alpha = 0.001 #设置梯度上升的步长
maxCycles = 500 #最大迭代次数
weights = ones((n,1)) #weights就是theta,n维列向量,二维数组
for i in range(maxCycles):
h = sigmoid(dataMatrix*weights) #计算所有数据的分类概率,h是m维向量,这里实际上进行了300次乘法运算
error = labelMat - h #计算(y-h(x)):误差
weights = weights + alpha * dataMatrix.transpose()*error #对所有weights同时更新
print('shape of weights', shape(weights))
return weights #随机上升上升
def stocGradAscent0(dataMatrix, classLabels):
m,n = shape(dataMatrix)
alpha = 0.01
weights = ones(n, float) #n 维行向量
for i in range(m):
h = sigmoid(sum(dataMatrix[i] * weights))
error = classLabels[i] - h
weights = weights + alpha * error * dataMatrix[int(i)]
return weights #改进的随机上升上升
def stocGradAscent1(dataMatrix, classLabels, numIter = 550):
m,n = shape(dataMatrix)
weights = ones(n)
dataIndex = []
for j in range(numIter):
for k in range(m):
dataIndex.append(k)
for i in range(m):
alpha = 4 / (i + j + 1.0) + 0.01 #aloha随着迭代次数增多不断减小但是不为0,为了解决局部波动
randIndex = int(random.uniform(0, len(dataIndex))) #随机选取一个数据进行更新参数
h = sigmoid(dataMatrix[randIndex] * weights)
error = classLabels[randIndex] - h
weights = weights + alpha * error * dataMatrix[randIndex]
del(dataIndex[randIndex]) #这里会不会对本来的dataMatrix有影响,不会,因为没有操作矩阵
return weights '''
functuion: 牛顿法更新theta,计算海森矩阵
note: 这里一定要对 XT*X 结果求逆,不然分类效果无法直视
'''
def computeHessianMatrix(dataMatrix):
hessianMatrix = mat(dataMatrix).transpose().dot(mat(dataMatrix))
return hessianMatrix.I #矩阵求逆 '''
function: 牛顿法更新theta
'''
def newtonMethod(dataMat, labelMat, numIter = 10):
m,n = shape(dataMat)
dataMatrix = mat(dataMat)
labelMat = mat(labelMat).transpose()
weights = ones((n,1)) #参数向量
hessianMatrix = computeHessianMatrix(dataMatrix)
print('shape of hessian', shape(hessianMatrix))
for k in range(numIter):
h = sigmoid(dataMatrix * weights)
error = (labelMat - h)
weights = weights - (dataMatrix*hessianMatrix).transpose() * error
return weights #画出决策边界
def plotBestFit(weights):
import matplotlib.pyplot as plt
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)
print(len(x))
print(len(weights))
print(shape(weights))
y = (-weights[0] - weights[1]*x) / weights[2] #把x2堪称y,x0=1,所以就是x1,x2之间的函数
print(len(y))
ax.plot(x,y)
plt.xlabel('X1'); plt.ylabel('X2')
plt.show() #显示图像 '''
function: 对测试数据进行测试
input: testDate 是一个向量,或者多个向量
'''
def logisticTest(weights, testData):
m,n = shape(testData)
typeLabel = []
for i in range(m):
result = sigmoid(sum(testData[i] * weights)) #得到一个册数数据的概率
if result > 0.5:
typeLabel.append(1)
else:
typeLabel.append(0)
return typeLabel '''
function: 计算分类的正确率
input: calssLables 是测试数据的类别向量
'''
def getCorrectRate(classLabels, testLabel):
correctRate = 0.0
numOfRight = 0
for i in range(len(testLabel)):
if classLabels[i] == testLabel[i]:
numOfRight += 1
correctRate = numOfRight / float(len(testLabel))
return correctRate #测试算法
dataMat, labelMat = loadDataSet()
print('shape of datamet, ', shape(dataMat))
weights1 = gradAscent(dataMat, labelMat)
weights2 = stocGradAscent0(array(dataMat), labelMat)
weights3 = stocGradAscent1(dataMat, labelMat) weights4 = newtonMethod(dataMat, labelMat, 2000) #牛顿法 #测试正确率
typeLabel = logisticTest(weights4, [[1,1,0],[1,1,1]])
print(typeLabel)
correctRate = getCorrectRate([1,0],typeLabel)
print('正确率: ' ,str(correctRate)) #画图
#plotBestFit(array(weights1)) #这里因为普通梯度上升返回的是一个矩阵,所以要转换为向量
#plotBestFit(weights2)
#plotBestFit(weights3)
plotBestFit(array(weights4))
# -*- coding: utf-8 -*-
'''function: 实现Logistic回归,拟合直线,对数据进行分类;利用梯度上升,随机梯度上升,改进的随机梯度上升,牛顿法分别对损失函数优化;这里没有给出最后测试分类的函数;date: 2017.8.12'''
from numpy import *
#从文件加载处理数据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])])labelMat.append(int(lineArr[2]))return dataMat, labelMat
#sigmoid function X: w1*x1+w2*x2+...+wn*xndef sigmoid(x):return 1 / (1 + exp(-x))
#梯度上升求函数的最大值时取得的权重def gradAscent(dataMatIn, classLabels):dataMatrix = mat(dataMatIn)labelMat = mat(classLabels).transpose() #将m维行向量转制为m维列向量m,n = shape(dataMatrix)alpha = 0.001 #设置梯度上升的步长maxCycles = 500 #最大迭代次数 weights = ones((n,1)) #weights就是theta,n维列向量,二维数组for i in range(maxCycles):h = sigmoid(dataMatrix*weights) #计算所有数据的分类概率,h是m维向量,这里实际上进行了300次乘法运算error = labelMat - h #计算(y-h(x)):误差weights = weights + alpha * dataMatrix.transpose()*error #对所有weights同时更新print('shape of weights', shape(weights))return weights
#随机上升上升def stocGradAscent0(dataMatrix, classLabels):m,n = shape(dataMatrix)alpha = 0.01weights = ones(n, float) #n 维行向量for i in range(m):h = sigmoid(sum(dataMatrix[i] * weights))error = classLabels[i] - hweights = weights + alpha * error * dataMatrix[int(i)]return weights
#改进的随机上升上升def stocGradAscent1(dataMatrix, classLabels, numIter = 550):m,n = shape(dataMatrix)weights = ones(n)dataIndex = []for j in range(numIter):for k in range(m):dataIndex.append(k)for i in range(m):alpha = 4 / (i + j + 1.0) + 0.01 #aloha随着迭代次数增多不断减小但是不为0,为了解决局部波动randIndex = int(random.uniform(0, len(dataIndex))) #随机选取一个数据进行更新参数h = sigmoid(dataMatrix[randIndex] * weights)error = classLabels[randIndex] - hweights = weights + alpha * error * dataMatrix[randIndex]del(dataIndex[randIndex]) #这里会不会对本来的dataMatrix有影响,不会,因为没有操作矩阵return weights
'''functuion: 牛顿法更新theta,计算海森矩阵note: 这里一定要对 XT*X 结果求逆,不然分类效果无法直视'''def computeHessianMatrix(dataMatrix):hessianMatrix = mat(dataMatrix).transpose().dot(mat(dataMatrix))return hessianMatrix.I #矩阵求逆
'''function: 牛顿法更新theta'''def newtonMethod(dataMat, labelMat, numIter = 10):m,n = shape(dataMat)dataMatrix = mat(dataMat)labelMat = mat(labelMat).transpose()weights = ones((n,1)) #参数向量hessianMatrix = computeHessianMatrix(dataMatrix)print('shape of hessian', shape(hessianMatrix))for k in range(numIter):h = sigmoid(dataMatrix * weights)error = (labelMat - h)weights = weights - (dataMatrix*hessianMatrix).transpose() * error return weights
#画出决策边界def plotBestFit(weights):import matplotlib.pyplot as pltdataMat, 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)print(len(x))print(len(weights))print(shape(weights))y = (-weights[0] - weights[1]*x) / weights[2] #把x2堪称y,x0=1,所以就是x1,x2之间的函数print(len(y))ax.plot(x,y) plt.xlabel('X1'); plt.ylabel('X2')plt.show() #显示图像
'''function: 对测试数据进行测试input: testDate 是一个向量,或者多个向量'''def logisticTest(weights, testData):m,n = shape(testData)typeLabel = []for i in range(m): result = sigmoid(sum(testData[i] * weights)) #得到一个册数数据的概率if result > 0.5:typeLabel.append(1)else:typeLabel.append(0)return typeLabel
'''function: 计算分类的正确率input: calssLables 是测试数据的类别向量'''def getCorrectRate(classLabels, testLabel):correctRate = 0.0numOfRight = 0for i in range(len(testLabel)):if classLabels[i] == testLabel[i]:numOfRight += 1correctRate = numOfRight / float(len(testLabel))return correctRate
#测试算法dataMat, labelMat = loadDataSet()print('shape of datamet, ', shape(dataMat))weights1 = gradAscent(dataMat, labelMat)weights2 = stocGradAscent0(array(dataMat), labelMat)weights3 = stocGradAscent1(dataMat, labelMat)
weights4 = newtonMethod(dataMat, labelMat, 2000) #牛顿法
#测试正确率typeLabel = logisticTest(weights4, [[1,1,0],[1,1,1]])print(typeLabel)correctRate = getCorrectRate([1,0],typeLabel)print('正确率: ' ,str(correctRate))
#画图#plotBestFit(array(weights1)) #这里因为普通梯度上升返回的是一个矩阵,所以要转换为向量#plotBestFit(weights2)#plotBestFit(weights3)plotBestFit(array(weights4))
Logistic回归python实现的更多相关文章
- Logistic回归 python实现
Logistic回归 算法优缺点: 1.计算代价不高,易于理解和实现2.容易欠拟合,分类精度可能不高3.适用数据类型:数值型和标称型 算法思想: 其实就我的理解来说,logistic回归实际上就是加了 ...
- Logistic回归python实现小样例
假设现在有一些点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归.利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,依次进行分类.Lo ...
- 机器学习实战 logistic回归 python代码
# -*- coding: utf-8 -*- """ Created on Sun Aug 06 15:57:18 2017 @author: mdz "&q ...
- logistic回归 python代码实现
本代码参考自:https://github.com/lawlite19/MachineLearning_Python/blob/master/LogisticRegression/LogisticRe ...
- Logistic回归模型和Python实现
回归分析是研究变量之间定量关系的一种统计学方法,具有广泛的应用. Logistic回归模型 线性回归 先从线性回归模型开始,线性回归是最基本的回归模型,它使用线性函数描述两个变量之间的关系,将连续或离 ...
- 【Spark机器学习速成宝典】模型篇02逻辑斯谛回归【Logistic回归】(Python版)
目录 Logistic回归原理 Logistic回归代码(Spark Python) Logistic回归原理 详见博文:http://www.cnblogs.com/itmorn/p/7890468 ...
- 【机器学习速成宝典】模型篇03逻辑斯谛回归【Logistic回归】(Python版)
目录 一元线性回归.多元线性回归.Logistic回归.广义线性回归.非线性回归的关系 什么是极大似然估计 逻辑斯谛回归(Logistic回归) 多类分类Logistic回归 Python代码(skl ...
- 吴裕雄--天生自然python机器学习:使用Logistic回归从疝气病症预测病马的死亡率
,除了部分指标主观和难以测量外,该数据还存在一个问题,数据集中有 30%的值是缺失的.下面将首先介绍如何处理数据集中的数据缺失问题,然 后 再 利 用 Logistic回 归 和随机梯度上升算法来预测 ...
- 吴裕雄--天生自然python机器学习:Logistic回归
假设现在有一些数据点,我们用 一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归.利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类 ...
随机推荐
- Android-NDK编译:cocos2d-x
看了下 cocos2d-x 3.0 alpha1 几个关于android的脚本 cocos2d-x\tools\project-creator\create_project.py cocos2d-x\ ...
- 3、ACE-实用生活口语---讲打电话Talking on the phone
(3)需要留口信吗?请让他给我回电话Would you like to leave a message?May I take a message for you ?Please tell him to ...
- SQL Server 服务无法启动,错误1069解决办法
刚刚接到公司服务器上的SQL Server服务无法启动的问题需要解决,在进入“SQL Server 配置管理器”启动MSSQLServer 服务时,启动过程异常缓慢预示着“异常”的存在.果然,系统给出 ...
- uva 12730(期望经典)
选自: http://blog.csdn.net/myhelperisme/article/details/39724515 用dp(n)表示有n个位置时的期望值,那么,对于一个刚进来的人来说,他有 ...
- 《从零开始学Swift》学习笔记(Day 7)——Swift 2.0中的print函数几种重载形式
原创文章,欢迎转载.转载请注明:关东升的博客 Swift 2.0中的print函数有4种重载形式: l print(_:).输出变量或常量到控制台,并且换行. l print(_:_:).输出 ...
- 浅谈Spring框架注解的用法分析
原文出处: locality 1.@Component是Spring定义的一个通用注解,可以注解任何bean. 2.@Scope定义bean的作用域,其默认作用域是”singleton”,除此之外还有 ...
- mongodb基础操作
查询选择器>db.customers.find({age:{$lt:102}})查询age小于102的数据$lte表示小于或等于$gt表示大于$gte表示大于或等于>db.customer ...
- 【转】虚拟 IO 服务器(VIOS)和 IBM i
Power 主机上的虚拟化应用,简单阐述虚拟 IO 服务器的功能,用途,优点,以及虚拟 IO 服务器在高级虚拟化技术的作用.举例说明虚拟 IO 服务器与 IBM i 分区直接互联特性. 引言 随着信息 ...
- Oracle学习笔记—Oracle左连接、右连接、全外连接以及(+)号用法(转载)
转载自: Oracle左连接.右连接.全外连接以及(+)号用法 对于外连接,Oracle中可以使用“(+)”来表示. 关于使用(+)的一些注意事项: (+)操作符只能出现在WHERE子句中,并且不能与 ...
- boost之网络通信
ip::tcp的内部类型socket,acceptor以及resolver是TCP通信中最核心的类. 1.同步客户端代码: #include <iostream> #include < ...