【机器学习|学习笔记】核逻辑回归(Kernel logistic regression ,KLR)详解,附代码。

【机器学习|学习笔记】核逻辑回归(Kernel extreme learning machine ,KELM )详解,附代码。

【机器学习|学习笔记】核逻辑回归(Kernel extreme learning machine ,KELM )详解,附代码。



欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “学术会议小灵通”或参考学术信息专栏:https://blog.csdn.net/2401_89898861/article/details/147567533


前言

  • 核逻辑回归是在经典逻辑回归中引入核技巧,使模型能够在高维特征空间中进行非线性分类而无需显式计算映射
  • 它结合了核方法的强大非线性表示能力与逻辑回归的概率输出特性,自2001年左右提出以来,已衍生出多种高效求解与近似算法,并在离散选择建模、环境工程、灾害预测、生物信息学等领域广泛应用

起源

逻辑回归的统计学渊源

  • 逻辑回归最早可追溯至19世纪末对逻辑函数的研究,并于20世纪初在生物测定(bio‑assay)中得到应用;
  • Joseph Berkson于1944年正式将“logit”模型引入统计学,奠定了现代逻辑回归的基础 。

核方法与代表性定理

  • 20世纪90年代,支持向量机(SVM)等核方法兴起,利用再生核希尔伯特空间(RKHS)的代表性定理,将非线性映射隐式地嵌入模型中
  • 根据代表性定理,任何在RKHS中带惩罚项的经验风险最小化问题,其最优解都可表示为训练样本的核加权和,这为核逻辑回归的提出提供了理论依据 。

核逻辑回归的首次提出

  • 2001年,Zhu 和 Hastie在NIPS会议上发表论文,首次将逻辑回归的对数似然损失与核技巧结合,提出了Kernel Logistic Regression,并在此基础上发展出Import Vector Machine(IVM)模型 。
  • IVM通过选择关键“导入点”减少模型稀疏性,并保留概率输出,从而兼具SVM的高精度与逻辑回归的概率解释性

发展

稳定性与可扩展性改进

  • Nyström 近似:针对KLR在大规模数据上需存储和反演 N × N N×N N×N 核矩阵的瓶颈,提出Nyström方法对核矩阵做低秩近似,显著降低时间和空间复杂度 。
  • 并行与分布式求解:Schölkopf等人将KLR与分布式优化结合,实现千万级样本的并行训练 。
  • 算法变体:灰狼优化(GWO)等元启发式算法被用于自动调优核参数与正则化系数,形成KLR‑GWO等混合模型,在工程预测中表现优异 。
  • 专用软件包:PyKernelLogit封装了带惩罚最大似然估计的KLR,支持多种离散选择模型,简化了工程应用 。

原理

对偶表示与优化目标

  • 给定训练集 ( x i , y i ) i = 1 N {(x_i,y_i)}_{i=1}^N (xi,yi)i=1N,其中 y i ∈ − 1 , 1 y_i ∈{−1,1} yi1,1,KLR基于代表性定理将决策函数表示为
    在这里插入图片描述
    其中 K K K 为正定核函数(如RBF、Polynomial等)

  • 其正则化对数似然最小化目标为
    在这里插入图片描述
    其中 K i j = K ( x i , x j ) K_{ij} = K(x_i,x_j) Kij=K(xi,xj) λ λ λ 为正则化系数

求解方法

  • 迭代重权最小二乘(IRLS):将对数似然二阶泰勒展开,迭代求解加权最小二乘子问题,直至收敛
  • 梯度与牛顿法:直接对对偶目标计算梯度 ∇ β = λ K β + K ( − y ⊙ σ ( − y ⊙ f ) ) ∇_β=λKβ+K(−y⊙σ(−y⊙f)) β=λKβ+K(yσ(yf))并采用L‑BFGS或牛顿法优化。

应用

  • 离散选择建模:用于交通出行模式、产品选择等行为建模,提供概率预测
  • 洪涝易发性映射:与RBF、朴素贝叶斯等方法比较,KLR在小样本高维下稳定性更优
  • 环境工程:预测重金属吸附效率时,KLR结合克里金法提高了回归精度
  • 关联记忆与Hopfield网络容量:在Hopfield关联记忆网络中,KLR显著提升存储容量与噪声鲁棒性
  • 医学与信用风险评估:针对不平衡数据提供概率输出,便于风险分层与决策支持

Python 代码实现

下面给出两种常用实现方式:

  • 核近似 + 线性逻辑回归(适合大规模场景);
  • 对偶形式直接优化(适合中小规模数据,体现KLR本质)。

1. 核近似 + 线性逻辑回归

  • 利用 RBFSampler 对RBF核做随机傅里叶特征近似,再调用scikit‑learn的LogisticRegression即可
from sklearn.kernel_approximation import RBFSampler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# 加载数据
X, y = load_iris(return_X_y=True)
y = (y == 2).astype(int)  # 二分类示例

# 划分训练/测试
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

# 构造管道:RBF近似 → 逻辑回归
model = make_pipeline(
    RBFSampler(gamma=0.5, n_components=200, random_state=42),
    LogisticRegression(max_iter=1000)
)
model.fit(X_train, y_train)
print("Test accuracy:", model.score(X_test, y_test))

2. 对偶形式直接优化

  • 下面展示对偶KLR的简易实现,采用L‑BFGS优化器。
import numpy as np
from scipy.optimize import minimize
from scipy.special import expit  # sigmoid

def rbf_kernel(X1, X2, gamma):
    sqd = np.sum(X1**2,1)[:,None] + np.sum(X2**2,1)[None,:] - 2*X1.dot(X2.T)
    return np.exp(-gamma * sqd)

class DualKLR:
    def __init__(self, C=1.0, gamma=1.0):
        self.C = C
        self.gamma = gamma

    def fit(self, X, y):
        N = X.shape[0]
        K = rbf_kernel(X, X, self.gamma)
        y_signed = np.where(y==1, 1, -1)

        # 目标函数和梯度
        def obj(beta):
            f = K.dot(beta)
            loss = np.logaddexp(0, -y_signed * f).mean()
            reg = 0.5 * (beta @ K @ beta) / self.C
            return reg + loss

        def grad(beta):
            f = K.dot(beta)
            sigma = expit(-y_signed * f)
            grad_loss = (-1/N) * K.dot(y_signed * sigma)
            grad_reg  = (K.dot(beta)) / self.C
            return grad_reg + grad_loss

        # 初始化β
        beta0 = np.zeros(N)
        res = minimize(obj, beta0, jac=grad, method='L-BFGS-B')
        self.beta = res.x
        self.X_train = X
        self.K = K

    def predict_proba(self, X):
        K_test = rbf_kernel(X, self.X_train, self.gamma)
        f = K_test.dot(self.beta)
        p = expit(f)
        return np.vstack([1-p, p]).T

    def predict(self, X):
        return (self.predict_proba(X)[:,1] > 0.5).astype(int)

# 测试
from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
model = DualKLR(C=10.0, gamma=0.01)
model.fit(X_train, y_train)
print("Dual KLR accuracy:", np.mean(model.predict(X_test)==y_test))

  • 以上两种实现方式分别兼顾了大规模效率与KLR的理论本质,可根据数据规模与精度需求灵活选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力毕业的小土博^_^

您的鼓励是我创作的动力!谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值