load方法和initialize方法对比

load方法:

        1. load方法是在before main阶段 在类的初始化阶段被调用的

        2. load的调用顺序为:父类load ---> 子类load ---> Category的load

        3.load方法是一个类最早可以被跟踪的方法

        4. 由于category的load方法不会覆盖类的load方法,因此是写swizzle代码最好时机  

+[XXClass load]  //对应类的load方法
call_class_loads() //找到loadable_class的load方法并调用
call_load_methods()  //扫描镜像中的load方法,生成loadable_class列表
load_images() //加载镜像(动态库)
dyld::notifySingle(dyld_image_states, ImageLoader const*)
_dyld_start

        load方法实际是在load_images方法中被调用的。其调用顺序load_images -> call_load_methods -> call_class_loads -> [xxClass load]

        具体过程是,load_images将所有镜像(动态库)加载到内存,接着对镜像进行扫描,将所有包含 load 方法的类加入列表 loadable_classes ,然后从这个列表中找到对应的 load 方法的实现,调用 load 方法。

initialize方法:

         1. initialized方法是在afert main阶段第一次向类发送消息时调用的。

         2. 如果类和类Category都实现了initialize方法,调用Category的initialize方法,会覆盖类中的方法,只执行一个,如果多个category,则调用编译顺序最后的initialize方法。 

        3. 如果父类和子类都实现了initialize方法, 在调用子类时,如果父类的initialize方法调用过,则只调用子类initialize方法。 如果父类没用过,则先调用父类的Category的initialize方法,调用子类的initialize方法

        4. 如果子类没有实现initialize方法,父类实现了initialize方法,调用子类的时候,会先调用父类的initialize方法,再调用子类的实例方法

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
由于差分进化贝叶斯MCMC方法比较复杂,本回答只提供一个简单的matlab示例,仅供参考。 假设我们要估计一个二元logistic回归模型的参数,数据集为data.mat,其中包含了自变量x和因变量y。模型的参数为$\beta_1$和$\beta_2$,先验分布为正态分布,均值为0,方差为10。差分进化贝叶斯MCMC的核心代码如下: ```matlab % load data load data.mat % prior distribution prior_mean = [0; 0]; prior_var = [10 0; 0 10]; % likelihood function log_likelihood = @(beta) sum(y.*log(1./(1+exp(-(beta(1)+beta(2)*x)))) + (1-y).*log(1-1./(1+exp(-(beta(1)+beta(2)*x))))); % posterior distribution log_posterior = @(beta) log_likelihood(beta) + log(mvnpdf(beta, prior_mean, prior_var)); % MCMC parameters n_iter = 10000; burn_in = 5000; n_chains = 3; n_dim = 2; step_size = 0.1; % initialize chains chains = zeros(n_iter, n_chains, n_dim); for chain = 1:n_chains % initialize chain current_beta = [0; 0]; current_log_posterior = log_posterior(current_beta); % run MCMC for iter = 1:n_iter % generate new proposal proposal_beta = current_beta + step_size*randn(n_dim, 1); proposal_log_posterior = log_posterior(proposal_beta); % compute acceptance probability accept_prob = exp(proposal_log_posterior - current_log_posterior); % accept or reject proposal if rand < accept_prob current_beta = proposal_beta; current_log_posterior = proposal_log_posterior; end % save current state chains(iter, chain, :) = current_beta; end end % discard burn-in period chains = chains(burn_in+1:end, :, :); % compute posterior mean and covariance posterior_mean = squeeze(mean(chains, 1)); posterior_cov = cov(reshape(chains, [], n_dim)); % plot chains figure subplot(2, 1, 1) plot(squeeze(chains(:, 1, :))) title('Chain 1') subplot(2, 1, 2) plot(squeeze(chains(:, 2, :))) title('Chain 2') % plot posterior distribution figure scatter(chains(:, :, 1), chains(:, :, 2), '.') hold on contour(posterior_mean(1), posterior_mean(2), posterior_cov(1, 1), 'LineWidth', 2) contour(posterior_mean(1), posterior_mean(2), posterior_cov(2, 2), 'LineWidth', 2) xlabel('\beta_1') ylabel('\beta_2') title('Posterior Distribution') ``` 上述代码中,我们首先加载数据集和先验分布,然后定义似然函数和后验分布函数。接着,我们设置MCMC的参数,包括迭代次数、burn-in期、链的数量、参数维度和步长大小。初始化MCMC链,并在每个链上运行MCMC。在每个迭代步骤中,我们生成一个新的提议,计算接受概率,接受或拒绝提议,并保存当前状态。最后,我们丢弃burn-in期,并计算后验均值和协方差矩阵。我们还绘制了每个链的轨迹和后验分布的散点图。 需要注意的是,本示例仅用于演示差分进化贝叶斯MCMC方法的基本思想,实际应用中需要更加细致地选择步长大小和迭代次数,并进行收敛诊断和后验分析等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值