机器学习可视化技术(Towards Data Science)

news2025/1/11 14:46:27

介绍

作为任何数据科学项目的一部分,数据可视化在了解更多可用数据和识别任何主要模式方面发挥着重要作用。

如果能够使分析中的机器学习部分尽可能直观,那不是很好吗?

在本文中,我们将探讨一些可以帮助我们应对这一挑战的技术,例如:平行坐标图、汇总数据表、绘制人工神经网络图等等。

技术

超参数优化

超参数优化是机器/深度学习中最常见的活动之一。机器学习模型调优是一种优化问题。我们有一组超参数(例如学习率、隐藏单元的数量等),我们的目标是找出它们值的正确组合,这可以帮助我们找到最小值(例如:损失)或最大值(例如:准确率)。

在我之前的一篇文章中,我详细介绍了我们可以在这个范围内使用什么样的技术以及如何在 3D 空间中测试它们,在这篇文章中,我将向您展示我们如何实现这一点,以便在一个二维空间报告。

此类任务的最佳解决方案之一是使用平行坐标图(图1)。使用这种类型的图,我们实际上可以很容易地比较不同的变量(例如:特征),以发现可能的关系。在超参数优化的情况下,这可以用作一个简单的工具来检查哪些参数组合可以为我们提供最大的测试精度。数据分析中平行坐标图的另一种可能用途是检查数据框中不同特征之间的值关系。

在图1中,提供了一个使用 Plotly 创建的实际示例。

import plotly.express as px  
  
fig = px.parallel_coordinates(df2, color="mean_test_score",  
    labels=dict(zip(list(df2.columns),  
    list(['_'.join(i.split('_')[1:]) for i **in** df2.columns]))),  
    color_continuous_scale=px.colors.diverging.Tealrose,  
    color_continuous_midpoint=27)  
  
fig.show()
image.png
image.png

图1:平行坐标超参数优化图

可以使用不同的技术在 Python 中创建平行坐标图,例如:使用 Pandas、Yellowbrick、Matplotlib 或 Plotly。 使用所有这些不同方法的分步示例可在此链接的我的notebook中找到。

最后,可用于创建此类图的另一种可能的解决方案是使用Weights & Biases Sweeps功能。 Weights & Biases是一个免费工具,可用于为个人或团队自动创建不同机器学习任务(例如:学习曲线、图形模型等)的图表和日志。

Data Wrapper

Data Wrapper 是专为专业图表创建而设计的免费在线工具。 例如,该工具用于《纽约时报》、Vox 和 WIRED 等期刊的文章中。 无需登录,所有过程都可以完全在线完成。

今年还为此工具创建了一个 Python wrapper。 这可以使用以下方法轻松安装:

pip install datawrapper

为了使用 Python API,我们还需要注册 Data Wrapper,进入设置并创建一个 API Key。 使用这个 API Key,我们就可以远程使用 Data Wrapper。

此时,我们可以轻松地创建条形图,例如,使用以下几行代码并将 Pandas 数据框作为 create_chart 函数的输入。

from datawrapper import Datawrapper

dw = Datawrapper(access_token = "TODO")

games_chart = dw.create_chart(title = "Most Frequent Game Publishers"
    chart_type = 'd3-bars', data = df) 

dw.update_description( 
     games_chart['id'], 
     source_name = 'Video Game Sales'
     source_url = 'https://www.kaggle.com/gregorut/videogamesales'
     byline = 'Pier Paolo Ippolito'


dw.publish_chart(games_chart['id']) 

生成的图表如下图所示。

image.png
image.png

图 2:Data Wrapper 条形图

发布图表后,我们可以在 Data Wrapper Account 的已创建图表列表中找到它。 单击我们的图表,我们将找到一个不同选项列表,我们可以使用这些选项轻松共享我们的图表(例如:Embed、HTML、PNG 等)。 此链接提供了所有不同类型的受支持图表的完整列表。

Plotly 预测表

在处理时间序列数据时,有时能够非常方便地快速了解我们的模型在哪些数据点上表现不佳,以便尝试了解它可能面临的限制。

一种可能的方法是创建一个汇总表,其中包含实际值和预测值以及某种形式的指标来总结预测数据点的好坏程度。

使用 Plotly,这可以通过创建绘图函数轻松完成:

import chart_studio.plotly as py
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected=True)


import plotlydef predreport(y_pred, Y_Test):
    diff = y_pred.flatten() - Y_Test.flatten()
    perc = (abs(diff)/y_pred.flatten())*100
    priority = []
    for i in perc:
        if i > 0.4:
            priority.append(3)
        elif i> 0.1:
            priority.append(2)
        else:
            priority.append(1)    print("Error Importance 1 reported in ", priority.count(1),
          "cases\n")
    print("Error Importance 2 reported in", priority.count(2), 
          "cases\n")                                 
    print("Error Importance 3 reported in ", priority.count(3),    
          "cases\n")
    colors = ['rgb(102, 153, 255)','rgb(0, 255, 0)'
              'rgb(255, 153, 51)''rgb(255, 51, 0)']    fig = go.Figure(data=[go.Table(header=
                    dict(
                        values=['Actual Values''Predictions'
                        '% Difference'"Error Importance"],
                        line_color=[np.array(colors)[0]],
                        fill_color=[np.array(colors)[0]],
                                    align='left'),
                    cells=dict(
                       values=[y_pred.flatten(),Y_Test.flatten(),
                               perc, priority], 
                       line_color=[np.array(colors)[priority]],
                       fill_color=[np.array(colors)[priority]],  
                                    align='left'))])    init_notebook_mode(connected=False)
    py.plot(fig, filename = 'Predictions_Table', auto_open=True)
    fig.show()

调用此函数将产生以下输出:

Error Importance 1 reported in 34 cases  
Error Importance 2 reported in 13 cases  
Error Importance 3 reported in 53 cases
image.png
image.png

图 3:预测表

决策树

决策树是最容易解释的机器学习模型类型之一。 由于它们的基本结构,很容易通过查看树的不同分支上的条件来检查算法是如何决定做出决定的。 此外,决策树也可以用作特征选择技术,考虑到该算法将认为对我们所需的分类/回归任务最有价值的特征放在树的顶层。 这样,由于携带的信息较少,树底部的特征可以被丢弃。

可视化分类/回归决策树的最简单方法之一是使用 sklearn.tree 中的 export_graphviz。 在本文中,使用 dtreeviz 库提供了一种不同且更完整的方法。

使用该库,只需使用以下几行代码即可创建分类决策树:

from dtreeviz.trees import *

viz = dtreeviz(clf,
               X_train,
               y_train.values,
               target_name='Genre',
               feature_names=list(X.columns),
               class_names=list(labels.unique()),
               histtype='bar'
               orientation ='TD')
              
viz
image.png
image.png

图 4:分类决策树

在图 4 中,不同的类别用不同的颜色表示。 所有不同类的特征分布都在树的起始节点中表示。 只要我们向下移动每个分支,算法就会尝试使用每个节点图下方描述的特征来最好地分离不同的分布。 分布旁边生成的圆圈表示跟随某个节点后正确分类的元素数量,元素数量越多,圆圈的大小越大。

图 5 显示了一个使用决策树回归器的示例。

image.png
image.png

图 5:决策树回归器

决策边界

决策边界是以图形方式了解机器学习模型如何进行预测的最简单方法之一。 在 Python 中绘制决策边界的最简单方法之一是使用 Mlxtend。 该库实际上可用于绘制机器学习和深度学习模型的决策边界。 图 6 显示了一个简单的示例。

from mlxtend.plotting import plot_decision_regions 
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import itertoolsgs = gridspec.GridSpec(22)

fig = plt.figure(figsize=(10,8))

clf1 = LogisticRegression(random_state=1,
                          solver='newton-cg',
                          multi_class='multinomial')
clf2 = RandomForestClassifier(random_state=1, n_estimators=100)
clf3 = GaussianNB()
clf4 = SVC(gamma='auto')

labels = ['Logistic Regression','Random Forest','Naive Bayes','SVM']
for clf, lab, grd in zip([clf1, clf2, clf3, clf4],
                         labels,
                         itertools.product([01], repeat=2)):

    clf.fit(X_Train, Y_Train)
    ax = plt.subplot(gs[grd[0], grd[1]])
    fig = plot_decision_regions(X_Train, Y_Train, clf=clf, legend=2)
    plt.title(lab)

plt.show()
image.png
image.png

图 6:绘制决策边界

Mlxtend 的一些可能替代方案是:Yellowbrick、Plotly 或普通的 Sklearn 和 Numpy 实现。 使用所有这些不同方法的分步示例可在此链接的我的笔记本中找到。

此外,我的网站上的此链接上提供了在训练期间收敛的不同动画版本的决策边界。

绘制决策边界的主要限制之一是它们只能在两个或三个维度上轻松可视化。 由于这些限制,因此大多数时候可能需要在绘制决策边界之前减少输入特征的维数(使用某种形式的特征提取技术)。

人工神经网络

另一种在创建新的神经网络架构时非常有用的技术是可视化它们的结构。 这可以使用 ANN Visualiser 轻松完成(图 7)。

from keras.models import Sequential
from keras.layers import Dense
from ann_visualizer.visualize import ann_viz

model = Sequential()
model.add(Dense(units=4,activation='relu',
                  input_dim=7))
model.add(Dense(units=4,activation='sigmoid'))
model.add(Dense(units=2,activation='relu'))

ann_viz(model, view=True, filename="example", title="Example ANN")
image.png
image.png

图 7:ANN 图

实时损失图(Livelossplot)

在训练和验证过程中自动绘制实时神经网络损失和准确性可以有很大帮助,以便立即查看网络是否随着时间的推移取得任何进展。 这可以通过使用 Livelossplot 轻松完成。

在图 8 中,提供了在训练变分自编码器 (VAE) 时在 Pytorch 中实时创建的损失图示例。

image.png
image.png

使用 Livelossplot,这可以通过将我们想要记录的所有指标存储在字典中并在每次迭代结束时更新绘图来轻松完成。 如果我们对创建多个图感兴趣(例如,一个用于损失,一个用于整体准确率),则可以应用相同的过程。

from livelossplot import PlotLosses
liveloss = PlotLosses()
for epoch in range(epochs):
    logs = {}
    for phase in ['train''val']:
        losses = []
        
        if phase == 'train':
            model.train()
        else:
            model.eval()
        
        for i, (inp, _) in enumerate(dataloaders[phase]):
            out, z_mu, z_var = model(inp)
            rec=F.binary_cross_entropy(out,inp,reduction='sum')/
                                       inp.shape[0]
            kl=-0.5*torch.mean(1+z_var-z_mu.pow(2)-torch.exp(z_mu))
            loss = rec + kl
            losses.append(loss.item())
        
            if phase == 'train':
                optimizer.zero_grad()
                loss.backward()
                optimizer.step()
        
        prefix = ''
        if phase == 'val':
            prefix = 'val_'
        logs[prefix + 'loss'] = np.mean(losses)
    liveloss.update(logs)
    liveloss.send()

Livelossplot 还可以与其他库一起使用,例如:Keras、Pytorch-Lightning、Bokeh 等……

变分自编码器

变分自编码器 (VAE) 是一种概率生成模型,用于创建一些输入数据(例如:图像)的潜在表示,能够简洁地理解原始数据并从中生成全新的数据(例如:训练 VAE 模型具有不同的汽车设计图像,然后可以建模以创建全新的富有想象力的汽车设计)。

继续使用 Livelossplot 训练的变分自编码器示例,我们甚至可以通过检查潜在空间(图 9)如何从一次迭代到另一次迭代来使我们的模型更有趣(以及因此我们的模型在区分不同类别方面随着时间的推移改进了多少)。

这可以通过在前面的训练循环中添加以下函数来轻松完成:

def latent_space(model, train_set, it=''):
    x_latent = model.enc(train_set.data.float())
    plt.figure(figsize=(107))
    plt.scatter(x_latent[0][:,0].detach().numpy(), 
                x_latent[1][:,1].detach().numpy(), 
                c=train_set.targets)
    plt.colorbar()
    plt.title("VAE Latent Space", fontsize=20)
    plt.xlabel("X", fontsize=18)
    plt.ylabel("Y", fontsize=18)
    plt.savefig('VAE_space'+str(it)+'.png', format='png', dpi=200)
    plt.show()
image.png
image.png

图 9:VAE 潜在空间演化

最后,可以应用类似的程序来实时可视化我们的 VAE 如何在生成逼真的图像时从迭代到迭代进行改进(图 10)。

def manifold(model, it='', n=18, size=28): 
    result = torch.zeros((size * n, size * n))    # Defyining grid space
    s, s2 = torch.linspace(-77, n), torch.linspace(7-7, n)
    grid_x, grid_y = torch.std(s)*s, torch.std(s2)*s2    for i, y_ex in enumerate(grid_x):
        for j, x_ex in enumerate(grid_y):
            z_sample = torch.repeat_interleave(torch.tensor([
                       [x_ex, y_ex]]),repeats=batch_size, dim=0)
            x_dec = model.dec(z_sample)
            element = x_dec[0].reshape(size, size).detach()
            result[i * size: (i + 1) * size, 
                   j * size: (j + 1) * size] = element    plt.figure(figsize=(1212))
    plt.title("VAE Samples", fontsize=20)
    plt.xlabel("X", fontsize=18)
    plt.ylabel("Y", fontsize=18)
    plt.imshow(result, cmap='Greys')
    plt.savefig('VAE'+str(it)+'.png', format='png', dpi=300)
    plt.show()
image.png
image.png

图 10:随着时间的推移 VAE 改进以创建新数字

我个人网站上的此链接提供了使用 ONNX 在线部署以进行动态推理的变分自编码器的实际演示。

词嵌入

神经网络嵌入是一类神经网络,旨在学习如何将某种形式的分类数据转换为数值数据。考虑到在转换数据时,他们能够了解其特征并因此构建更简洁的表示(创建潜在空间),因此使用嵌入比使用其他技术(例如 One Hot Encoding)具有相当大的优势。两种最著名的预训练词嵌入类型是 word2vec 和 Glove。

作为一个简单的例子,我们现在将绘制一个代表不同书籍作者的嵌入空间。首先,我们需要在一些可用数据上创建一个训练模型,然后访问模型嵌入层(在本例中称为嵌入)的训练权重并将它们存储在数据框(data frame)中。完成此过程后,我们只需绘制三个不同的坐标(图 11)。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d, Axes3D

embedding_weights=pd.DataFrame(model.embed.weight.detach().numpy())
embedding_weights.columns = ['X1','X2','X3']

fig = plt.figure(num=None, figsize=(1412), dpi=80
                 facecolor='w', edgecolor='k')
ax = plt.axes(projection='3d')

for index, (x, y, z) in enumerate(zip(embedding_weights['X1'], 
                                      embedding_weights['X2'], 
                                      embedding_weights['X3'])):
    ax.scatter(x, y, z, color='b', s=12)
    ax.text(x, y, z, str(df.authors[index]), size=12
            zorder=2.5, color='k')ax.set_title("Word Embedding", fontsize=20)

ax.set_xlabel("X1", fontsize=20)
ax.set_ylabel("X2", fontsize=20)
ax.set_zlabel("X3", fontsize=20)
plt.show()
image.png
image.png

图 11:词嵌入

在此示例中,网络的嵌入维度已直接设置为 3,以便轻松创建 3D 可视化。 另一种可能的解决方案可能是使用更高的嵌入输出大小,然后应用某种形式的特征提取技术(例如:t-SNE、PCA 等)以可视化结果。

另一种可用于可视化分类数据的有趣技术是 Wordclouds(图 12)。 例如,这种类型的表示可以通过在数据集中创建书籍作者姓名及其各自频率计数的字典来实现。 在数据集中出现得更频繁的作者将在图中以更大的字体大小表示。

from wordcloud import WordCloudd = {}
for x, a in zip(df.authors.value_counts(),
                df.authors.value_counts().index):
    d[a] = xwordcloud = WordCloud()
wordcloud.generate_from_frequencies(frequencies=d)
plt.figure(num=None, figsize=(1210), dpi=80, facecolor='w',
           edgecolor='k')
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.title("Word Cloud", fontsize=20)
plt.show()
image.png
image.png

图 12:Wordcloud 示例

与往常一样,完整的代码可以在我的 Github 帐户上找到。

可解释 AI

如今,可解释人工智能是一个不断发展的研究领域。在决策应用(如:就业)中使用人工智能最近引起了个人和当局的一些担忧。这是因为,在使用深度神经网络时,目前(至少在完全程度上)理解算法在必须执行预定任务时执行的决策过程是不可能的。由于决策过程缺乏透明度,公众可能会对模型本身的可信度产生困惑。因此,为了防止人工智能模型中存在任何形式的偏见,对可解释人工智能的需求现在正成为热点。

在过去的几年里,为了使机器学习更易于解释,已经引入了不同的可视化技术,例如:

  • 探索卷积神经网络过滤器(Filters)和特征图(Feature maps)。
  • 图网络。
  • 基于贝叶斯的模型。
  • 因果推理应用于机器学习。
  • 局部/全局代理模型。
  • 引入局部可解释模型无关解释 (LIME) 和 Shapley 值。

如果您有兴趣了解有关如何使机器学习模型更易于解释的更多信息,那么 Python 中当前可用于在深度学习中应用可解释 AI 的两个最有趣的库是 Pytorch 的 Captum 和 XAI。

由于这个研究领域在不断改进,我的目标是在未来的一篇专门讨论可解释人工智能的文章中涵盖所有这些不同的主题(以及更多主题)。

结论

如果您有兴趣了解更多机器学习可视化技术,Python Yellowbrick 库高度关注该主题。提供的可视化工具的一些示例包括:特征排名、ROC/AUC 曲线、K-Elbow 图和各种文本可视化技术。

最后,在过去几年中,已经开始开发了不同的框架以使机器学习可视化更容易,例如:TensorBoard, Weights & Biases 和 Neptune.ai。

原文链接:Machine Learning Visualization

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

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

相关文章

HCIA 链路聚合与LACP

一、前言 虽然很多文章在介绍链路聚合时会从链路备份的角度来介绍链路聚合的作用,然后再说其有提升链路带宽的作用,但我感觉链路聚合主要还是提升链路带宽的作用,链路备份只是顺带的不是主要目标。 二、链路聚合 考虑下面的网络&#xff0…

Windows 环境下的 Socket 编程 3 - 基于 TCP 的服务器/客户端

基于 TCP 的服务器端/客户端 绝大多数 TCP 服务器端都按照如下顺序调用: 在 Windows 环境下,代码表示为: WSADATA wsaData;SOCKET hServSock, hClntSock;SOCKADDR_IN servAddr, clntAddr;int szClntAddr;/*Windows 环境 Socket 编程必须*/i…

leetcode:6243. 到达首都的最少油耗【变种子树大小统计 + 从边的角度出发 + 思维转换】

目录题目截图题目分析ac code总结题目截图 题目分析 0作为root从边的角度出发每个点都向0的方向聚集比如大家已经由四面八方聚集到了x,x的fa固定的,假设为y那么x到y要多少辆车?设size(x)为x子树大小x到y需要ceil&…

2022年第十三届蓝桥杯大赛湖南中医药大学第2场选拔赛(部分总结)

文章目录2008: 简单整数问题2005: 飞行棋2074: 几乎回文串2101: 通行密令2089: 密码1867: X星救援站2085: 千里走单骑2093: 最长等比子序列2087: 跳水比赛总结2008: 简单整数问题 [命题人 : admin] 时间限制 : 1.000 sec 内存限制 : 128 MB 题目描述 小明最近经常会思考一些关…

Oracle-AWR快照无法自动生成问题分析

前言: 近期处理了一起数据库AWR快照无法自动生成的问题,用户发现数据库在近期出现了AWR快照无法自动生成的问题,数据库整体负载正常,后面分析发现原因是由于AWR快照在生成过程中,执行的SQL语句出现超时导致。 问题: Oracle11.2.…

【课上笔记】第八章 图

图 8.1图的基本概念 8.1.1图的定义和术语 1.图的定义 ​ 图(Graph)由一个顶点集合Vn和一个边(或者弧)集合En组成,通常记为: G=(Vn,En)其中,Vn中有n(n>0)个顶点,En中有e&#…

stm32cubemx hal学习记录:FreeRTOS任务管理

一、基本配置 1、配置RCC、USART1、时钟84MHz 2、配置SYS,将Timebase Source修改为除滴答定时器外的其他定时器,因为滴答定时器被用于时钟基准,可以实现任务切换。Timebase Source是实现HAL_Delay等延时函数的 3、初始化LED的两个引脚 4、开…

HTTP VS HTTPS

一、网络协议 网络协议是计算机之间为了实现网络通信而达成的一种“约定”或者”规则“,有了这种”约定“,不同厂商的生产设备,以及不同操作系统组成的计算机之间,就可以实现通信。 二、HTTP与HTTPS 1、HTTP (1&am…

Autoware中的点云3D聚类算法,保姆级算法阅读注释,一看就懂,非常详细!

综述 五大模块&#xff0c;看完等于点云入门~&#xff08;dog&#xff09; 实际步骤 输入激光雷达获得的点云 pcl::PointCloud<pcl::PointXYZ>::Ptr header:seq:序列长度stamp:获取点云的时刻frame_id:坐标系名称 points:保存点云的容器,类型为std::vector width:类型…

大小端的判断

1.关于进制 1.1 进制数与位数 n进制数中&#xff0c;一位最多表示到数字n-1 十进制中1位最多能表示9个数字 满则溢&#xff0c;溢则进位。 拿我们最常用的是10 进制来举例说明&#xff0c; 构成十进制的最小单位数: 1 2 3 4 5 6 7 8 9 0 十进制(其实只有从9到0这几个数字,1…

OSPF笔记(四):OSPF五种报文和五种常见LSA

一、OSPF五种报文 (使用IP承载&#xff0c;可靠&#xff09; 1.1 hello&#xff1a; 发现和维护邻居关系 &#xff0c;以太网10s一次 1.2 DBD&#xff1a; 发送链路状态数据库摘要 1.3 LSR&#xff1a; 请求发送特定的链路状态信息&#xff08;请求包&#xff09; 1.4 LSU&…

Pr2023(Premiere Pro)中文版软件下载「附带安装教程」

Premiere Pro 23.0 版专为帮助编辑人员制作创意内容而设计&#xff0c;提供了出色的字幕工具组合。借助改进功能&#xff08;如批量编辑时间轴中的标题剪辑、灵活的对齐控件等&#xff09;简化您的标题和图形工作流程。此版本包含稳定性和性能方面的基础改进&#xff0c;包括更…

用 Flutter 轻松做个红包封面

前言 在 Flutter 的开发中&#xff0c;最常见的就是层层的组件嵌套&#xff0c;因此不可避免会遇到子组件如何适配父组件的问题。比如&#xff0c;按钮的可点击区域是否要占满整个父组件&#xff1f;图片是居中还是居左&#xff1f;这些问题可以通过 Flutter 提供的FittedBox …

Rancher - 更换Linux发行版

Rancher - 更换Linux发行版 时间&#xff1a;2022年11月20日21:24:29 推荐&#xff1a;Linux CentOS7.9 一、为什么要更换/升级&#xff1f; CentOS7.9 停止维护时间 2024年06月30日 AnolisOS8 阿里云推出的Linux发行版&#xff0c;支持多计算架构&#xff0c;也面向云端场景…

公众号免费搜题系统搭建

公众号免费搜题系统搭建 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;…

算法篇-------贪心2

文章目录题目1-------活动选择题目2-----无重叠区间题目3------最多可以参加的会议数目题目4-------去除重复字母题目5------移掉K位数字题目6-----拼接最大数题目1-------活动选择 有n个需要在同一天使用同一个教室的活动a1, a2, …, an&#xff0c;教室同一时刻只能由一个活…

MapReduce基础

MapReduce入门 理解MapReduce的思想 MapReduce的思想核心是先分再合&#xff0c;分而治之所谓的分而治之&#xff0c;就是把一个复杂的问题&#xff0c;按照一定的分解方法分为等价的规模的若干部分&#xff0c;然后捉个解决&#xff0c;分别找出各个部分的结果没然后将各个部…

【学习笔记】mac安装maven与idea自带maven

一、安装Maven 1.1 场景一&#xff1a;mac安装Maven step1: 下载maven 到 maven官网下载压缩包&#xff0c;这里下载 apache-maven-3.8.6-bin.zip 压缩包&#xff1a; step2: 解压安装 解压maven压缩包&#xff0c;将解压得到的maven文件夹 “apache-maven-3.8.6” 放到合适…

Ubuntu22.04系统安装Unreal Engine 5.1.0

1.实现目标 在Ubuntu22.04系统上从源码构建安装Unreal Engine 5.1.0。 2.实现过程 2.1 正常流程 (1)从github上下载最新的release版本的源代码:5.1.0 release。 (2)解压缩代码,并打开终端,执行 ./Setup.sh,下载所需的各项依赖,文件大小约20GB,需下载2-3小时。 (…

【每日一题Day33】LC799香槟塔 | 动态规划

香槟塔【LC799】 我们把玻璃杯摆成金字塔的形状&#xff0c;其中 第一层 有 1 个玻璃杯&#xff0c; 第二层 有 2 个&#xff0c;依次类推到第 100 层&#xff0c;每个玻璃杯 (250ml) 将盛有香槟。 从顶层的第一个玻璃杯开始倾倒一些香槟&#xff0c;当顶层的杯子满了&#xff…