matlab 回归 逻辑斯蒂_逻辑斯蒂回归(logistic回归)

理论部分

1.逻辑斯蒂分布

matlab 回归 逻辑斯蒂_逻辑斯蒂回归(logistic回归)_第1张图片

越小

,图形越陡(图中

2.逻辑斯蒂回归模型

化简为

equation?tex=P%28Y+%3D+1%7Cx%29+%3D+%5Cfrac%7Bexp%28%5Cbold%7Bw%7D+%5Ccdot+%5Cbold%7Bx%7D%29%7D%7B1+%2B+exp%28%5Cbold%7Bw%7D%5Ccdot+%5Cbold%7Bx%7D%29%7D+%5Cbegin%7Bcases%7D+%5Cbold%7Bw%7D+%3D+%28w%5E%7B%281%29%7D%2C+w%5E%7B%282%29%7D%2C+%5Ccdots%2C+w%5E%7B%28n%29%7D%2C+b%29%5C%5C+%5Cbold%7Bx%7D+%3D+%28x%5E%7B%281%29%7D%2C+x%5E%7B%282%29%7D%2C+%5Ccdots%2C+x%5E%7B%28n%29%7D%2C+1%29%5C%5C+%5Cend%7Bcases%7D

这也就是下文中得sigmoid函数.

3.定义几率

几率:该事件发生概率/不发生概率 =

对数几率

4.参数估计(极大似然估计)

似然函数:

对数似然函数:

对L(w)求极大值点,得

5.多项逻辑斯蒂回归

Y得取值{1, 2, ..., K},其中1, 2, ..., k-1每个都对应一个


实验部分(参考《机器学习实验》)

实验部分有三个内容:

  • 使用梯度上升法(使用的是没用实际背景的100个数据)
  • 使用随机梯度上升法(使用的是没用实际背景的100个数据)
  • 使用随机梯度上升法从疝气病预测马的死亡

1.使用梯度上升法

1.1对似然函数使用梯度上升法分析

对已知的对数似然函数

分析:

根据梯度上升法,选取步长为

每次前进

1.2python代码

所有的python代码都添加到一个文件中(命名为logRegres.py),因此numpy库始终缩写为npy。读入的数据一共有m行,即m个x-y对。

import numpy as npy
import matplotlib.pyplot as plt

# 读入数据函数
# 每一行前两个数字为x^1, x^2最后一个数据为标签y
# dataMat每一行为向量x = (1, x^1, x^2)
# labelMat只有一行,为对应的y
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函数计算结果
# inX为w*x
def sigmoid(inX):
    return 1.0 / (1 + npy.exp(-inX))

def gradAscent(dataMatIn, classLabels):
    dataMatrix = npy.mat(dataMatIn)
    # 将labelMat变成m*1的矩阵
    labelMat = npy.mat(classLabels).transpose()
    # m行n列
    m, n = npy.shape(dataMatrix)
    alpha = 0.001
    maxCycles = 500
    # 生成n*1列的矩阵
    weights = npy.ones((n, 1))
    for k in range(maxCycles):
        # m*n的矩阵乘上n*1的矩阵,结果为m*1的矩阵
        forecastLabel = sigmoid(dataMatrix * weights)
        # 两个m*1的矩阵相减
        error = (labelMat - forecastLabel)
        # n*m矩阵乘上m*1矩阵,得到n*1矩阵,在这里就是2*1
        # 这就是梯度上升法的alpha * L'(w)
        weights = weights + alpha * dataMatrix.transpose() * error
    return weights

# 该函数画出所有的数据点和最优的分割线
def plotBestFit(weights):
    dataMat, labelMat = loadDataSet()
    dataArr = npy.array(dataMat)
    n = npy.shape(dataArr)[0]
    xcord1 = []
    ycord1 = []
    xcord2 = []
    ycord2 = []
    for i in range(n):
        # 如果数据标签是y = 1
        if int(labelMat[i]) == 1:
            xcord1.append(dataArr[i, 1])
            ycord1.append(dataArr[i, 2])
        # 如果数据标签是y = 0
        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 = "1")
    ax.scatter(xcord2, ycord2, s = 30, c = "green")

    # 画出分割线的图像即y = w * x
    # 原方程为0 = w0*x0 + w1*x1 + w2*x2
    x = npy.arange(-3.0, 3.0, 0.1)
    y = (-weights[0] - weights[1] * x) / weights[2]
    ax.plot(x, y)
    plt.xlabel("X1")
    plt.ylabel("X2")
    plt.show()

1.3图像化

测试数据有效期为一年

创建另一个python文件输入如下代码,运行已经写好的程序

import logRegres
import numpy as npy

dataArr, labelMat = logRegres.loadDataSet()

# 进行梯度上升
weights = logRegres.gradAscent(dataArr, labelMat)
print(weights)
logRegres.plotBestFit(weights.getA())

运行结果如下:

matlab 回归 逻辑斯蒂_逻辑斯蒂回归(logistic回归)_第2张图片

命令行结果如下

[[ 4.12414349]
 [ 0.48007329]
 [-0.6168482 ]]

剩下的两种测试省略。

你可能感兴趣的:(matlab,回归,逻辑斯蒂)