机器学习(十七):实操_在Sklearn中的实现CART树的基本流程

news2024/10/5 2:24:44

全文共8000余字,预计阅读时间约16~27分钟 | 满满干货(附代码),建议收藏!

在这里插入图片描述

代码下载点这里

一、介绍

CART(Classification and Regression Trees)即分类回归树,是一种重要的机器学习算法,既可以用于分类问题,也可以用于回归问题,因此在实际应用中具有很高的灵活性。然而,要理解并熟练使用CART树,需要掌握一些关键的概念和技巧。

CART树的理论部分文章请看这里:

机器学习(十六):决策树

本文详细讲解如何在Sklearn中依次实现CART回归树和分类树,包括如何导入数据,预处理数据,建立模型,训练模型,进行预测,和评估模型。

二、CART分类树评估器参数详解

CART分类树是二叉树,其每个内部节点不是分为两个子节点,就是没有子节点(也就是叶节点)。这和其他可能有多于两个子节点的决策树算法(如ID3,C4.5等)有所不同。在CART分类树中,每个内部节点都对应一个输入特征和一个切分点,然后根据特征的值是否大于切分点将数据分配到左子节点或右子节点。每个叶节点对应一个预测类别,这个类别是其包含的训练样本中最常见的类别。

构建CART分类树的过程是一个递归的过程。

首先,算法会在所有可能的特征和所有可能的切分点中,选择出使得划分后的子集纯度最高(或者说不纯度降低最大)的特征和切分点。然后,算法会使用这个特征和切分点将数据划分为两个子集,分别对应左子节点和右子节点。接着,算法会分别在这两个子节点上重复这个过程,直到满足某个停止条件,比如树达到最大深度,或者一个节点中的样本数量少于某个阈值等。

DecisionTreeClassifier评估器参数众多,并且大多和决策树的模型结构相关,在Sklearn中还是通过这种方式来查看:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from sklearn.tree import DecisionTreeClassifier

DecisionTreeClassifier?

看下结果:

image-20230717101856398

详细的看一下参数:

1

对于这些参数,可以将其分成三大类来理解。

2.1 模型评估类参数

  • criterion:不纯度衡量指标

在sklearn中,树模型在默认情况下是CART树,CART树默认评估指标是“gini”,但也可以使用信息熵来衡量不纯度。

大多数情况下选择哪个指标并不会实质影响树模型的结构,但相比信息熵,基尼系数复杂度更低、计算速度更快,一般情况下推荐使用基尼系数。如果一定要寻找二者在使用上的不同,一般认为在有些情况下,基尼不纯度更倾向于在数据集中分割出多数类,而信息熵则更倾向于生成出更加平衡的树。

  • ccp_alpha:结构风险权重

ccp是复杂度剪枝(Cost-Complexity Pruning)的简称,在sklearn的0.22版本中才被加入,是唯一一个为实现CART原生原理中的剪枝过程所设置的参数。

该参数并不是一个必选参数。带ccp项的剪枝也被称为最小复杂度剪枝,其原理是在决策树的损失函数上加上一个结构风险项,类似于正则化项在线性方程的损失函数中作用相同。

比如设T为某决策树, R ( T ) R(T) R(T)为决策树在训练集上整体不纯度,即代表模型的经验风险,令 α ∣ T ~ ∣ \alpha|\widetilde{T}| αT 表示模型结构风险,其中 α \alpha α为参数, ∣ T ~ ∣ |\widetilde{T}| T 为树的叶节点数量,则模型损失函数如下:
R α ( T ) = R ( T ) + α ∣ T ~ ∣ (1) R_\alpha(T) = R(T) + \alpha|\widetilde{T}| \tag{1} Rα(T)=R(T)+αT (1)
其中 R α ( T ) R_\alpha(T) Rα(T)就是加入风险结构项后的损失函数,而 α \alpha α则是风险结构项的系数。由此可知, α \alpha α取值越大、对模型的结构风险惩罚力度就越大、模型结构就越简单、过拟合就能够被更好的抑制。

2.2 树结构控制类参数

关于控制树模型结构的相关参数,是最多的一类参数。

  • max_depth、max_leaf_nodes:限制模型整体结构

  • min_samples_split、min_samples_leaf:从节点样本数量角度限制树生长

  • min_impurity_split和min_impurity_decrease:从降低损失值角度限制树生长的参数

通过这些参数的共同作用,从各角度有效限制树的生长。对于树模型来说,叶节点太多、单独叶节点所包含的样本数量太少、内部节点再划分降低的基尼系数较少,都是可能是过拟合的表现,在建模时尤其需要注意。

2.3 迭代随机过程控制类参数

  • splitter

当该参数取值为random时是随机挑选分类规则对当前数据集进行划分

  • max_features

该参数可以任意设置最多带入几个特征进行备选规律挖掘,只要该参数的设置不是带入全部特征进行建模,就相当于是给备选特征随机划个范围,也相当于是给树模型的训练增加了一定的随机性。

这两个参数可以提升模型训练速度,例如:如果只从个别特征中挑选最佳划分规则,或者随机生成一个划分规则、不进行比较就直接使用,能够极大节省计算量,只不过这也是一种用精度换效率的方式,如此操作肯定会带来模型结果精度的下降。

2.4 Sklearn 调用示例

直接上代码:

import numpy as np
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt

def train_and_plot_decision_tree(X, y):
    # 调用决策树评估器并进行训练
    clf = DecisionTreeClassifier().fit(X, y)
    
    # 输出模型在训练集上的评分
    score = clf.score(X, y)
    print(f'The accuracy score of the model on the training set: {score}')

    # 绘制决策树
    plt.figure(figsize=(6, 2), dpi=150)
    plot_tree(clf)
    plt.show()

# 使用方法
X = np.array([[1, 1], [2, 2], [2, 1], [1, 2], [1, 1], [1, 2], [1, 2], [2, 1]])
y = np.array([0, 0, 0, 1, 0, 1, 1, 0])

train_and_plot_decision_tree(X, y)

结果如下:

image-20230717111243076

根据输出的结果可看出,sklearn中分类树的建模过程就是先根据第一个特征的不同取值进行数据集划分,然后在根据第二个特征的不同取值进行数据集划分,最终形成一个三个叶节点、两层的决策树模型。

三、CART回归树建模流程

3.1 CART回归树的基本建模流程

通过一个实验来模拟CART树的建模流程。

Step 1:假设有以下数据集,该数据集只包含一个特征和一个连续型标签:

data = np.array([[1, 1], [2, 3], [3, 3], [4, 6], [5, 6]])
plt.scatter(data[:, 0], data[:, 1])

image-20230717140230991

image-20230717140313573

其数据情况 分布如下,横坐标代表数据集特征,纵坐标代表数据集标签。

Step 2: 生成备选规则

CART回归树和分类树流程基本一样,都是逐特征寻找不同取值的中间点作为切分点。对于上述数据集来说,由于只有一个特征,并且总共有5个不同的取值,因此切分点有4个。

y_range = np.arange(1, 6, 0.1)

def plot_scatter_and_line(ax, data, line_position):
    ax.scatter(data[:, 0], data[:, 1])
    ax.plot(np.full_like(y_range, line_position), y_range, 'r--')

line_positions = [1.5, 2.5, 3.5, 4.5]
fig, axes = plt.subplots(2, 2)

for ax, line_position in zip(axes.flatten(), line_positions):
    plot_scatter_and_line(ax, data, line_position)

image-20230717140603430

Step 3: 挑选最优切分规则

确定了备选划分规则之后,接下来需要根据某种评估标准来寻找最佳划分方式。

回归树的该步骤和分类树差异较大,分类树中是采用基尼系数或者信息熵来衡量划分后数据集标签不纯度下降情况来挑选最佳划分方式,而在回归树中,则是根据划分之后子数据集MSE下降情况来进行最佳划分方式的挑选。在该过程中,子数据集整体的MSE计算方法也和CART分类树类似,都是先计算每个子集单独的MSE,然后再通过加权求和的方法来进行计算两个子集整体的MSE。

MSE的计算不复杂,但是一个前提是:需要计算MSE,就必须给出一个预测值,然后才能根据预测值和真实值计算MSE。

而CART回归树在进行子数据集的划分之后,会针对每个子数据集给出一个预测值(注意是针对一个子数据集中所有数据给出一个预测值,而不是针对每一个数给出一个预测值),而该预测值会依照让对应子数据集MSE最小的目标进行计算得出,每个子数据集的最佳预测值就是这个子数据集真实标签的均值。

例如对上述第一种划分数据集的情况来说,每个子数据集的预测值和MSE计算结果如下:

plt.scatter(data[:, 0], data[:, 1])
plt.plot(np.full_like(y_range, 1.5), y_range, 'r--')

image-20230717141131260

对应划分情况通过如下形式进行表示:

image-20230717141157212

此时计算子数据集B1和B2的MSE,首先是两个数据集的预测值,也就是两个数据集的均值:

# B1数据集的预测值
y_1 = np.mean(data[0, 0])
y_1

# B2数据集的预测值
y_2 = np.mean(data[1: , 1])
y_2

# 模型预测结果
plt.scatter(data[:, 0], data[:, 1])
plt.plot(np.full_like(y_range, 1.5), y_range, 'r--')
plt.plot(np.arange(0, 1.5, 0.1), np.full_like(np.arange(0, 1.5, 0.1), y_1), 'r-')
plt.plot(np.arange(1.7, 5.1, 0.1), np.full_like(np.arange(1.7, 5.1, 0.1), y_2), 'r-')

image-20230717141634104

然后计算这种切分规则下,使用MSE作为评估指标的最终Score:

def calculate_mse_reduction(data, split_position):
    # B1数据集的预测值
    y_1 = np.mean(data[0, 0])

    # B2数据集的预测值
    y_2 = np.mean(data[1: , 1])

    # 计算B1的MSE,如果B1只有一个数据点,则MSE为0
    mse_b1 = 0

    # 计算B2的MSE
    mse_b2 = np.power(data[1: , 1] - y_2, 2).mean()

    # 计算B1和B2的加权MSE
    mse_b = 1/5 * mse_b1 + 4/5 * mse_b2

    # 计算父节点的MSE
    mse_a = np.power(data[:, 1] - data[:, 1].mean(), 2).mean()

    # 计算MSE的减少量
    mse_reduction = mse_a - mse_b

    return mse_reduction


mse_reduction = calculate_mse_reduction(data, 1.5)
print(f"MSE reduction: {mse_reduction}")

得到的结果为:MSE reduction: 1.9599999999999993,也就是说,按照这种方式划分后,降低的MSE为:1.9599999999999993。

按照上述过程,计算其他几种划分方式的评分

impurity_decrease = []

for i in range(4):
    # 寻找切分点
    splitting_point = data[i: i+2 , 0].mean()
    
    # 进行数据集切分
    data_b1 = data[data[:, 0] <= splitting_point]
    data_b2 = data[data[:, 0] > splitting_point]
    
    # 分别计算两个子数据集的MSE
    mse_b1 = np.power(data_b1[: , 1] - data_b1[: , 1].mean(), 2).sum() / data_b1[: , 1].size
    mse_b2 = np.power(data_b2[: , 1] - data_b2[: , 1].mean(), 2).sum() / data_b2[: , 1].size
    
    # 计算两个子数据集整体的MSE
    mse_b = data_b1[: , 1].size/data[: , 1].size * mse_b1 + data_b2[: , 1].size/data[: , 1].size * mse_b2
    #mse_b = mse_b1 + mse_b2
    
    # 计算当前划分情况下MSE下降结果
    impurity_decrease.append(mse_a - mse_b)

impurity_decrease

得到的结果如下:[1.9599999999999993, 2.1599999999999993, 3.226666666666666, 1.209999999999999],也就是说第三种划分情况能够最大程度降低MSE,即此时树模型的第一次生长情况如下:

image-20230717142433662

Step 4 : 进行多轮迭代

接下来,进一步围绕B1和B2进行进一步划分。此时B2的MSE已经为0,因此无需再进行划分,而B1的MSE为0.88,还可以进一步进行划分。

B1的划分过程也和A数据集的划分过程一致,寻找能够令子集MSE下降最多的方式进行切分,得到如下最终图:

image-20230717142559120

Step 5:构建完成

当模型已经构建完成后,回归树的预测过程其实和分类树非常类似,新数据只要根据划分规则分配到所属样本空间,则该空间模型的预测结果就是该数据的预测结果。

至此,就在这个实验中完成了CART回归树的构建。回归树和分类树的构建过程大致相同、迭代过程也基本一致,可以将其视作同一种建模思想的两种不同实现形式。

3.2 criterion参数的不同取值

CART树虽然能同时解决分类问题和回归问题,但是因为两类问题的性质还是存在一定的差异,因此CART树在处理不同类型问题时相应建模流程也略有不同,所以对应的sklearn中的评估器也是不同的。

回归树单独来看是解决回归类问题的模型,但实际上回归树其实是构建梯度提升树(GBDT)的基础分类器,并且无论是解决回归类问题还是分类问题,CART回归树都是唯一的基础分类器,因此CART回归树的相关方法需要重点掌握,从而为后续集成算法的学习奠定基础。

在Sklearn中实现CART回归树的方法是:DecisionTreeRegressor,在Sklearn中还是通过这种方式来查看:

from sklearn.tree import DecisionTreeRegressor

DecisionTreeRegressor?

image-20230717111906011

大多数参数都与DecisionTreeClassifier一致,不同 的是:criterion参数,它是备选划分规则的选取指标,对于CART分类树来说默认基尼系数、可选信息熵,但对于CART回归树来说默认mse,同时可选mae、poisson和friedman_mse,针对于不同的取值情况:

  • 当criterion='mse’时:

在决策树回归中,如果将评价指标 criterion 设为 mse,就是在使用均方误差(Mean Squared Error,MSE)作为节点分裂的评价标准。计算过程就是误差平方和再除以样本总数,数学表达式如下:
M S E = 1 m ∑ i = 1 m ( y i − y ^ i ) 2 (2) MSE = \frac{1}{m}\sum^m_{i=1}(y_i-\hat y _i)^2 \tag{2} MSE=m1i=1m(yiy^i)2(2)
在这种情况下,决策树会尽可能的使得每个子集的MSE最小。对于决策树的每个叶节点,其预测值是该节点所包含的所有训练样本的目标值的平均值。因为这样的预测值能使得预测值到每个实际值的平方误差之和最小,即最小化MSE。

这也是回归决策树默认的评价指标,因为它对于异常值的敏感度较低,而且具有良好的数学性质,使得计算过程较为简单。

  • 当criterion='mae’时:

当在决策树算法中设置评价指标criterionmae时,使用的是平均绝对误差(Mean Absolute Error,MAE)作为评价标准和,与MSE不同,MAE实际上计算的是预测值和真实值的差值的绝对值再除以样本总数,数学表达如下:
M A E = 1 m ∑ i = 1 m ∣ ( y i − y ^ i ) ∣ (3) MAE = \frac{1}{m}\sum^m_{i=1}|(y_i-\hat y _i)| \tag{3} MAE=m1i=1m(yiy^i)(3)
在这种情况下,决策树在进行每次分裂时,会尽可能使得每个子集的MAE最小。使MAE最小的预测值并不是平均值,而是中位数。这是因为,对于任意一组数,选择中位数作为预测值可以使得预测值到每个实际值的绝对误差之和最小。

总的来说,MSE是基于预测值和真实值之间的欧式距离进行的计算,而MAE则是基于二者的街道距离进行的计算,很多时候,MSE也被称为L2损失,而MAE则被称为L1损失。当criterion取值为mae时,为了让每一次划分时子集内的MAE值最小,此时每个子集的模型预测值就不再是均值,而是中位数。

CART回归树的criterion不仅是划分方式挑选时的评估标准,同时也是划分子数据集后选取预测值的决定因素。也就是说,对于回归树来说,criterion的取值其实决定了两个方面,其一是决定了损失值的计算方式、其二是决定了每一个数据集的预测值的计算方式——数据集的预测值要求criterion取值最小,如果criterion=mse,则数据集的预测值要求在当前数据情况下mse取值最小,此时应该以数据集的标签的均值作为预测值;而如果criterion=mse,则数据集的预测值要求在当前数据情况下mae取值最小,此时应该以数据集标签的中位数作为预测值。

  • 当criterion= ‘friedman_mse’时:

friedman_mse是一种基于mse的改进型指标,是由GBDT(梯度提升树,一种集成算法)的提出者friedman所设计的一种残差计算方法,是sklearn中树梯度提树默认的criterion取值,对于单独的树决策树模型一般不推荐使用。

3.2 Sklearn的调用示例

看下代码:

from sklearn.tree import DecisionTreeRegressor

data = np.array([[1, 1], [2, 3], [3, 3], [4, 6], [5, 6]])

clf = DecisionTreeRegressor().fit(data[:, 0].reshape(-1, 1), data[:, 1])

# 同样可以借助tree.plot_tree进行结果的可视化呈现
plt.figure(figsize=(6, 2), dpi=150)
tree.plot_tree(clf)

结果如下:

单独的树决策树模型一般不推荐使用。

3.2 Sklearn的调用示例

看下代码:

from sklearn.tree import DecisionTreeRegressor

data = np.array([[1, 1], [2, 3], [3, 3], [4, 6], [5, 6]])

clf = DecisionTreeRegressor().fit(data[:, 0].reshape(-1, 1), data[:, 1])

# 同样可以借助tree.plot_tree进行结果的可视化呈现
plt.figure(figsize=(6, 2), dpi=150)
tree.plot_tree(clf)

结果如下:

image-20230717143622404

四、总结

本篇文章主要介绍了在Sklearn库中实现CART分类树和回归树的基本流程。详解了CART分类树的各个参数,包括模型评估类参数、树结构控制类参数以及迭代随机过程控制类参数,并给出了在Sklearn中调用CART分类树的实例。其次,阐述了CART回归树的建模流程和criterion参数的不同取值,也同样提供了Sklearn的调用示例。

最后,感谢您阅读这篇文章!如果您觉得有所收获,别忘了点赞、收藏并关注我,这是我持续创作的动力。您有任何问题或建议,都可以在评论区留言,我会尽力回答并接受您的反馈。如果您希望了解某个特定主题,也欢迎告诉我,我会乐于创作与之相关的文章。谢谢您的支持,期待与您共同成长!

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

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

相关文章

3.8 Bootstrap 面包屑导航(Breadcrumbs)

文章目录 Bootstrap 面包屑导航&#xff08;Breadcrumbs&#xff09; Bootstrap 面包屑导航&#xff08;Breadcrumbs&#xff09; 面包屑导航&#xff08;Breadcrumbs&#xff09;是一种基于网站层次信息的显示方式。以博客为例&#xff0c;面包屑导航可以显示发布日期、类别或…

解决win10系统中ping localhost被解析为 ::1的问题

目录 问题描述 问题分析 解决方案 一、修改host文件 二、修改注册表 三、修改IPv6的优先级 问题描述 本机为win10系统&#xff0c;在命令行窗口ping localhost时&#xff0c;本机IP127.0.0.1被解析为了 ::1的问题 1、在命令行窗口 ping 127.0.0.1 2、在命令行窗口 ping…

Linux常用命令——ed命令

在线Linux命令查询工具 ed 单行纯文本编辑器 补充说明 ed命令是单行纯文本编辑器&#xff0c;它有命令模式&#xff08;command mode&#xff09;和输入模式&#xff08;input mode&#xff09;两种工作模式。ed命令支持多个内置命令&#xff0c;常见内置命令如下&#xff…

leetcode 59.螺旋矩阵

记录一下&#xff0c;觉得倒水思想来做 总体看起来还是比较清晰的。 class Solution { public:vector<vector<int>> generateMatrix(int n) {int a[4][2] {{0,1}, {1,0}, {0,-1},{-1,0}};int direction0; //方向int num0;int S n*n;int x 0;int y 0;vector<…

解析基因影响:孟德尔随机化的创新思维

一、引言 在当今的遗传学和生物学研究中&#xff0c;我们对基因对个体特征和性状的影响的理解变得更加深入。然而&#xff0c;基因影响的复杂性和多样性给我们带来了巨大的挑战。为了更好地揭示基因影响的本质和机制&#xff0c;我们需要采用创新的研究思维和方法。 本文的目的…

听GPT 讲K8s源代码--pkg(四)

/pkg/controlplane、/pkg/credentialprovider、/pkg/kubeapiserver是Kubernetes中的三个核心包&#xff0c;它们分别实现了不同的功能。 /pkg/controlplane包 /pkg/controlplane是Kubernetes的一个包&#xff0c;它包含了控制平面组件的实现&#xff0c;例如API Server、Contro…

妙记多 Mojidoc 模版投稿活动招募

妙记多 Mojidoc 开始征集模板啦! 快来投稿吧&#xff01;&#x1f389;&#x1f389;&#x1f389; 优秀模板将被选录进官方模板中心&#xff0c;让你的灵感和创意被更多人看见&#xff01;选录后&#xff0c;你可直接解锁「高级体验官」称号&#xff0c;并有机会获得妙记多 M…

IDELAYG/ODELAY/IDELAYCTRL

如下是7系列FPGA HP Bank I/O 资源&#xff1a; 其中ILOGIC是由许多的数据选择器和一个IDDR触发器构成。 在HP BANK中&#xff0c;ILOGIC被称为ILOGICE2&#xff0c;在HR BANK中&#xff0c;ILOGIC被称为ILOGICE3 IDELAY 简单介绍 输入信号延迟模块。每个I/O模块都包含了一…

内存分区,编译链接,ARCMRC,消息传递消息转发,对象的底层

文章目录 前言内存分区栈区堆区全局区文字常量区程序代码区运行之前运行之后 编译&#xff0c;链接编译的过程链接 ARC&#xff0c;MRC在编译期干了什么 对象的底层消息传递&#xff0c;消息转发消息转发消息传递IMP指针IMP与SEL的区别与联系 前言 对第一周学习内容做个概括 提…

no module named paddle pip install paddlepaddle报错

!python -m pip install paddlepaddle2.4.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

Python实战项目——餐厅订单数据分析(一)

项目背景 餐厅经营的好坏需要用数据来说明&#xff0c;如果一个餐厅生意惨淡&#xff0c;那么应该先收集最近的数据&#xff0c;然后进行数据分析&#xff0c;再对应相应出现的问题进行解决和做出对应的商业调整。今天开始我们分析一来家餐厅的数据。 认识数据并预处理 拿到…

GUI-Menu菜单实例

运行代码&#xff1a; //GUI-Menu菜单实例 #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"struct Lines_window :Window {Lines_window…

Appium+python自动化(十二)- Android UIAutomator终极定位凶器(超详解)

简介 乍眼一看&#xff0c;小伙伴们觉得这部分其实在异性兄弟那里就做过介绍和分享了&#xff0c;其实不然&#xff0c;上次介绍和分享的大哥是uiautomatorviewer&#xff0c;是一款定位工具。今天介绍的是一个java库&#xff0c;提供执行自动化测试的各种API。 Android团队在4…

小程序控制台警告:DevTools failed to load SourceMap(控制台报错DevTools 无法加载来源映射)

在调试项目的时候&#xff0c;控制台报错:**DevTools failed to load SourceMap: Could not load content for http://xxx.js. 这段报错的意思是dev工具未能成功加载source map&#xff08;文件映射&#xff09;。这里的报错实际上和项目本身的代码没有任何关系&#xff0c;而是…

基于 Fedora 38 的预期版本 Nobara 38 发布

导读基于 Fedora 38 的预期版本 Nobara 38 终于发布了&#xff0c;它带来了一系列用户友好的修复和功能增强。Nobara 是 Fedora Linux 的修改版本&#xff0c;旨在解决用户面临的常见问题&#xff0c;并提供开箱即用的顺滑的游戏、流媒体和内容创建体验。凭借一系列附加软件包和…

HTTP 缓存机制 强制缓存/协商缓存

Web 缓存大致可以分为&#xff1a;数据库缓存、服务器端缓存&#xff08;代理服务器缓存、CDN 缓存&#xff09;、浏览器缓存。 浏览器缓存也包含很多内容&#xff1a; HTTP 缓存、indexDB、cookie、localstorage 等等。这里我们只讨论 HTTP 缓存相关内容。 在具体了解 HTTP …

美国电动汽车公司Lucid在中国市场的投资机会

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;Lucid计划进入快速增长的中国电动汽车市场&#xff0c;未来可能会加速交付和收入增长。 &#xff08;2&#xff09;中国人口众多&#xff0c;电动汽车采用率高&#xff0c;政府…

深度学习开发环境

Ubuntu搭建深度学习开发环境(Pytorch Tensorflow GPU版本) 显卡驱动系列 深度学习主要涉及到显卡的使用(如开发时使用GPU版本库&#xff0c;就需要提前安装好显卡驱动方可使用)&#xff0c;所以这里主要说明显卡驱动的安装。 显卡驱动(Driver) | 官网:显卡驱动下载CUDA(NVID…

汤姆猫+AI求IP“翻红”?股东年内忙减持

作为初代手机宠物陪伴游戏&#xff0c;“会说话的汤姆猫”曾在全球积累了大量粉丝&#xff0c;汤姆猫IP也成为一代经典。2017年&#xff0c;A股上市公司金科文化将诞生自海外“汤姆猫”收入麾下。你或许不知道&#xff0c;汤姆猫已成为中国A股市场的一只股票代码。 在金科文化…

曲师大2023大一新生排位赛-B.Sort题解

题目描述 插入排序是一种非常常见且简单的排序算法。王同学是一名大一的新生&#xff0c;今天许师哥刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 &#xff0c;则插入排序可以以 的时间复杂度完成长度为 n&#xfffd; 的数组的排序。不妨假设这 n 个数字分…