前言
logistic回归,又叫逻辑回归,上一篇讲的线性回归模型是用来进行线性预测的,然而本篇中虽然有回归二字,但是logistic回归是用来进行分类的,逻辑回归是一种线性分类模型 .它有一个线性决策边界(超平 面),但用一个非线性激活函数(Sigmoid SigmoidSigmoid函数)来模拟后验概 率。具体的理论推导参见周老师的西瓜书,所不同的是。本为代码所使用的最优化函数是最大化对数最大似然函数,不是西瓜书上的最小化对数似然函数的倒数,但实际上二者本质上是一致的,没有大的分别。菜鸡轻喷,代码可直接运行。
年轻人讲码德,话不多说上代码
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.markers as mks
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
import random
class LogisticRegressionClass(object):
def __init__(self, dataX, dataY, testX, testY, learningRate, loopNum):
# X为输入的矩阵,一行代表一份数据,行数代表样本的数量,列数代表样本的维数
# Y为对应的结果值
# learningRate表示学习率
# loopNum表示训练的次数
self.trainX = dataX
self.trainY = dataY
self.learningRate = learningRate
self.loopNum = loopNum
self.Y_Train = np.array([self.trainY]).T # 转化为列向量
self.X_Train = np.column_stack((dataX, np.repeat(1, dataX.shape[0]))) # 扩充矩阵一列全1,变成广义矩阵,作用是与偏置项进行乘积
self.parameter = np.array([np.ones(self.X_Train.shape[1])]).T # 最后一位为偏置项
self.testX = testX
self.testY = testY
self.Y_Test = np.array([self.testY]).T
self.X_Test = np.column_stack((testX, np.repeat(1, testX.shape[0])))
self.WTX = None # W为参数,T为转置,X为数据
self.error = None # 误差
self.derivative = None # 梯度值
def GradientDecent(self):
# 梯度下降法
# 梯度的计算值是根据最大似然估计得出的结论
for i in range(self.loopNum):
self.WTX = np.dot(self