当前位置: 首页 > news >正文

【机器学习 | 决策树】利用数据的潜力:用决策树解锁洞察力

在这里插入图片描述

🤵‍♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍
🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)

在这里插入图片描述

该文章收录专栏
[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨]

决策树

1.1 分类

决策树是一种基于树形结构的分类模型,它通过对数据属性的逐步划分,将数据集分成多个小的决策单元。每个小的决策单元都对应着一个叶节点,在该节点上进行分类决策。决策树的核心是如何选择最优的分割属性。常见的决策树算法有ID3、C4.5和CART。

决策树的输入数据主要包括训练集和测试集。训练集是已知类别的样本集,测试集则是需要分类的未知样本集。

具体来说,构建决策树的过程可以分为如下几个步骤:

  1. 选择最优特征。在构建决策树时,需要从当前样本集合中选择一个最优的特征作为当前节点的划分属性。通常使用信息增益、信息增益比或基尼指数等指标来评估各个特征的划分能力,并选取最优特征。
  2. 划分子集。根据选取的最优特征,将当前样本集合划分成若干个子集。每个子集对应于一个子节点,且该节点所代表的样本集合与其父节点的样本集合不重复。
  3. 递归构建决策树。对于每个子节点,重复前两个步骤,直到所有的样本都被分配到叶子节点上,并且每个叶子节点对应着一个类别。
  4. 剪枝操作。由于决策树容易出现过拟合,因此需要进行剪枝操作。常用的剪枝方法包括预剪枝和后剪枝。

在进行分类时,对输入测试样本,按照各个属性的划分方式逐步匹配,最终到达某个叶子节点,并将该测试样本归为叶子节点所代表的类别。决策树的输出结果就是针对测试样本的分类结果,即该测试样本所属的类别。

决策树的优点在于易于理解和解释,能够处理不同类型的数据,且不需要对数据进行预处理。但是,决策树容易出现过拟合问题,因此在构建决策树时需要进行剪枝操作。常用的剪枝方法包括预剪枝和后剪枝。

1.1.1 案例

假设我们要构建一个决策树来预测一个人是否会购买某个产品。我们将使用以下特征来进行预测:

  1. 年龄:年龄范围在18岁到65岁之间。
  2. 性别:男性或女性。
  3. 收入:收入范围在0到100,000之间。

我们有一个包含以下数据的训练集:

编号年龄性别收入购买
125男性30,000
235女性40,000
345女性80,000
420男性10,000
555男性60,000
660女性90,000
730男性50,000
840女性75,000

现在,我们将使用这些数据来构建一个决策树模型。

首先,我们选择一个特征来作为根节点。我们可以使用信息增益或基尼不纯度等指标来选择最佳特征。在这个例子中,我们选择使用信息增益。

基尼指数和信息增益都是用于决策树中特征选择的指标,它们各有优劣。

基尼指数是一种衡量数据集纯度或不确定性的指标,常用于决策树算法中的特征选择。它基于基尼系数的概念,用于度量从数据集中随机选择两个样本,其类别标签不一致的概率

基尼指数的计算公式如下:
G i n i ( D ) = 1 − Σ ( p i ) 2 Gini(D) = 1 - Σ (p_i)^2 Gini(D)=1Σ(pi)2

其中,Gini(D)表示数据集D的基尼指数,p_i表示数据集D中第i个类别的样本所占比例。

基尼指数的取值范围为0到1,数值越小表示数据集的纯度越高,即样本的类别越一致。当数据集D中只包含一种类别的样本时,基尼指数为0,表示数据集完全纯净。当数据集D中的样本类别均匀分布时,基尼指数最大(即值越小),为1,表示数据集的不确定性最高。

在决策树算法中,基尼指数被用于衡量选择某个特征进行划分后,数据集的纯度提升程度。通过计算每个特征的基尼指数,选择基尼指数最小的特征作为划分依据,以达到最大程度地减少数据集的不确定性。

计算每个特征的信息增益:

  • 年龄的信息增益:0.029
  • 性别的信息增益:0.152
  • 收入的信息增益:0.048

根据信息增益,我们选择性别作为根节点。

信息增益是一种用于选择决策树节点的指标,它衡量了在选择某个特征作为节点后,数据集的纯度提高了多少。信息增益的计算基于信息熵的概念。

信息熵是用来衡量数据集的混乱程度或不确定性的度量。对于一个二分类问题(如购买与否),信息熵的计算公式如下 (多分类也一样,每个不题类别求和):

E n t r o p y ( S ) = − p ( Y e s ) ∗ l o g 2 ( p ( Y e s ) ) − p ( N o ) ∗ l o g 2 ( p ( N o ) ) Entropy(S) = -p(Yes) * log2(p(Yes)) - p(No) * log2(p(No)) Entropy(S)=p(Yes)log2(p(Yes))p(No)log2(p(No))

其中,S是数据集,p(Yes)和p(No)分别是购买为"是"和"否"的样本在数据集中的比例。(信息熵代表了分布越平均,样本信息含量越高,不确定性越大,信息熵越大,分布越不均匀,占比越大,信息熵会趋于0。所以以信息熵大小来确定分类,就是为了把一些小范围的集合分离出去)

信息增益的计算公式如下(不同类别信息熵相加):

G a i n ( S , A ) = E n t r o p y ( S ) − ∑ ( ∣ S v ∣ / ∣ S ∣ ) ∗ E n t r o p y ( S v ) Gain(S, A) = Entropy(S) - ∑(|Sv| / |S|) * Entropy(Sv) Gain(S,A)=Entropy(S)(Sv∣/∣S)Entropy(Sv)

其中,S是数据集,A是要计算信息增益的特征,Sv是特征A的某个取值对应的子集,|Sv|是子集Sv的样本数量,|S|是数据集S的样本数量。 (通过这个子集数量控制其影响权重,然后确定信息增益最大的(即信息熵最小),白话就是选择一个分类中更主流的,特征更明显的)

信息增益越大,意味着使用特征A作为节点可以更好地分割数据集,提高纯度。

在我们的例子中,我们计算了每个特征的信息增益,并选择了具有最大信息增益的特征作为根节点。然后,我们根据根节点的取值将数据集分割成子集,并对每个子集计算信息增益,以选择下一个节点。这个过程一直持续到满足停止条件为止,例如子集中的样本都属于同一类别或达到了预定的树的深度。

总结以下是基尼指数和信息增益的优缺点

优点:

  • 基尼指数:基尼指数是一种衡量不纯度的指标,它在计算上比信息增益更简单和高效。在处理大规模数据集时,基尼指数的计算速度通常比信息增益快。(单纯计算特征分类占比,占比平方
  • 信息增益:信息增益是一种衡量特征对于分类任务的贡献程度的指标。它基于信息论的概念,可以更好地处理多分类问题。信息增益在处理不平衡数据集时表现较好,能够更好地处理类别不均衡的情况。(除了计算特征分类占比,还添加了一个log函数,log比例乘上占比,使其贡献度分类占比大小情况得到增益

缺点:

  • 基尼指数:基尼指数只考虑了特征的不纯度,而没有考虑特征的取值个数。这意味着基尼指数可能会偏向具有更多取值的特征。在处理具有大量取值的特征时,基尼指数可能会导致决策树偏向这些特征。(基尼指数只要是要这个阈值,节点,能分出去的样本比例最大有多大,最大越大,越倾向于)
  • 信息增益:信息增益对于具有较多取值的特征有一定的偏好,因为它倾向于选择具有更多分支的特征。这可能导致决策树过于复杂,容易过拟合训练数据(树的深度不要太深)。(信息增益根据一种信息学的信息熵,根据其性质,分类越平均越大,分类占比大越小的一个性质,来分节点。

综上所述,基尼指数和信息增益在不同的情况下有不同的优劣。在实际应用中,可以根据具体的问题和数据集的特点选择适合的指标。

接下来,我们根据性别的取值(男性或女性)将数据集分割成两个子集。

对于男性子集:

编号年龄收入购买
12530,000
42010,000
55560,000
73050,000

对于女性子集:

编号年龄收入购买
23540,000
34580,000
66090,000
84075,000

对于男性子集,我们可以看到购买的结果是"是"和"否"都有,所以我们需要进一步划分。我们选择年龄作为下一个节点。

对于年龄的取值(小于等于30岁和大于30岁):

对于小于等于30岁的子集:

编号收入购买
130,000
410,000
750,000

对于大于30岁的子集:

编号收入购买
560,000

对于小于等于30岁的子集,购买的结果都是"否",所以我们不需要再进行划分。

对于大于30岁的子集,购买的结果都是"是",所以我们不需要再进行划分。

对于女性子集,购买的结果都是"是",所以我们不需要再进行划分。

最终的决策树如下所示:

性别 = 男性:年龄 <= 30岁: 否年龄 > 30岁: 是
性别 = 女性: 是

这就是一个简单的决策树的例子。根据输入的特征,决策树可以根据特征的取值进行预测。请注意,这只是一个简单的示例,实际上,决策树可以有更多的特征和更复杂的结构。

首先,我们使用scikit-learn库来实现决策树:

from sklearn import tree
import numpy as np# 数据集
X = np.array([[25, 1, 30000],[35, 0, 40000],[45, 0, 80000],[20, 1, 10000],[55, 1, 60000],[60, 0, 90000],[30, 1, 50000],[40, 0, 75000]])Y = np.array([0, 0, 1, 0, 1, 1, 0, 1])# 创建决策树模型
clf = tree.DecisionTreeClassifier()# 训练模型
clf = clf.fit(X, Y)# 预测
print(clf.predict([[40, 0, 75000],[10, 0, 75000]]))  # 输出:[1, 0]

然后,我们不使用任何机器学习库来实现决策树:

import numpy as npclass Node:def __init__(self, predicted_class):self.predicted_class = predicted_class  # 预测的类别self.feature_index = 0  # 特征索引self.threshold = 0  # 阈值self.left = None  # 左子树self.right = None  # 右子树class DecisionTree:def __init__(self, max_depth=None):self.max_depth = max_depth  # 决策树的最大深度def fit(self, X, y):self.n_classes_ = len(set(y))  # 类别的数量self.n_features_ = X.shape[1]  # 特征的数量self.tree_ = self._grow_tree(X, y)  # 构建决策树def predict(self, X):return [self._predict(inputs) for inputs in X]  # 对输入数据进行预测def _best_gini_split(self, X, y):m = y.size  # 样本的数量if m <= 1:  # 如果样本数量小于等于1,无法进行分割return None, Nonenum_parent = [np.sum(y == c) for c in range(self.n_classes_)]  # 每个类别在父节点中的样本数量best_gini = 1.0 - sum((n / m) ** 2 for n in num_parent)  # 父节点的基尼指数best_idx, best_thr = None, None  # 最佳分割特征索引和阈值for idx in range(self.n_features_):  # 遍历每个特征thresholds, classes = zip(*sorted(zip(X[:, idx], y)))  # 根据特征值对样本进行排序num_left = [0] * self.n_classes_  # 左子节点中每个类别的样本数量num_right = num_parent.copy()  # 右子节点中每个类别的样本数量,初始值为父节点的样本数量for i in range(1, m):  # 遍历每个样本c = classes[i - 1]  # 样本的类别num_left[c] += 1  # 更新左子节点中对应类别的样本数量num_right[c] -= 1  # 更新右子节点中对应类别的样本数量gini_left = 1.0 - sum((num_left[x] / i) ** 2 for x in range(self.n_classes_))  # 左子节点的基尼指数gini_right = 1.0 - sum((num_right[x] / (m - i)) ** 2 for x in range(self.n_classes_))  # 右子节点的基尼指数gini = (i * gini_left + (m - i) * gini_right) / m  # 加权平均的基尼指数if thresholds[i] == thresholds[i - 1]:  # 如果特征值相同,则跳过(特征阈值)continueif gini < best_gini:  # 如果基尼指数更小,则更新最佳分割特征索引和阈值 (循环每个特征,和每个阈值,以求解最优分类best_gini = ginibest_idx = idxbest_thr = (thresholds[i] + thresholds[i - 1]) / 2return best_idx, best_thr  # 返回最佳分割特征索引和阈值def _best_gain_split(self, X, y):m = y.size  # 样本的数量if m <= 1:  # 如果样本数量小于等于1,无法进行分割return None, Nonenum_parent = [np.sum(y == c) for c in range(self.n_classes_)]  # 计算每个类别的样本数量best_gain = -1  # 初始化最佳信息增益best_idx, best_thr = None, None  # 初始化最佳特征索引和阈值for idx in range(self.n_features_):  # 遍历每个特征thresholds, classes = zip(*sorted(zip(X[:, idx], y)))  # 对每个特征值和类别标签进行排序num_left = [0] * self.n_classes_  # 初始化左子树的类别数量 (左边都是0,为0时自动计算为0) num_right = num_parent.copy()  # 右子树的类别数量初始化为父节点的类别数量 (右边是全部)for i in range(1, m):  # 遍历每个样本c = classes[i - 1]  # 获取当前样本的类别num_left[c] += 1  # 左子树的类别数量增加num_right[c] -= 1  # 右子树的类别数量减少entropy_parent = -sum((num / m) * np.log2(num / m) for num in num_parent if num != 0)  # 计算父节点的熵entropy_left = -sum((num / i) * np.log2(num / i) for num in num_left if num != 0)  # 计算左子树的熵entropy_right = -sum((num / (m - i)) * np.log2(num / (m - i)) for num in num_right if num != 0)  # 计算右子树的熵gain = entropy_parent - (i * entropy_left + (m - i) * entropy_right) / m  # 计算信息增益(分类后左右的信息熵最小)if thresholds[i] == thresholds[i - 1]:  # 如果当前样本的特征值和前一个样本的特征值相同,跳过(不一样才能分界)continueif gain > best_gain:  # 如果当前的信息增益大于最佳信息增益best_gain = gain  # 更新最佳信息增益best_idx = idx  # 更新最佳特征索引best_thr = (thresholds[i] + thresholds[i - 1]) / 2  # 更新最佳阈值 (循环每个样本的值,根据两份数据均值确定阈值,一直循环)return best_idx, best_thr  # 返回最佳特征索引和阈值def _grow_tree(self, X, y, depth=0):num_samples_per_class = [np.sum(y == i) for i in range(self.n_classes_)]  # 计算每个类别的样本数量predicted_class = np.argmax(num_samples_per_class)  # 预测的类别为样本数量最多的类别 (即确定分到该分支样本最多的记为该类)node = Node(predicted_class=predicted_class)  # 创建节点if depth < self.max_depth:  # 如果当前深度小于最大深度idx, thr = self._best_gain_split(X, y)  # 计算最佳分割if idx is not None:  # 如果存在最佳分割indices_left = X[:, idx] < thr  # 左子树的样本索引 (第 idx特征中小于thr阈值的索引)X_left, y_left = X[indices_left], y[indices_left]  # 左子树的样本X_right, y_right = X[~indices_left], y[~indices_left]  # 右子树的样本node.feature_index = idx  # 设置节点的特征索引node.threshold = thr  # 设置节点的阈值node.left = self._grow_tree(X_left, y_left, depth + 1)  # 构建左子树node.right = self._grow_tree(X_right, y_right, depth + 1)  # 构建右子树return node  # 返回节点def _predict(self, inputs):node = self.tree_  # 获取决策树的根节点while node.left:  # 如果存在左子树if inputs[node.feature_index] < node.threshold:  # 如果输入样本的特征值小于阈值node = node.left  # 到左子树else:node = node.right  # 到右子树return node.predicted_class  # 返回预测的类别# 数据集
X = [[25, 1, 30000],[35, 0, 40000],[45, 0, 80000],[20, 1, 10000],[55, 1, 60000],[60, 0, 90000],[30, 1, 50000],[40, 0, 75000]]Y = [0, 0, 1, 0, 1, 1, 0, 1]# 创建决策树模型
clf = DecisionTree(max_depth=2)# 训练模型
clf.fit(np.array(X), np.array(Y))# 预测
print(clf.predict([[40, 0, 75000],[10, 0, 75000]]))  # 输出:[1, 0]

请注意,这个不使用任何机器学习库的决策树实现是一个基本的版本,它可能无法处理所有的情况,例如缺失值、分类特征等。在实际应用中,我们通常使用成熟的机器学习库,如scikit-learn,因为它们提供了更多的功能和优化。

1.2 回归

当决策树用于回归任务时,它被称为决策树回归模型。与分类树不同,决策树回归模型的叶子节点不再表示类别标签,而是表示一段连续区间或者一个数值。它同样基于树形结构,通过对数据特征的逐步划分,将数据集分成多个小的决策单元,并在每个叶子节点上输出一个预测值。

以下是决策树回归模型的详细原理:

  1. 划分过程

与分类树相似,决策树回归模型也采用递归二分的方式进行划分。具体来说,从根节点开始,选择一个最优特征和该特征的最优划分点。然后将数据集按照该特征的取值分为两部分,分别构建左右子树。重复以上步骤,直到满足停止条件,比如达到最大深度、划分后样本数少于阈值等。

  1. 叶子节点的输出值

当到达某个叶子节点时,该叶子节点的输出值就是训练集中该叶子节点对应的所有样本的平均值(或中位数等)

  1. 预测过程

对于一个测试样本,从根节点开始,按照各个特征的划分方式逐步匹配,最终到达某个叶子节点,并将该测试样本的预测值设为该叶子节点的输出值。

  1. 剪枝操作

与分类树一样,决策树回归模型也容易出现过拟合问题,因此需要进行剪枝操作。常用的剪枝方法包括预剪枝和后剪枝。

  1. 特点

决策树回归模型具有以下特点:

(1)易于解释:决策树回归模型能够直观地反映各个特征对目标变量的影响程度。

(2)非参数性:决策树回归模型不对数据分布做任何假设,适用于各种类型的数据。

(3)可处理多元特征:决策树回归模型可以同时处理多个输入特征。

(4)不需要数据正态化:决策树回归模型不需要对输入数据进行正态化等预处理。

在这里插入图片描述

						  🤞到这里,如果还有什么疑问🤞🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳

相关文章:

【机器学习 | 决策树】利用数据的潜力:用决策树解锁洞察力

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…...

postgis mvt矢量切片 django drf mapboxgl

postgis mvt矢量切片 django drf mapboxgl 目录 0.前提 1.sql代码 2.django drf后端服务代码 3.具体的应用&#xff08;整体代码&#xff09; 4.参考 0.前提 [1] 静态的矢量切片可以采用 tippecanoe 生成&#xff0c;nginx代理&#xff0c;这种数据是不更新的&#xff1b…...

C语言编程工具软件推荐!

1、VS(Visual Studio) [VS是目前最受欢迎的适用于Windows平台应用程序的综合开发环境&#xff0c;由于大多数同学使用的都是Windows操作系统&#xff0c;因此VS非常适合大家。在日常课堂和考试中&#xff0c;我们使用的VS2010支持多种不同的编程语言&#xff0c;VS2010最初支持…...

单体架构和微服务架构的区别

文章目录 一、单体架构的定义1. 单体架构的优点&#xff1a;2. 单体架构的缺点&#xff1a; 二、微服务架构的定义1. 微服务架构的优点&#xff1a;2. 微服务架构的缺点&#xff1a; 三、单体架构VS微服务架构1. 区别&#xff1a;1.1 架构规模&#xff1a;1.2 依赖关系&#xf…...

python--local对象、flask上下文源码分析

一、local对象 背景&#xff1a; 多线成并发操作一个变量&#xff0c;会导致数据错乱&#xff0c;可以使用互斥锁加锁处理数据不安全的情况 &#xff08;临界区&#xff09; 解决&#xff1a; 使用local对象处理&#xff0c;多个线程操作的变量是local对象&#xff0c;就不会…...

类文件一些内容

1、类加载 将类的字节码加载到JVM中&#xff0c;并转换为可以被JVM运行的数据结构的过程 类文件结构...

28 Java练习——实现两个集合的交集和并集

求并集的思路&#xff1a;假设传入的是一个ArrayList对象&#xff0c;求并集的时候直接调用其中一个List集合的addAll方法将另一个集合合并过来&#xff0c;而List的特性是有序&#xff0c;重复的。因此&#xff0c;使用Set接口的无序不可重复的特性&#xff0c;把Collection对…...

ES6学习-Promise

Promise 简单说就是一个容器&#xff0c;里面保存着某个未来才会结束的事件&#xff08;通常是一个异步操作&#xff09;的结果。 语法上&#xff1a; Promise 是一个对象&#xff0c;从它可以获取异步操作的消息。 特点 对象的状态不受外界影响。Promise 对象戴白哦一个异步操…...

《Web安全基础》03. SQL 注入

web 1&#xff1a;简要 SQL 注入2&#xff1a;MySQL 注入2.1&#xff1a;信息获取2.2&#xff1a;跨库攻击2.3&#xff1a;文件读写2.4&#xff1a;常见防护 3&#xff1a;注入方法3.1&#xff1a;类型方法明确3.2&#xff1a;盲注3.3&#xff1a;编码3.4&#xff1a;二次注入3…...

算法与数据结构(二十一)二叉树(纲领篇)

备注&#xff1a;本文旨在通过 labuladong 的二叉树&#xff08;纲领篇&#xff09;理解框架思维&#xff0c;用于个人笔记及交流学习&#xff0c;版权归原作者 labuladong 所有&#xff1b; 我刷了这么多年题&#xff0c;浓缩出二叉树算法的一个总纲放在这里&#xff0c;也许…...

visio,word添加缺少字体,仿宋_GB2312、楷体_GB2312、方正小标宋简体等字体下载

一. 内容简介 visio,word添加缺少字体,仿宋_GB2312、楷体_GB2312、方正小标宋简体等字体下载 二. 软件环境 2.1 visio 三.主要流程 3.1 下载字体 http://www.downza.cn/ 微软官方给的链接好多字体没有&#xff0c;其他好多字体网站&#xff0c;就是给你看个样式&#xff…...

Java爬虫

什么是爬虫&#xff1f; 通过请求&#xff0c;从而去获取互联网上的各种数据与资源&#xff0c;如文字&#xff0c;图片&#xff0c;视频。 本质上原理都一样&#xff0c;都是通过api请求&#xff0c;然后服务器就会发给你信息&#xff0c;然后你再根据这些信息去提取你想要的…...

海外应用商店优化实用指南之关键词

和SEO一样&#xff0c;关键词是ASO中的一个重要因素。就像应用程序标题一样&#xff0c;在Apple App Store和Google Play中处理应用程序关键字的方式也有所不同。 关键词研究。 对于Apple&#xff0c;我们的所有关键词只能获得100个字符&#xff0c;Google Play没有特定的关键…...

element+vue 之动态form

1.页面部分 <div v-for"(item,index) in formList" :key"index"><el-col :span"6" v-if"item.inputType0"><el-form-item :label"item.conditionName" :prop"item.conditionCode":rules"{req…...

winform学习(3)-----Windows窗体应用和Windows窗体应用(.Net Framework)有啥区别?

1.模板选择 在学习winform的时候总是会对这两个应用不知道选择哪个&#xff1f;而且在学习的时候也没有具体的说明 首先说一下我是在添加控件的时候出现了以下问题 对于使用了Windows窗体应用这个模板的文件在工具箱中死活不见控件。 在转换使用了Windows窗体应用(.NET Fram…...

虚拟化中的中断机制:X86与PIC 8259A探索(上)

本系列深入探讨虚拟化中断技术&#xff0c;从X86架构和PIC 8259A的基础&#xff0c;到IOAPIC和MSI的编程&#xff0c;再到MSIX技术与Broiler设备的实战应用&#xff0c;全面剖析中断虚拟化的前沿进展。 X86 中断机制 ​ 在计算机架构中&#xff0c;CPU 运行的速度远远大于外设…...

软件外包开发语言排行榜

软件开发语言的排行榜是一个动态的话题&#xff0c;而在未来的几年中&#xff0c;新的技术和语言可能会不断涌现&#xff0c;影响排名。然而以下是一些在过去几年中一直受欢迎并有前途的软件开发语言&#xff0c;如果是新入门软件开发行业在学习语言做选择&#xff0c;希望下面…...

BI技巧丨利用OFFSET计算同环比

微软最近更新了很多开窗函数&#xff0c;其内部参数对比以往的DAX函数来说&#xff0c;多了很多&#xff0c;这就导致学习的时间成本直线上升。 而且对于新增函数的应用场景&#xff0c;很多小伙伴也是一知半解的&#xff0c;本期我们就来聊一聊关于最近新增的开窗函数——OFF…...

整理mongodb文档:collation

文章连接 整理mongodb文档:collation 看前提示 对于mongodb的collation。个人主要用的范围是在createcollection&#xff0c;以及find的时候用&#xff0c;所以本片介绍的时候也是这两个地方入手&#xff0c;对新手个人觉得理解概念就好。不要求强制性掌握&#xff0c;但是要…...

【LangChain】Prompts之Prompt templates

Prompts 编程模型的新方法是通过提示(prompts)。 prompts是指模型的输入。该输入通常由多个组件构成。 LangChain 提供了多个类和函数&#xff0c;使构建和使用prompts变得容易。 Prompt templates(提示模板): 参数化模型输入Example selectors(选择器示例): 动态选择要包含在…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...