专业学习|通过案例了解蒙特卡罗模拟实操步骤与含义

news2025/2/6 17:22:43

一、蒙特卡罗模拟介绍

        蒙特卡罗模拟(Monte Carlo Simulation)是一种基于随机采样的数值计算方法,用于解决具有不确定性复杂概率分布的问题。其核心思想是通过多次随机抽样来逼近系统的行为或目标函数的真实值,进而对系统进行评估、预测或优化。蒙特卡罗模拟被广泛应用于金融、工程、物理科学、计算机科学等领域,尤其是在无法通过解析方法直接求解问题时。

(一)背景知识

        1945年,在第二次世界大战即将结束之际,一场看似简单的纸牌游戏引发了计算领域的重大突破。这项突破最终导致了蒙特卡洛方法的诞生。参与曼哈顿计划的科学家斯坦尼斯劳·乌拉姆在康复期间深入思考了纸牌游戏中的概率问题。他意识到通过反复模拟,可以有效地近似复杂的概率问题。随后乌拉姆与同事约翰·冯·诺依曼讨论了这一想法,共同奠定了蒙特卡洛方法的理论基础。该方法的命名灵感来自摩纳哥著名的蒙特卡洛赌场,象征着其处理高风险和不确定性的特性。

(二) 蒙特卡罗模拟的优缺点

(1)优点

◾  适应性强:蒙特卡罗模拟适用于各种复杂问题,特别是在存在不确定性和随机性的系统中。

◾  直观且灵活:可以处理非线性、复杂概率分布的问题,不依赖解析解。

◾  结果稳定性:通过增加模拟次数可以提升结果的准确性和稳定性。

(2)缺点

◾  计算成本高:需要大量的随机采样和计算,模拟次数较多时,计算资源消耗较大。

◾ 收敛较慢:蒙特卡罗模拟的精度随着样本数量增加而提升,但收敛速度相对较慢。

◾ 依赖于输入分布的准确性:模拟结果依赖于输入参数的分布,如果输入数据不准确,会影响模拟的结果。

(三)蒙特卡罗模拟的基本步骤

蒙特卡罗模拟通过以下步骤进行估计:

1. 定义问题或目标函数:首先定义需要模拟的过程或系统,设定所需的参数和条件。例如,在计算积分、优化某个目标函数或评估系统的表现等。

2. 随机采样:根据问题的输入参数,生成多个随机样本。例如,从某个概率分布中抽取一组样本,用来模拟系统的不同状态。

3. 计算输出:对每一个随机样本,计算目标函数的输出值。这些输出值相当于多个模拟结果。

4. 汇总统计:将所有模拟结果进行统计分析,计算平均值、方差、置信区间等,用于估计目标函数的期望值或其他指标。

蒙特卡罗模拟的准确性随着采样次数的增加而提高;通常,采样次数越多,模拟结果越接近真实值。

(四) 应用场景

        蒙特卡罗模拟的应用场景包括但不限于以下几个方面:

1.金融风险评估

        在金融领域,蒙特卡罗模拟用于评估投资组合的风险、期权定价、信用风险等。例如,通过对不同的市场价格、利率等变量进行随机抽样,模拟资产在未来的可能收益或损失。

2.工程可靠性分析

         蒙特卡罗模拟用于评估系统或设备的可靠性。可以通过对系统关键参数(如负载、环境条件)的不同组合进行模拟,从而估算系统在各种条件下的失效概率或寿命分布。

3.物理科学中的数值计算

        在物理和化学等领域,蒙特卡罗模拟用于求解复杂的积分问题和模拟随机过程。例如,模拟粒子的随机运动路径以研究扩散、热传导等现象。

4.项目管理与决策分析

        在项目管理中,蒙特卡罗模拟用于估计项目的完成时间或成本。通过对不同工期或成本因素的随机模拟,项目经理可以更准确地预测可能的项目延误或成本超支。

(五)简单案例

        假设想估计某工厂的生产过程中的产量不确定性,工厂的生产能力受到多个因素影响,如设备故障、原料供应波动、操作员的熟练程度等。这些因素都有一定的随机性,不能准确预测。

可以通过以下步骤使用蒙特卡罗模拟来估计产量的范围:

  1. 定义随机变量

    • 机器故障的概率:10%。

    • 原料供应的波动:正态分布,均值为1000单位,标准差为50单位。

    • 操作员熟练度的影响:正态分布,均值为0.9(即操作员效率为90%),标准差为0.05。

  2. 生成随机样本

    • 在每次模拟中,随机抽取机器故障概率、原料供应量和操作员熟练度。

  3. 计算每次模拟的结果

    • 结合随机抽取的参数,计算产量。假设计算公式为:产量 = 原料供应量 × 操作员效率 ×(1 - 机器故障概率)。

  4. 统计分析

    • 经过成千上万次模拟,得到产量的概率分布。这些模拟结果帮助你评估产量的可能范围,并确定最大可能产量和最小可能产量。

    • 仿真模型

      利用Plant Simulation2404版本的Python模块可以非常方便地进行模拟仿真;模型如下图所示。

      图片

      模型中定义设备故障率,原材料供应波动因子,生产工效数据以及仿真模拟的次数定义。最后系统统计输出当前条件下的产能输出的直方分布,就可以确定当前系统的配置可能的产能。如下图所示分布,,可以看出当前的最可能的产出为890。

图片

二、案例实现

(一)网络搜索、随机猜测与蒙特卡洛模拟

        为了直观理解蒙特卡洛模拟,我们可以考虑一个估算π值的例子。想象一个特殊的飞镖游戏:你被蒙上眼睛,随机向一个大正方形飞镖靶投掷飞镖。这个正方形内有一个圆形目标。目标是通过这个游戏来估计π的值。

        圆的面积与正方形面积的比率是π/4。因此,如果投掷大量飞镖,落在圆内的飞镖数量与总飞镖数量的比率应该近似于π/4。将这个比率乘以4,就得到了π的估计值。

(1)随机猜测

import random
import plotly.graph_objects as go
import numpy as np

# 设置猜测次数
num_guesses = 6

# 生成单位圆的坐标
theta = np.linspace(0, 2 * np.pi, 100)
unit_circle_x = np.cos(theta)
unit_circle_y = np.sin(theta)

# 进行多次猜测
for i in range(num_guesses):
    # 在2到4之间随机猜测pi的值
    pi_guess = random.uniform(2, 4)

    # 根据猜测生成圆的坐标
    radius = pi_guess / np.pi  # 修正:将猜测的pi值与单位圆的半径进行比较
    circle_x = radius * np.cos(theta)
    circle_y = radius * np.sin(theta)

    # 创建散点图
    fig = go.Figure()

    # 添加猜测的圆
    fig.add_trace(go.Scatter(
        x=circle_x,
        y=circle_y,
        mode='lines',
        line=dict(color='blue', width=3),
        name='Estimated Circle'
    ))

    # 添加单位圆
    fig.add_trace(go.Scatter(
        x=unit_circle_x,
        y=unit_circle_y,
        mode='lines',
        line=dict(color='green', width=3),
        name='Unit Circle'
    ))

    # 更新图形布局
    fig.update_layout(
        title=f"Fig1{chr(97 + i)}: Randomly Guessing Pi: {pi_guess}",
        width=600,
        height=600,
        xaxis=dict(
            constrain="domain",
            range=[-1.5, 1.5]  # 修正:扩大范围以便显示所有圆
        ),
        yaxis=dict(
            scaleanchor="x",
            scaleratio=1,
            range=[-1.5, 1.5]  # 修正:扩大范围以便显示所有圆
        )
    )

    # 显示图形
    fig.show()

结果:这段代码生成了一系列图形(图1a到图1f),展示了随机猜测π值的结果。每次猜测都会生成一个不同大小的圆,与实际的单位圆(绿色)进行比较。

(2)蒙特卡洛方法

# Monte Carlo Estimation of Pi
# 导入必要的库
import random
import math
import plotly.graph_objects as go
import plotly.io as pio
import numpy as np

# 设置飞镖数量
num_darts = 10000
darts_in_circle = 0

# 存储飞镖坐标
x_coords_in, y_coords_in, x_coords_out, y_coords_out = [], [], [], []

# 设置图形数量
num_figures = 6
darts_per_figure = num_darts // num_figures

# 生成单位圆
theta = np.linspace(0, 2 * np.pi, 100)
unit_circle_x = np.cos(theta)
unit_circle_y = np.sin(theta)

# 模拟投掷飞镖
for i in range(num_darts):
    x, y = random.uniform(-1, 1), random.uniform(-1, 1)

    if math.sqrt(x**2 + y**2) <= 1:
        darts_in_circle += 1
        x_coords_in.append(x)
        y_coords_in.append(y)
    else:
        x_coords_out.append(x)
        y_coords_out.append(y)

    # 每投掷 darts_per_figure 次飞镖后绘制一次图形
    if (i + 1) % darts_per_figure == 0:
        pi_estimate = 4 * darts_in_circle / (i + 1)
        estimated_circle_radius = math.sqrt(pi_estimate / math.pi)  # 修正:正确计算估计圆的半径
        estimated_circle_x = estimated_circle_radius * np.cos(theta)
        estimated_circle_y = estimated_circle_radius * np.sin(theta)

        fig = go.Figure()

        fig.add_trace(go.Scattergl(
            x=x_coords_in,
            y=y_coords_in,
            mode='markers',
            name='Darts Inside Circle',
            marker=dict(color='green', size=4, opacity=0.8)
        ))
        fig.add_trace(go.Scattergl(
            x=x_coords_out,
            y=y_coords_out,
            mode='markers',
            name='Darts Outside Circle',
            marker=dict(color='red', size=4, opacity=0.8)
        ))

        fig.add_trace(go.Scatter(
            x=unit_circle_x,
            y=unit_circle_y,
            mode='lines',
            name='Unit Circle',
            line=dict(color='green', width=3)
        ))
        fig.add_trace(go.Scatter(
            x=estimated_circle_x,
            y=estimated_circle_y,
            mode='lines',
            name='Estimated Circle',
            line=dict(color='blue', width=3)
        ))

        fig.update_layout(
            title=f"Figure {chr(97 + (i + 1) // darts_per_figure - 1)}: Thrown Darts: {(i + 1)}, Estimated Pi: {pi_estimate:.6f}",
            width=600,
            height=600,
            xaxis=dict(constrain="domain", range=[-1, 1]),
            yaxis=dict(scaleanchor="x", scaleratio=1, range=[-1, 1]),
            legend=dict(yanchor="top", y=0.99, xanchor="left", x=0.01)
        )
        fig.show()

        # 保存图形为图片
        pio.write_image(fig, f"fig2{chr(97 + (i + 1) // darts_per_figure - 1)}.png")

结果:这段代码生成了另一系列图形,展示了使用蒙特卡洛方法估计π的过程。绿点表示落在圆内的飞镖,红点表示落在圆外的飞镖。

图片

图片

(3)网络搜索

 from sklearn.model_selection import GridSearchCV
 
 hyperparameters = {'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000],
                    'penalty': ['l1', 'l2']}
 
 grid_search = GridSearchCV(LogisticRegression(), hyperparameters, cv=5, scoring='roc_auc')
 grid_search.fit(X_train, y_train)
 
 best_params = grid_search.best_params_
 print(f'Best hyperparameters: {best_params}')
 
 best_model = grid_search.best_estimator_
 y_pred_best = best_model.predict(X_test)
 accuracy_best = accuracy_score(y_test, y_pred_best)
 roc_auc_best = roc_auc_score(y_test, y_pred_best)
 
 print("Grid Search Method " + f'Accuracy of the best model: {accuracy_best}')
 print("Grid Search Method " + f'ROC-AUC of the best model: {roc_auc_best}')

(4)分析总结

        网格搜索方法通过评估超参数空间中所有可能组合的性能来选择"最佳"超参数。它使用交叉验证来评估每种组合在训练数据的不同子集上的平均性能。这种方法可以系统地探索整个超参数空间,但当超参数数量增加时,计算成本会急剧上升。

        相比之下,蒙特卡洛方法随机采样超参数空间,并在整个训练集上评估模型性能。这种方法不使用交叉验证,因此可能更容易受到过拟合的影响。但是它能够更快地探索大型超参数空间,并且在计算资源有限的情况下可能更为实用。

(二)直观案例——用图表展示全过程

        蒙特卡洛模拟是一种数学建模的办法,可以让您看到所有可能的结果,通过随机计算去模拟以前的历史数据,并预测未来的项目在差不多的情况下会出现哪些结果,您可以依靠这些数据做出更多决定。

(1)步骤一 定义过程输入与输出

        首先,我们先定义输入,以及它们的分布情况。

        过程输入会在回归输出里列出来,工程师们对每个变量的典型均值和标准差那可都很熟悉,他们能够从 Minitab Statistical Software 中复制用来描述过程的回归方程,然后把它粘贴到 Engage 的 Monte Carlo 工具里,这样就能像下图这样轻松输入关键信息。

图片

        接下来我们再来验证模型,Engage 会以超级快的速度运行 50000 次模拟,您也可以自己指定更大或者更小的次数值。

图片

        Engage 能用能力分析典型输出解释结果;能运行模拟并确定后续做法,对不令人满意的过程提出改进步骤;知道控制均值比控制变异性容易,提出进行参数优化以找到合适均值设置。

(2)步骤 2:定义参数优化的目标和搜索范围

        在这个阶段,我们希望 Engage 能找到最佳均值输入设置组合减少缺陷,我们可通过参数优化指定目标并定义输入变量合理搜索范围。

图片

        模拟结果出来了!

图片

        我们可以看到缺陷百分比下降了,在表中还可以看到最佳的输入设置,但 Ppk 统计量仍低,Engage 还会推荐后续改进步骤。

图片

(3)步骤三 控制变异性

        到目前为止,我们已经通过优化均值输入设置减少缺陷,但还需减少过程输入变异性,减少变异性较难,Engage 的创新图表可以帮助确定哪些输入控制变异性可最大程度减少缺陷数量。

图片

        图中找带倾斜直线的输入可减小标准差降低输出变异性,图中找带倾斜直线的输入可减小标准差降低输出变异性,带平直直线的输入可放宽公差;斜率相等时可尝试减小几个输入标准差,利用过程知识确定减少量,可点击线上点或用表中下拉菜单更改设置。

(4)最终的结论

图片

        成功啦!过程中的缺陷数量减少了,Ppk 统计量达到了1.34,高于基准值。假定表展示新设置和标准差,如果我们再次运行参数优化,相信我们的缺陷会更少。

(三)在量化投资组合优化中的应用案例

(1)蒙特卡洛模拟在量化投资中怎么用?

        通过大量随机抽样来模拟不确定性,从而得到可能结果的概率分布。在量化投资中,它通过生成大量随机场景来模拟资产价格走势,帮助投资者理解风险和收益的分布。

        蒙特卡洛模拟常用于投资组合的收益和风险评估。例如,通过模拟一个投资组合在不同市场条件下的表现,投资者可以估计未来的收益分布以及可能面临的风险。

        在量化投资中,蒙特卡洛模拟还可以用于期权定价、资产价格预测以及对非线性或者复杂金融模型的求解。

(2)在投资组合风险评估中,蒙特卡洛模拟主要模拟哪些变量?

在投资组合风险评估中,蒙特卡洛模拟主要模拟以下变量:

  1.  资产收益率:通过模拟资产未来的收益率分布,评估投资组合在不同市场环境下的收益表现。

  2.  波动率:模拟资产价格的波动性,衡量投资组合的风险水平。

  3.  资产间相关性:模拟不同资产之间的相关性变化,分析投资组合的分散化效果和系统性风险。

  4.  市场风险因子:模拟宏观经济变量(如利率、通胀、汇率等)或市场风险因子(如股票市场指数、信用利差等)的变化,评估其对投资组合的影响。

这些变量的模拟帮助投资者更全面地理解投资组合的风险特征,并为风险管理决策提供依据。

(3)假设你要对一个由股票和债券组成的投资组合进行蒙特卡洛模拟,需要收集哪些基础数据?

需要收集:

  • 历史收益率数据:用于估计资产的未来收益分布。

  • 各资产的历史波动率:用于衡量资产的风险水平。

  • 资产间的相关系数:用于评估资产之间的联动性。

  • 当前投资组合权重:用于确定初始投资组合的构成。

  • 无风险利率:用于计算风险溢价和折现未来现金流。

  • 投资期限:用于确定模拟的时间跨度。

  • 预期通胀率:用于调整实际收益率。

  • 交易成本:用于更准确地模拟投资组合的调整过程。

  • 税收影响:用于考虑不同资产的税务处理差异。

  • 宏观经济指标:如GDP增长率、失业率等,用于模拟经济环境变化对资产的影响。

  • 政策变化:如利率政策、财政政策等,用于模拟政策变动对市场的冲击。

  • 市场情绪指标:如投资者信心指数,用于模拟市场情绪波动对资产价格的影响。

(4)在进行蒙特卡洛模拟时,如何确定合适的模拟次数?

确定模拟次数需要考虑:

  • 精确度要求:通常最少需要1000次,要求更精确则10000次以上
    计算资源限制:次数越多耗时越长

  • 收敛性检验:当增加模拟次数对结果影响很小时,说明次数已足够

  •  经验法则:对于一般投资组合分析,5000-10000次模拟通常能提供可靠结果

(5)如何解释蒙特卡洛模拟的结果?

主要从以下几个方面解释:

  • 期望收益:所有模拟路径的平均收益

  • 风险指标:

    • VaR (Value at Risk):特定置信水平下的最大潜在损失

    • 标准差:收益的波动程度

  • 概率分布:模拟结果的分布形态

  • 极端情况:最好和最差情况的分析

(6)进行投资组合风险评估时,蒙特卡洛模拟的基本步骤是什么?

投资组合风险评估的蒙特卡洛模拟基本步骤:

  1.  定义问题和输入变量(如投资组合回报率、波动率等)。

  2.  模拟输入变量的随机分布(例如,假设回报率符合正态分布)。

  3. 重复多次随机抽样,每次计算对应结果(如投资组合价值)。

  4.  分析结果,观察概率分布、均值、方差等统计量。

(7)蒙特卡洛模拟在投资组合优化中的应用?

其主要应用包括:

  1.  生成有效前沿:通过随机生成大量可能的资产组合,蒙特卡洛模拟能够帮助投资者描绘出风险与收益之间的有效前沿,从而识别出在不同风险水平下可能获得的最优收益组合。

  2.  计算最优权重:利用蒙特卡洛模拟,投资者可以模拟不同资产权重配置下的投资结果,进而通过优化算法确定在给定风险偏好下的最优资产配置比例。

  3. 评估不同投资策略的表现:蒙特卡洛模拟允许投资者在多种市场情景下测试和比较不同投资策略的表现,从而选择出最适合当前市场环境的策略。

  4. 压力测试:通过模拟极端市场条件,蒙特卡洛模拟能够帮助投资者评估投资组合在不利市场环境下的表现和潜在风险,从而提前做好风险管理和应对策略。

(8)在投资组合风险评估中,蒙特卡洛模拟为什么需要生成大量随机样本?

生成大量随机样本是为了捕捉潜在市场条件下投资组合的所有可能结果。样本越多,模拟结果越接近真实的概率分布。这有助于评估极端情况(如极低收益或亏损)发生的可能性。

(9)蒙特卡洛模拟如何评估投资组合的“在险价值”(VaR,Value at Risk)?

步骤如下:

  1.  使用蒙特卡洛模拟生成大量投资组合未来价值的分布。

  2. 按照指定置信水平(如 95% 或 99%),确定分布的分位点。

  3. VaR 是在该置信水平下的最大可能亏损。例如,95% VaR 表示“有 5% 的概率,投资组合损失会超过 VaR 值”。

VaR 通过蒙特卡洛模拟评估,更能捕捉复杂投资组合的非线性和非正态分布特性。

(10)如何通过蒙特卡洛模拟评估投资组合的夏普比率不确定性?

步骤如下:

  1. 使用蒙特卡洛模拟生成投资组合未来的回报率分布。

  2. 对每次模拟计算投资组合的年化收益和波动率,并计算夏普比率(夏普比率 = 年化收益 / 年化波动率)。

  3. 汇总所有模拟结果,分析夏普比率的分布,这样可以了解夏普比率的不确定性范围。

(11)如何在蒙特卡洛模拟中引入相关性以反映多资产投资组合的特性?

多资产投资组合中,资产之间的相关性对组合风险影响很大。在蒙特卡洛模拟中:

  1. 使用协方差矩阵定义资产之间的相关性。

  2.  生成资产回报的随机样本时,可以使用Cholesky 分解或其他方法,确保生成的随机数满足指定的相关性结构。

  3.  基于这些相关性随机样本计算投资组合的回报分布。

(12)蒙特卡洛模拟的结果可能有哪些局限性?

蒙特卡洛模拟的局限性包括:

  1.  计算成本高:需要大量迭代,特别是在高维问题中,计算时间可能很长。

  2.  模型依赖性:模拟的结果高度依赖于输入的假设(如资产价格分布、波动率等)。如果假设不准确,结果可能误导决策。 例如,假设回报率符合正态分布,而实际市场可能存在厚尾现象。

  3.  无法预测极端事件:蒙特卡洛模拟通常依赖历史数据,难以捕捉“黑天鹅”事件等极端情况。

  4. 随机误差:尽管大样本可以减少误差,但仍会有一定的随机波动。

说明:
使用蒙特卡洛模拟时,投资者需要结合其他分析方法,并对假设进行严格的验证。

(13)与历史模拟法相比,蒙特卡洛模拟有哪些优势?

蒙特卡洛模拟的优势:

  1. 灵活性更高:可以模拟任意假设的回报分布,而历史模拟仅能基于过去数据。

  2. 可扩展性:能够引入复杂的相关性结构和非线性特性。

  3. 极端情况分析:可以通过调整输入参数测试极端情景。

然而,历史模拟法基于真实历史数据,避免了模型假设的错误,因此两者可以互为补充。

(四)依照建模步骤进行建模

(1)代码实现

以下是建立蒙特卡洛模型的基本步骤:‌

        1.定义参数

设置模型所需的参数,包括模拟次数、投资金额、各项资产的预期回报率、波动性和相关性矩阵等。

      2.设置随机变量的分布

根据历史数据或设定的假设,定义每个随机变量的概率分布。以投资组合为例,每只资产的回报率可能假设符合正态分布,并设定其均值和标准差。

     3.生成随机权重
使用 numpy.random.dirichlet 函数生成权重,确保在模拟中保持各资产的权重总和为1。

     4.执行蒙特卡洛模拟
使用循环进行多次模拟,每次模拟生成一组资产的回报率样本,将这些样本代入模型公式中,计算每个模拟场景的投资组合回报率。然后将这些结果保存下来。

下面是一个简单的示例代码:‌

图片

代码说明

1.参数设置:

定义了模拟次数、投资组合的资产数量、每个资产的预期回报率和波动性。

2.权重生成:

随机生成每次模拟的资产权重组合。

3.蒙特卡洛模拟:

生成每个资产的回报样本,计算投资组合的总回报。

4.结果分析与可视化:

输出平均回报率、标准差及 95% 置信区间,并展示投资组合回报率分布的直方图。

5.输出

该代码将输出投资组合的平均年回报率、标准差以及置信区间,并显示蒙特卡洛模拟的回报率分布图。

图片

(2) 模型优缺点

1优点:蒙特卡洛模型可以处理高度复杂的系统,且适用于多种不确定性条件;相比传统解析方法,它对问题的数学描述要求较低。

缺点:模拟结果的准确性依赖于样本数量,计算量较大;此外,对模型和分布的假设要求较高,误差不可避免。

学习资料:

[1]学术漫谈 | 蒙特卡罗模拟

[2]一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析

[3]穿越数据迷雾:Monte Carlo模拟全景探索

[4]CICC科普栏目|一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析

[5]蒙特卡洛模拟在量化投资中的使用

[6]1.Monte Carlo and Quasi-Monte Carlo Methods 2006
2.Monte_Carlo_Methods_in_Financial_Engineering_Paul_Glasserman_
3.SAS for Monte Carlo Studies A Guide for Quantitative Researchers

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2293886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构【链栈】

基于 C 实现链表栈&#xff1a;原理、代码与应用 一、引言 栈就是一个容器&#xff0c;可以当场一个盒子&#xff0c;只能一个一个拿&#xff0c;一个一个放&#xff0c;而且是从上面放入。 有序顺序栈操作比较容易【会了链栈之后顺序栈自然明白】&#xff0c;所以我们这里只…

人工智能|本地部署|ollama+chatbox快速Windows10下部署(初级篇)

一、 前言&#xff1a; 其实早一个月我已经使用过deepseek&#xff0c;并且也在自己的机器上通过ollama部署过&#xff0c;但一直没有太多动力&#xff0c;现在感觉还是的记录一下&#xff0c;省的自己给忘掉了 本文只是简单记录一下ollamaopen-webuichatbox部署通过网盘分享…

Android Studio 下载安装教程(2024 更新版),附详细图文

今天&#xff0c;为大家带来的是Android Studio 2024更新版的下载安装教程&#xff0c;包含详细图文步骤。 随着 Android Studio 的不断更新&#xff0c;自从引入 Koala 系列后&#xff0c;其版本号的命名规则也发生了变化。以本次更新为例&#xff0c;版本号为 2024.2.1&#…

6.【BUUCTF】[SUCTF 2019]CheckIn

打开题目页面如下 看样子是一道有关文件上传的题 上传一句话木马 显示&#xff1a;非法后缀&#xff01; 看来.php后缀被过滤了 上传一张带有木马的照片 在文件地址处输入cmd 输入以下代码执行 copy 1.jpg/b4.php/a 5.jpg 最后一行有一句话木马 上传带有木马的图片 但其实…

在线教程丨YOLO系列10年更新11个版本,最新模型在目标检测多项任务中达SOTA

YOLO (You Only Look Once) 是计算机视觉领域中最具影响力的实时目标检测算法之一&#xff0c;以其高精度与高效性深受业界青睐&#xff0c;广泛应用于自动驾驶、安防监控、医疗影像等领域。 该模型最早于 2015 年由华盛顿大学研究生 Joseph Redmon 发布&#xff0c;开创了将目…

FreeRTOS学习 --- 中断管理

什么是中断&#xff1f; 让CPU打断正常运行的程序&#xff0c;转而去处理紧急的事件&#xff08;程序&#xff09;&#xff0c;就叫中断 中断执行机制&#xff0c;可简单概括为三步&#xff1a; 1&#xff0c;中断请求 外设产生中断请求&#xff08;GPIO外部中断、定时器中断…

Docker基础以及单体实战

Docker 一、Docker1.1 Docker组成1.2 Dcoker运行图1.3 名称空间Namepace 1.4 docker、Docker compose、kubermetes 二、Docker安装2.1 在线Docker安装2.2 使用官方通用安装脚本2.3 二进制安装Docker三、Docker基础命令3.1 启动类3.2 镜像类3.3 容器类3.4 网络类3.5 Docker comp…

FFmpeg rtmp推流直播

文章目录 rtmp协议RTMP协议组成RTMP的握手过程RTMP流的创建RTMP消息格式Chunking(Message 分块) rtmp服务器搭建Nginx服务器配置Nginx服务器 librtmp库编译推流 rtmp协议 RTMP&#xff08;Real Time Messaging Protocol&#xff09;是由Adobe公司基于Flash Player播放器对应的…

2025Java面试题超详细整理《微服务篇》

什么是微服务架构&#xff1f; 微服务框架是将某个应用程序开发划分为许多独立小型服务&#xff0c;实现敏捷开发和部署&#xff0c;这些服务一般围绕业务规则进行构建&#xff0c;可以用不同的语言开发&#xff0c;使用不同的数据存储&#xff0c;最终使得每个服务运行在自己…

IIC重难点-2

一、光环境传感器硬件原理图 二、i.MX6ull I2C控制器介绍 1. Inter IC (I2C)提供标准I2C从机和主机的功能。I2C被设计为兼容标准NXP I2C总线协议。 2. I2C是一种双线双向串行总线&#xff0c;它提供了一种简单有效的数据交换方法&#xff0c;最大限度地减少了…

优化数据库结构

MySQL学习大纲 一个好的数据库设计方案对于数据库的性能尝尝会起到事倍功半的效果&#xff0c;合理的数据库结构不仅使数据库占用更小的磁盘空间&#xff0c;而且使查询速度更快。数据库结构的设计需要考虑数据冗余、查询和更新速度、字段的数据类型是否合理等多方面的内容&…

2. K8S集群架构及主机准备

本次集群部署主机分布K8S集群主机配置主机静态IP设置主机名解析ipvs管理工具安装及模块加载主机系统升级主机间免密登录配置主机基础配置完后最好做个快照备份 2台负载均衡器 Haproxy高可用keepalived3台k8s master节点5台工作节点(至少2及以上)本次集群部署主机分布 K8S集群主…

51单片机07 串口通信

串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。51单片机内部自带UART&#xff08;Universal Asynchronous Recei…

Java进阶——IO 流

文章目录 Java进阶——IO 流 1、File 类的使用 1.1、File 常用构造器1.2、路径分隔符1.3、File 的常用方法 2、IO流原理及流的分类 2.1、IO流原理2.2、流的分类 3、IO流的体系结构4、节点流 4.1、FileReader 读入数据的操作4.2、FileWriter 写出数据的操作4.3、FileReader 和 …

搭建集成开发环境PyCharm

1.下载安装Python&#xff08;建议下载并安装3.9.x&#xff09; https://www.python.org/downloads/windows/ 要注意勾选“Add Python 3.9 to PATH”复选框&#xff0c;表示将Python的路径增加到环境变量中 2.安装集成开发环境Pycharm http://www.jetbrains.com/pycharm/…

国防科大:双目标优化防止LLM灾难性遗忘

&#x1f4d6;标题&#xff1a;How to Complete Domain Tuning while Keeping General Ability in LLM: Adaptive Layer-wise and Element-wise Regularization &#x1f310;来源&#xff1a;arXiv, 2501.13669 &#x1f31f;摘要 &#x1f538;大型语言模型&#xff08;LLM…

NacosRce到docker逃逸实战

NacosRce到docker逃逸实战 1、Nacos Derby Rce打入内存马 这个漏洞的原理大家应该都知道&#xff0c; 2.3.2 < Nacos < 2.4.0版本默认derby接口未授权访问&#xff0c;攻击者可利用未授权访问执行SQL语句加载构造恶意的JAR包导致出现远程代码执行漏洞。 在日常的漏洞挖…

在Vue3 + Vite 项目中使用 Tailwind CSS 4.0

文章目录 首先是我的package.json根据官网步骤VS Code安装插件验证是否引入成功参考资料 首先是我的package.json {"name": "aplumweb","private": true,"version": "0.0.0","type": "module","s…

扣子平台的选择器节点:让智能体开发更简单,扣子免费系列教程(17)

欢迎来到涛涛聊AI。今天&#xff0c;我们来聊聊一个非常实用的工具——扣子平台的选择器节点。即使你不是计算机专业人员&#xff0c;但对计算机操作比较熟悉&#xff0c;这篇文章也能帮你快速上手。我们会从基础知识讲起&#xff0c;一步步带你了解选择器节点的使用方法和应用…

享元模式——C++实现

目录 1. 享元模式简介 2. 代码示例 1. 享元模式简介 享元模式是一种结构型模式。 享元模式用于缓存共享对象&#xff0c;降低内存消耗。共享对象相同的部分&#xff0c;避免创建大量相同的对象&#xff0c;减少内存占用。 享元模式需要将对象分成内部状态和外部状态两个部分…