集成学习学习笔记——数学基础(1)

一、高等数学与线性代数

1.Jacobi矩阵

假设F:Rn——>Rm,则F的Jacobi矩阵为【yi/xj】(m*n)

2.Hessian矩阵         

假设F:Rn——>R,则F的Hessian矩阵为[\frac{df^2}{dx_idx_j}]_{n*n}

二、概率论与随机过程初步

概率空间表示为(\Omega,F,p),其中Omega为全体trial结果的集合,F为Omega的幂集的子集(对事件集合的),P为概率测度。随机变量X(\omega),\omega\in\Omega则为Borel可测函数

随机过程略

三、拒绝采样与MCMC采样

1.拒绝采样

当有一个复杂概率分布f(x),我们需要依照该分布进行随机抽样,以下方法称为拒绝采样:

Step1:取易于抽样的分布g(x)(例如均匀分布、正态分布等),且\exists k\ s.t.\ \forall x\ f(x)<=kg(x)

Step2:While 取样数量未达到目标:

             1)从g(x)中取样得到x_{sample}

             2)依照分布uniform([0,kx_{sample}])抽样得到\mu_{sample}

             3)若f(x_{sample})>=\mu_{sample},则说明\mu_{sample}落在了f的分布范围内,接受此样本,否则拒绝此样本

2.Markov链

1)Markov过程

P(X_{t+1}|X_t,..,X_1)=P(X_{t+1}|X_t)

2)Markov链收敛性质

对非周期Markov链有转移矩阵P,且任意状态间连通(不可约,整个Markov图中只有一个连通类),有以下性质,其中\pi=(\pi(1),..., \pi(i),...,\pi(n))表示状态空间的分布:

【I】\lim_{n \to +\infty}P_{ij}^n=\pi_j

【II】\pi是方程\pi P=\pi的唯一非负解

3)基于Markov链采样

如果得到了某个平稳分布所对应的Markov链转移矩阵,我们就很容易采集到这个平稳分布的样本集,假设初始状态的概率分布为\pi_0(x),第一轮转移后为\pi_1(x),。。。,第i轮后为\pi_i(x),直至第n轮后达到平稳,即:

                                \pi_n(x)=\pi_{n+1}(x)=\pi_{n+2}(x)=...=\pi(x)

采样过程:

Step1:输入Markov状态转移矩阵P,设定转移次数阈值n_1,采样样本数n_2

Step2:从简单分布(uniform,normal)采样得到初始状态值x_0

Step3:loop t=0 to n_1+n_2-1:从条件概率分布P(x|x_t)中采样得到x_{t+1}

样本集合(x_{n_1},x_{n_1+1},...,x_{n_1+n_2-1})即为平稳分布对应的样本集

3.MCMC

【Markov链细致平稳条件】对非周期Markov链的状态转移矩阵P和概率分布\pi(x)\pi(i)P(i,j)=\pi(j)P(j,i)\ \forall i,j,则称概率分布\pi(x)是状态转移矩阵P的平稳分布。

【MCMC采样】

一般情况下,目标平稳分布\pi(x)和某一个Markov状态转移矩阵Q不满足细致平稳条件,即:

\pi(i)Q(i,j)\ne \pi(j)Q(j,i)

因此做如下改造:

\pi(i)Q(i,j)\alpha(i,j)=\pi(j)Q(j,i)\alpha(j,i)

\alpha(i,j) = \pi(j)Q(j,i)

\alpha(j,i)=\pi(i)Q(i,j)

P(i,j)=Q(i,j)\alpha(i,j)

\alpha(i,j)称为接受率,处于[0,1],可以理解为一个概率值,目标矩阵P可以通过任意一个Markov状态转移矩阵Q以特定的接受率获得。

Algo

1)输入任意选定的Markov链状态转移矩阵Q,平稳分布\pi(x),设定转移次数阈值n_1,采样样本数n_2

2)从简单分布(uniform,normal)采样得到初始状态值x_0

3)loop t=0 to n_1+n_2-1:
        a)从条件概率分布Q(x|x_t)中采样得到样本x_*

        b)从均匀分布中采样u\sim uniform[0,1]

        c)如果u<\alpha(x_t,x_*)=\pi(x_*)Q(x_*,x_t),则接收转移x_t\rightarrow x_*,即x_{t+1}=x_*

        d)否则x_{t+1}=x_t

样本集合(x_{n_1},x_{n_1+1},...,x_{n_1+n_2-1})即为平稳分布对应的样本集

Disadvantages

3)c)中,接受率一般十分小,导致大部分转移都被拒绝,马尔可夫链不收敛,n_1需要取得很大

【Metropolis-Hastings采样】

对接受率做等比缩放即可,例如

\pi(i)Q(i,j)\alpha(i,j)=\pi(j)Q(j,i)\alpha(j,i)

 问题一般是\alpha(i,j),\alpha(j,i)太小了,但以上等式两侧同时扩大n倍依旧成立,故对接受率做如下调整:

\alpha(i,j)=min({\frac{\pi(j)Q(j,i)}{\pi(i)Q(i,j)},1 })

Algo:

1)输入任意选定的Markov链状态转移矩阵Q,平稳分布\pi(x),设定转移次数阈值n_1,采样样本数n_2

2)从简单分布(uniform,normal)采样得到初始状态值x_0

3)loop t=0 to n_1+n_2-1:
        a)从条件概率分布Q(x|x_t)中采样得到样本x_*

        b)从均匀分布中采样u\sim uniform[0,1]

        c)如果u<\alpha(x_t,x_*)=min(\frac{\pi(j)Q(j,i)}{\pi(i)Q(i,j)},1),则接收转移x_t\rightarrow x_*,即x_{t+1}=x_*

        d)否则x_{t+1}=x_t

样本集合(x_{n_1},x_{n_1+1},...,x_{n_1+n_2-1})即为平稳分布对应的样本集

Notation:选择对称的Markov状态转移矩阵Q,接受率可转换为\alpha(i,j)=min(\frac{\pi(j)}{\pi(i)},1)

四、Exercise

给定下述Rosenbrock函数,,其中,。试编写程序完成下述工作:

  1. 为不同的a,b取值,绘制该函数的3D表面。请问 a,b取值对该表面形状有大的影响吗?,所谓大影响就是形状不再相似。对a,b的取值区间,能否大致给出一个分类,像下面这样给出一张表:
b>0

b<0

b=0

 

 

 

      2.编写一个算法来找到它的全局最小值及相应的最小解,并在3D图中标出。分析一下你的算法            时空效率、给出运行时间。

思路:利用梯度下降法进行搜索

初始化参数a=1,b=1,代码如下

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

plt.style.use("ggplot")


def rosenbrock_func(param_1, param_2, a, b):
    return (a - param_1) ** 2 + b * (param_2 - param_1 ** 2) ** 2


def rosenbrock_delta(param_1, param_2, a, b, param_index):
    if param_index == 1:
        return 2 * (param_1 - a) + 4 * b * (param_1 ** 2 - param_2) * param_1
    else:
        return 2 * b * (param_2 - param_1 ** 2)


def gradient_descent(x1_primal, x2_primal, a, b, learning_rate=0.1, error_threshold=1e-5, max_iter=1e5):
    iter_num, error, y_old = 0, float('inf'), rosenbrock_func(x1_primal, x2_primal, a, b)
    gd_x1, gd_x2, gd_y, error_list = [x1_primal], [x2_primal], [y_old], [error]
    while error > error_threshold and iter_num < max_iter:
        iter_num += 1
        x1_primal = x1_primal - learning_rate * rosenbrock_delta(x1_primal, x2_primal, a, b, 1)
        x2_primal = x2_primal - learning_rate * rosenbrock_delta(x1_primal, x2_primal, a, b, 2)
        y_new = rosenbrock_func(x1_primal, x2_primal, a, b)
        error = abs(y_new - y_old)
        y_old = y_new
        gd_x1.append(x1_primal)
        gd_x2.append(x2_primal)
        gd_y.append(y_new)
        error_list.append(error)
    return [gd_x1, gd_x2, gd_y, iter_num, error_list]


def func_plot(x1, x2, y, ex_x1=None, ex_x2=None, ex_y=None):
    fig = plt.figure()
    ax1 = plt.axes(projection='3d')
    ax1.plot_surface(x1, x2, y, alpha=0.3, cmap='rainbow')
    if ex_x1 and ex_x2 and ex_y:
        ax1.scatter3D(ex_x1, ex_x2, ex_y, c='red', norm=1, )
    ax1.set_xlabel('X1')
    ax1.set_ylabel('X2')
    ax1.set_zlabel('Y')
    plt.show()
    return


if __name__ == '__main__':
    param1_array, param2_array = np.arange(-10, 10, 0.01), np.arange(-10, 10, 0.01)
    x1_list, x2_list = np.meshgrid(param1_array, param2_array)
    y_list = rosenbrock_func(x1_list, x2_list, 1, 1)
    gd_x1, gd_x2, gd_y, iter_num, error_list = gradient_descent(2, 2, 1, 1)
    print(gd_x1[-1], gd_x2[-1], gd_y[-1], iter_num, error_list[-1])
    func_plot(x1_list, x2_list, y_list, gd_x1[-1], gd_x2[-1], gd_y[-1])

迭代次数53次,求解得到全局最小值0.0001108,x1=1.00978,x2=1.02354

在函数中表现为:

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值