【无标题】

Logistic基本原理

Logistic 回归模型又叫对数几率回归模型,属于广义线性模型的一种,适用于二值型或多值型数据的拟合。在机器学习领域,Logistic回归模型常被用作分类模型,如根据患者的医疗数据来判断他能否被治愈。

数据准备

准备若干个二维点与对应类别,存放于data.csv中.
在这里插入图片描述

代码实现

导入必要库

此次实验需要numpy数学库和可视化展示所需的matplotlib库。

from numpy import *
import matplotlib.pyplot as plt

## 加载数据集

def loadDataSet():
        dataMat = []
        labelMat = []
        fr = open('testSet.txt')
        for line in fr.readlines():
            # 矩阵的格式【标签,X1,X2】
            lineArr = line.strip().split()

            #插入X1,X2,以及初始化的回归系数(权重),全部设为1.0
            dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])

            #插入标签,
            #必须转换成int类型,因为只有两类
            labelMat.append(int(lineArr[2]))


        return dataMat,labelMat

## 定义sigmoid函数


# 使用sigmoid函数进行分类
    def sigmoid(inX):
        return 1.0/(1+exp(-inX))

## 定义反向传播
本次实验采用梯度上升算法进行反向传播更新权重。

#使用梯度上升算法进行优化,找到最佳优化系数
    #dataMatIn是训练集,三维矩阵,(-0.017612	14.053064	0)
    #classLabels是类别标签,数值型行向量,需要转置为列向量,取值是0,1
    def gradAscent(dataMatIn,classLabels):
        dataMatrix = mat(dataMatIn) #转换为Numpy矩阵数据类型
        labelMat = mat(classLabels).transpose() #转置矩阵,便于加权相乘
        m,n = shape(dataMatrix) #得到矩阵的行列数,便于设定权重向量的维度

        alpha = 0.001
        maxCycles = 500
        weights = ones((n,1))  #返回一个被1填满的 n * 1 矩阵,作为初始化权重
        for k in range(maxCycles):
            h = sigmoid(dataMatrix*weights)
            erro = (labelMat - h)   #labelMat是使用当前回归系数得到的的标签,labelMat是训练集的标签,取值是0,1
            weights = weights + alpha * dataMatrix.transpose( ) * erro  #根据使用当前权重计算的值与初始值的误差,更改weight,
                                                                        #按照误差的方向调整回归系数
        return weights

## 可视化展示
根据训练好的权重和已有数据点绘制图线。

def plotBestFit(wei):
        weights = wei.getA()
        dataMat,labelMat = loadDataSet()
        dataArr = array(dataMat)
        n = shape(dataMat)[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') #scatter散开
        ax.scatter(xcord2,ycord2,s=30,c='green')
        x = arange(-3.0,3.0,1)
        y = (-weights[0]-weights[1]*x)/weights[2]
        ax.plot(x,y)
        plt.xlabel('x1')
        plt.ylabel('x2')
        plt.show()

## 定义logistic类
将以上代码整合可得


class func:
    def loadDataSet(self):
        dataMat = []
        labelMat = []
        fr = open('testSet.txt')
        for line in fr.readlines():
            # 矩阵的格式【标签,X1,X2】
            lineArr = line.strip().split()

            #插入X1,X2,以及初始化的回归系数(权重),全部设为1.0
            dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])

            #插入标签,
            #必须转换成int类型,因为只有两类
            labelMat.append(int(lineArr[2]))


        return dataMat,labelMat

    # 使用sigmoid函数进行分类
    def sigmoid(self,inX):
        return 1.0/(1+exp(-inX))

    #使用梯度上升算法进行优化,找到最佳优化系数
    #dataMatIn是训练集,三维矩阵,(-0.017612	14.053064	0)
    #classLabels是类别标签,数值型行向量,需要转置为列向量,取值是0,1
    def gradAscent(self,dataMatIn,classLabels):
        dataMatrix = mat(dataMatIn) #转换为Numpy矩阵数据类型
        labelMat = mat(classLabels).transpose() #转置矩阵,便于加权相乘
        m,n = shape(dataMatrix) #得到矩阵的行列数,便于设定权重向量的维度

        alpha = 0.001
        maxCycles = 500
        weights = ones((n,1))  #返回一个被1填满的 n * 1 矩阵,作为初始化权重
        for k in range(maxCycles):
            h = self.sigmoid(dataMatrix*weights)
            erro = (labelMat - h)   #labelMat是使用当前回归系数得到的的标签,labelMat是训练集的标签,取值是0,1
            weights = weights + alpha * dataMatrix.transpose( ) * erro  #根据使用当前权重计算的值与初始值的误差,更改weight,
                                                                        #按照误差的方向调整回归系数
        return weights

    def plotBestFit(self,wei):
        weights = wei.getA()
        dataMat,labelMat = self.loadDataSet()
        dataArr = array(dataMat)
        n = shape(dataMat)[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') #scatter散开
        ax.scatter(xcord2,ycord2,s=30,c='green')
        x = arange(-3.0,3.0,1)
        y = (-weights[0]-weights[1]*x)/weights[2]
        ax.plot(x,y)
        plt.xlabel('x1')
        plt.ylabel('x2')
        plt.show()

请添加图片描述

优缺点

优点: 计算代价不高,易于理解和实现。
缺点: 容易欠拟合,分类精度可能不高。
适用数据类型: 数值型和标称型数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值