zoukankan      html  css  js  c++  java
  • Kernel ridge regression(KRR)

    作者:桂。

    时间:2017-05-23  15:52:51

    链接:http://www.cnblogs.com/xingshansi/p/6895710.html 


    一、理论描述

    Kernel ridge regression (KRR)是对Ridge regression的扩展,看一下Ridge回归的准则函数:

    求解

    一些文章利用矩阵求逆,其实求逆只是表达方便,也可以直接计算。看一下KRR的理论推导,注意到

    左乘,并右乘,得到

    利用Ridge回归中的最优解

    对于xxT的形式可以利用kernel的思想:

    可以看出只需要计算内积就可以,关于核函数的选择以及特性,参考另一篇文章

    先来验证一下理论的正确性,用MATLAB仿真一下:

    clc;clear all;close all;
    x = [-5:.1:5]';
    y = 0.1*x.^3 + 0.3*x.^2 + randn(length(x),1);
    subplot (2,2,1)
    plot(x,y,'k');hold on;
    title('原数据')
    subplot (2,2,2)
    w1 = inv(x'*x)*x'*y; %lsqr
    plot(x,y,'k');hold on;
    plot(x,w1*x,'r--');
    title('最小二乘')
    subplot (2,2,3)
    w2 = inv(x'*x+0.5)*x'*y; %ridge  lambda = 0.5
    plot(x,y,'k');hold on;
    plot(x,w2*x,'r--');
    title('Ridge 回归')
    subplot (2,2,4)
    K = (1+x*x').^3;%kernel ridge regression ,lambda = 0.5
    z = K*pinv(K + 0.5)*y;
    plot(x,y,'k');hold on;
    plot(x,z,'r--');
    title('Kernel Ridge 回归')
    

      结果图中可以看出,kernel 起到了效果:

    二、Sklearn基本基本操作

     基本用法(采用交叉验证):

    kr = GridSearchCV(KernelRidge(kernel='rbf', gamma=0.1), cv=5,
                      param_grid={"alpha": [1e0, 0.1, 1e-2, 1e-3],
                                  "gamma": np.logspace(-2, 2, 5)})
    kr.fit(X[:train_size], y[:train_size])
    y_kr = kr.predict(X_plot)
    

      应用实例:

    from __future__ import division
    import time
    
    import numpy as np
    from sklearn.model_selection import GridSearchCV
    from sklearn.kernel_ridge import KernelRidge
    import matplotlib.pyplot as plt
    
    rng = np.random.RandomState(0)
    
    #############################################################################
    # Generate sample data
    X = 5 * rng.rand(10000, 1)
    y = np.sin(X).ravel()
    
    # Add noise to targets
    y[::5] += 3 * (0.5 - rng.rand(int(X.shape[0]/5)))
    
    X_plot = np.linspace(0, 5, 100000)[:, None]
    
    #############################################################################
    # Fit regression model
    train_size = 100
    
    kr = GridSearchCV(KernelRidge(kernel='rbf', gamma=0.1), cv=5,
                      param_grid={"alpha": [1e0, 0.1, 1e-2, 1e-3],
                                  "gamma": np.logspace(-2, 2, 5)})
    
    t0 = time.time()
    kr.fit(X[:train_size], y[:train_size])
    kr_fit = time.time() - t0
    print("KRR complexity and bandwidth selected and model fitted in %.3f s"
          % kr_fit)
    
    t0 = time.time()
    y_kr = kr.predict(X_plot)
    kr_predict = time.time() - t0
    print("KRR prediction for %d inputs in %.3f s"
          % (X_plot.shape[0], kr_predict))
    
    
    #############################################################################
    # look at the results
    plt.scatter(X[:100], y[:100], c='k', label='data', zorder=1)
    plt.hold('on')
    plt.plot(X_plot, y_kr, c='g',
             label='KRR (fit: %.3fs, predict: %.3fs)' % (kr_fit, kr_predict))
    plt.xlabel('data')
    plt.ylabel('target')
    plt.title('Kernel Ridge')
    plt.legend()

    参考

    •  http://scikit-learn.org/stable/modules/generated/sklearn.kernel_ridge.KernelRidge.html#sklearn.kernel_ridge.KernelRidge
  • 相关阅读:
    优秀网站看前端 —— 小米Note介绍页面
    移动端手势库hammerJS 2.0.4官方文档翻译
    io.js入门(二)—— 所支持的ES6(上)
    发布两款JQ小插件(图片查看器 + 分类选择器),开源
    io.js入门(一)—— 初识io.js
    (翻译)《Hands-on Node.js》—— Why?
    前端神器avalonJS入门(三)
    (翻译)《Hands-on Node.js》—— Introduction
    Linux 安装 adb环境
    MyBatisPlus
  • 原文地址:https://www.cnblogs.com/xingshansi/p/6895710.html
Copyright © 2011-2022 走看看