Python 机器学习 基础 之 监督学习 【分类器的不确定度估计】 的简单说明

Python 机器学习 基础 之 监督学习 【分类器的不确定度估计】 的简单说明

目录

Python 机器学习 基础 之 监督学习 【分类器的不确定度估计】 的简单说明

一、简单介绍

二、监督学习 算法 说明前的 数据集 说明

三、监督学习 之 分类器的不确定度估计

1、决策函数

2、预测概率

附录

一、参考文献


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

Python 机器学习是利用 Python 编程语言中的各种工具和库来实现机器学习算法和技术的过程。Python 是一种功能强大且易于学习和使用的编程语言,因此成为了机器学习领域的首选语言之一。Python 提供了丰富的机器学习库,如Scikit-learn、TensorFlow、Keras、PyTorch等,这些库包含了许多常用的机器学习算法和深度学习框架,使得开发者能够快速实现、测试和部署各种机器学习模型。

Python 机器学习涵盖了许多任务和技术,包括但不限于:

  1. 监督学习:包括分类、回归等任务。
  2. 无监督学习:如聚类、降维等。
  3. 半监督学习:结合了有监督和无监督学习的技术。
  4. 强化学习:通过与环境的交互学习来优化决策策略。
  5. 深度学习:利用深度神经网络进行学习和预测。

通过 Python 进行机器学习,开发者可以利用其丰富的工具和库来处理数据、构建模型、评估模型性能,并将模型部署到实际应用中。Python 的易用性和庞大的社区支持使得机器学习在各个领域都得到了广泛的应用和发展。

二、监督学习 算法 说明前的 数据集 说明

相关说明可见如下链接的  <  二、监督学习 算法 说明前的 数据集 说明 >,这里不在赘述:

数据集 说明:Python 机器学习 基础 之 监督学习 K-NN (K-邻近)算法 的简单说明

三、监督学习 之 分类器的不确定度估计

我们还没有谈到 scikit-learn 接口的另一个有用之处,就是分类器能够给出预测的不确定度估计。一般来说,你感兴趣的不仅是分类器会预测一个测试点属于哪个类别,还包括它对这个预测的置信程度。在实践中,不同类型的错误会在现实应用中导致非常不同的结果。想象一个用于测试癌症的医疗应用。假阳性预测可能只会让患者接受额外的测试,但假阴性预测却可能导致重病没有得到治疗。

在监督学习中,分类器的不确定度估计是指分类器对于自己的预测有多大程度的不确定性。这在实际应用中非常重要,因为它可以帮助我们更好地理解模型的预测能力,提高模型在决策边界附近的可靠性,并且有助于对模型的性能进行评估。

以下是一些常见的分类器不确定度估计方法:

  1. 置信度评分(Confidence Score):对于概率分类器(如逻辑回归、朴素贝叶斯、支持向量机的概率版本等),可以使用预测概率的最大值或其他置信度评分来表示分类器对于每个类别的预测置信度。通常情况下,较高的置信度表示模型对于预测的准确性更有信心。

  2. 不确定度估计器(Uncertainty Estimation):一些分类器提供了内置的不确定度估计器,例如随机森林的 Out-of-Bag 估计、支持向量机的决策函数距离、基于置信度的 K 最近邻分类器等。这些估计器可以用来度量模型对于每个样本的不确定性,例如基于样本与决策边界的距离或在集成中的不一致性。

  3. 交叉验证(Cross-Validation):通过交叉验证技术,可以对模型在不同数据集上的稳定性进行评估,从而间接地了解模型的不确定性。例如,在 k 折交叉验证中,我们可以观察模型在不同折上的表现差异,以及在整个数据集上的平均性能,从而推断模型的不确定度。

  4. 包外估计(Out-of-Bag Estimation):对于基于决策树的集成方法(如随机森林),可以使用包外估计方法来评估模型的性能和不确定性。在构建每棵决策树时,有部分样本没有被用于训练,这些未被使用的样本可以用于评估模型的泛化性能和不确定度。

  5. Bootstrap 方法:通过重复采样原始数据集来构建多个训练数据集,并在每个训练数据集上训练模型,然后利用这些模型的预测结果的方差或置信区间来估计分类器的不确定性。

这些方法可以帮助我们更好地理解分类器的预测不确定性,从而提高模型的可解释性和可靠性。

scikit-learn 中有两个函数可用于获取分类器的不确定度估计:decision_function 和 predict_proba 。大多数分类器(但不是全部)都至少有其中一个函数,很多分类器两个都有。我们来构建一个 GradientBoostingClassifier 分类器(同时拥有 decision_function 和 predict_proba 两个方法),看一下这两个函数对一个模拟的二维数据集的作用:

from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import make_circles
import numpy as np
from sklearn.model_selection import train_test_split

X, y = make_circles(noise=0.25, factor=0.5, random_state=1)

# 为了便于说明,我们将两个类别重命名为"blue"和"red"
y_named = np.array(["blue", "red"])[y]

# 我们可以对任意个数组调用train_test_split
# 所有数组的划分方式都是一致的
X_train, X_test, y_train_named, y_test_named, y_train, y_test = \
    train_test_split(X, y_named, y, random_state=0)

# 构建梯度提升模型
gbrt = GradientBoostingClassifier(random_state=0)
gbrt.fit(X_train, y_train_named)

1、决策函数

对于二分类的情况,decision_function 返回值的形状是 (n_samples,) ,为每个样本都返回一个浮点数:

print("X_test.shape: {}".format(X_test.shape))
print("Decision function shape: {}".format(
    gbrt.decision_function(X_test).shape))

对于类别 1 来说,这个值表示模型对该数据点属于“正”类的置信程度。正值表示对正类的偏好,负值表示对“反类”(其他类)的偏好:

# 显示decision_function的前几个元素
print("Decision function:\n{}".format(gbrt.decision_function(X_test)[:6]))

我们可以通过仅查看决策函数的正负号来再现预测值:

print("Thresholded decision function:\n{}".format(
    gbrt.decision_function(X_test) > 0))
print("Predictions:\n{}".format(gbrt.predict(X_test)))

对于二分类问题,“反”类始终是 classes_ 属性的第一个元素,“正”类是 classes_ 的第二个元素。因此,如果你想要完全再现 predict 的输出,需要利用 classes_ 属性:

# 将布尔值True/False转换成0和1
greater_zero = (gbrt.decision_function(X_test) > 0).astype(int)
# 利用0和1作为classes_的索引
pred = gbrt.classes_[greater_zero]
# pred与gbrt.predict的输出完全相同
print("pred is equal to predictions: {}".format(
    np.all(pred == gbrt.predict(X_test))))

decision_function 可以在任意范围取值,这取决于数据与模型参数:

decision_function = gbrt.decision_function(X_test)
print("Decision function minimum: {:.2f} maximum: {:.2f}".format(
    np.min(decision_function), np.max(decision_function)))    

由于可以任意缩放,因此 decision_function 的输出往往很难解释。

在下面的例子中,我们利用颜色编码在二维平面中画出所有点的 decision_function ,还有决策边界,后者我们之间见过。我们将训练点画成圆,将测试数据画成三角(如下图):

fig, axes = plt.subplots(1, 2, figsize=(13, 5))
mglearn.tools.plot_2d_separator(gbrt, X, ax=axes[0], alpha=.4,
                                fill=True, cm=mglearn.cm2)
scores_image = mglearn.tools.plot_2d_scores(gbrt, X, ax=axes[1],
                                            alpha=.4, cm=mglearn.ReBl)

for ax in axes:
    # 画出训练点和测试点
    mglearn.discrete_scatter(X_test[:, 0], X_test[:, 1], y_test,
                             markers='^', ax=ax)
    mglearn.discrete_scatter(X_train[:, 0], X_train[:, 1], y_train,
                             markers='o', ax=ax)
    ax.set_xlabel("Feature 0")
    ax.set_ylabel("Feature 1")
cbar = plt.colorbar(scores_image, ax=axes.tolist())
axes[0].legend(["Test class 0", "Test class 1", "Train class 0",
                "Train class 1"], ncol=4, loc=(.1, 1.1))

plt.savefig('Images/08UncertaintyEstimationForClassifier-01.png', bbox_inches='tight')
plt.show()
梯度提升模型在一个二维玩具数据集上的决策边界(左)和决策函数(右)

既给出预测结果,又给出分类器的置信程度,这样给出的信息量更大。但在上面的图像中,很难分辨出两个类别之间的边界。

2、预测概率

predict_proba 的输出是每个类别的概率,通常比 decision_function 的输出更容易理解。对于二分类问题,它的形状始终是 (n_samples, 2) :

print("Shape of probabilities: {}".format(gbrt.predict_proba(X_test).shape))

每行的第一个元素是第一个类别的估计概率,第二个元素是第二个类别的估计概率。由于 predict_proba 的输出是一个概率,因此总是在 0 和 1 之间,两个类别的元素之和始终为 1:

# 显示predict_proba的前几个元素
print("Predicted probabilities:\n{}".format(
    gbrt.predict_proba(X_test[:6])))

由于两个类别的概率之和为 1,因此只有一个类别的概率超过 50%。这个类别就是模型的预测结果。

在上一个输出中可以看到,分类器对大部分点的置信程度都是相对较高的。不确定度大小实际上反映了数据依赖于模型和参数的不确定度。过拟合更强的模型可能会做出置信程度更高的预测,即使可能是错的。复杂度越低的模型通常对预测的不确定度越大。如果模型给出的不确定度符合实际情况,那么这个模型被称为校正 (calibrated)模型。在校正模型中,如果预测有 70% 的确定度,那么它在 70% 的情况下正确。

在下面的例子中(下图),我们再次给出该数据集的决策边界,以及类别 1 的类别概率:

fig, axes = plt.subplots(1, 2, figsize=(13, 5))

mglearn.tools.plot_2d_separator(
    gbrt, X, ax=axes[0], alpha=.4, fill=True, cm=mglearn.cm2)
scores_image = mglearn.tools.plot_2d_scores(
    gbrt, X, ax=axes[1], alpha=.5, cm=mglearn.ReBl, function='predict_proba')

for ax in axes:
    # 画出训练点和测试点
    mglearn.discrete_scatter(X_test[:, 0], X_test[:, 1], y_test,
                             markers='^', ax=ax)
    mglearn.discrete_scatter(X_train[:, 0], X_train[:, 1], y_train,
                             markers='o', ax=ax)
    ax.set_xlabel("Feature 0")
    ax.set_ylabel("Feature 1")
cbar = plt.colorbar(scores_image, ax=axes.tolist())
axes[0].legend(["Test class 0", "Test class 1", "Train class 0",
                "Train class 1"], ncol=4, loc=(.1, 1.1))

plt.savefig('Images/08UncertaintyEstimationForClassifier-02.png', bbox_inches='tight')
plt.show()
梯度提升模型的决策边界(左)和预测概率

上图中的边界更加明确,不确定的小块区域清晰可见。

scikit-learn 网站(Classifier comparison — scikit-learn 1.4.2 documentation )给出了许多模型的对比,以及不确定度估计的形状。我们在下图中复制了这一结果,我们也建议你去网站查看那些示例。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap

from sklearn.datasets import make_circles, make_classification, make_moons
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
from sklearn.ensemble import AdaBoostClassifier, RandomForestClassifier
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.gaussian_process.kernels import RBF
from sklearn.inspection import DecisionBoundaryDisplay
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier

names = [
    "Nearest Neighbors",
    "Linear SVM",
    "RBF SVM",
    "Gaussian Process",
    "Decision Tree",
    "Random Forest",
    "Neural Net",
    "AdaBoost",
    "Naive Bayes",
    "QDA",
]

classifiers = [
    KNeighborsClassifier(3),
    SVC(kernel="linear", C=0.025, random_state=42),
    SVC(gamma=2, C=1, random_state=42),
    GaussianProcessClassifier(1.0 * RBF(1.0), random_state=42),
    DecisionTreeClassifier(max_depth=5, random_state=42),
    RandomForestClassifier(
        max_depth=5, n_estimators=10, max_features=1, random_state=42
    ),
    MLPClassifier(alpha=1, max_iter=1000, random_state=42),
    AdaBoostClassifier(algorithm="SAMME", random_state=42),
    GaussianNB(),
    QuadraticDiscriminantAnalysis(),
]

X, y = make_classification(
    n_features=2, n_redundant=0, n_informative=2, random_state=1, n_clusters_per_class=1
)
rng = np.random.RandomState(2)
X += 2 * rng.uniform(size=X.shape)
linearly_separable = (X, y)

datasets = [
    make_moons(noise=0.3, random_state=0),
    make_circles(noise=0.2, factor=0.5, random_state=1),
    linearly_separable,
]

figure = plt.figure(figsize=(27, 9))
i = 1
# iterate over datasets
for ds_cnt, ds in enumerate(datasets):
    # preprocess dataset, split into training and test part
    X, y = ds
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.4, random_state=42
    )

    x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
    y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5

    # just plot the dataset first
    cm = plt.cm.RdBu
    cm_bright = ListedColormap(["#FF0000", "#0000FF"])
    ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
    if ds_cnt == 0:
        ax.set_title("Input data")
    # Plot the training points
    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright, edgecolors="k")
    # Plot the testing points
    ax.scatter(
        X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6, edgecolors="k"
    )
    ax.set_xlim(x_min, x_max)
    ax.set_ylim(y_min, y_max)
    ax.set_xticks(())
    ax.set_yticks(())
    i += 1

    # iterate over classifiers
    for name, clf in zip(names, classifiers):
        ax = plt.subplot(len(datasets), len(classifiers) + 1, i)

        clf = make_pipeline(StandardScaler(), clf)
        clf.fit(X_train, y_train)
        score = clf.score(X_test, y_test)
        DecisionBoundaryDisplay.from_estimator(
            clf, X, cmap=cm, alpha=0.8, ax=ax, eps=0.5
        )

        # Plot the training points
        ax.scatter(
            X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright, edgecolors="k"
        )
        # Plot the testing points
        ax.scatter(
            X_test[:, 0],
            X_test[:, 1],
            c=y_test,
            cmap=cm_bright,
            edgecolors="k",
            alpha=0.6,
        )

        ax.set_xlim(x_min, x_max)
        ax.set_ylim(y_min, y_max)
        ax.set_xticks(())
        ax.set_yticks(())
        if ds_cnt == 0:
            ax.set_title(name)
        ax.text(
            x_max - 0.3,
            y_min + 0.3,
            ("%.2f" % score).lstrip("0"),
            size=15,
            horizontalalignment="right",
        )
        i += 1

plt.tight_layout()
plt.savefig('Images/08UncertaintyEstimationForClassifier-03.png', bbox_inches='tight')
plt.show()
scikit-learn 中几种分类器在模拟数据集上的对比

到目前为止,我们只讨论了二分类问题中的不确定度估计。但 decision_function 和 predict_proba 也适用于多分类问题。我们将这两个函数应用于鸢尾花(Iris)数据集,这是一个三分类数据集:

from sklearn.datasets import load_iris

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, random_state=42)

gbrt = GradientBoostingClassifier(learning_rate=0.01, random_state=0)
gbrt.fit(X_train, y_train)
print("Decision function shape: {}".format(gbrt.decision_function(X_test).shape))
# 显示决策函数的前几个元素
print("Decision function:\n{}".format(gbrt.decision_function(X_test)[:6, :]))

对于多分类的情况,decision_function 的形状为 (n_samples, n_classes) ,每一列对应每个类别的“确定度分数”,分数较高的类别可能性更大,得分较低的类别可能性较小。你可以找出每个数据点的最大元素,从而利用这些分数再现预测结果:

print("Argmax of decision function:\n{}".format(
      np.argmax(gbrt.decision_function(X_test), axis=1)))
print("Predictions:\n{}".format(gbrt.predict(X_test)))

predict_proba 输出的形状相同,也是 (n_samples, n_classes) 。同样,每个数据点所有可能类别的概率之和为 1:

# 显示predict_proba的前几个元素
print("Predicted probabilities:\n{}".format(gbrt.predict_proba(X_test)[:6]))
# 显示每行的和都是1
print("Sums: {}".format(gbrt.predict_proba(X_test)[:6].sum(axis=1)))

同样,我们可以通过计算 predict_proba 的 argmax 来再现预测结果:

print("Argmax of predicted probabilities:\n{}".format(
      np.argmax(gbrt.predict_proba(X_test), axis=1)))
print("Predictions:\n{}".format(gbrt.predict(X_test)))

总之,predict_proba 和 decision_function 的形状始终相同,都是 (n_samples, n_classes) ——除了二分类特殊情况下的 decision_function 。对于二分类的情况,decision_function 只有一列,对应“正”类 classes_[1] 。这主要是由于历史原因。

如果有 n_classes 列,你可以通过计算每一列的 argmax 来再现预测结果。但如果类别是字符串,或者是整数,但不是从 0 开始的连续整数的话,一定要小心。如果你想要对比 predict 的结果与 decision_function 或 predict_proba 的结果,一定要用分类器的 classes_ 属性来获取真实的属性名称:

from sklearn.linear_model import LogisticRegression

logreg = LogisticRegression()

# 用Iris数据集的类别名称来表示每一个目标值
named_target = iris.target_names[y_train]
logreg.fit(X_train, named_target)
print("unique classes in training data: {}".format(logreg.classes_))
print("predictions: {}".format(logreg.predict(X_test)[:10]))
argmax_dec_func = np.argmax(logreg.decision_function(X_test), axis=1)
print("argmax of decision function: {}".format(argmax_dec_func[:10]))
print("argmax combined with classes_: {}".format(
        logreg.classes_[argmax_dec_func][:10]))

附录

一、参考文献

参考文献:[德] Andreas C. Müller [美] Sarah Guido 《Python Machine Learning Basics Tutorial》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么转换视频格式到mp4?格式转换,4种简单方法

转换视频格式到MP4可以使视频在各种设备上播放更加方便&#xff0c;而MP4格式的优势在于其高质量的视频和相对较小的文件大小。怎么转换视频格式到mp4&#xff1f;在本文中&#xff0c;我们将介绍四种简单有效的方法&#xff0c;帮助您快速将视频格式转换为MP4。 无论您是初学…

Linux内核的非确定行为消除

Linux内核作为一种广泛使用的开源操作系统内核&#xff0c;在多种硬件和设备上运行&#xff0c;提供了强大的功能和灵活的配置选项。然而&#xff0c;随着技术的发展和应用需求的增加&#xff0c;内核中出现的不确定行为也日益成为开发者和系统管理员关注的焦点。这些不确定行为…

Encryption Everywhere DV TLS CA - G1

Encryption Everywhere DV TLS CA - G1属于DigiCertCA机构发布&#xff0c;分为单域名SSL证书和通配符SSL证书两种为主&#xff0c;常见的是单域名SSL证书&#xff0c;到期后就需要重新申请。 单域名类型可以保护一个全域名&#xff0c;比如&#xff1a;一个子域名或者一个主域…

卖家必备:OZON、WB自养号测评详解从搭建到权重提升的全方位指导

俄罗斯跨境电商平台OZON、WB国内卖家入驻也日益渐多&#xff0c;很多卖家也都着手通过自养号测评方式打造产品权重&#xff0c;OZON、WB自养号测评具有多个优势&#xff0c;这些优势主要体现在以下几个方面&#xff1a; 权重提升快&#xff1a;通过自养号进行测评&#xff0c…

yolov8 模型架构轻量化 | 极致降参数量

模型轻量化加速是深度学习领域的重要研究方向&#xff0c;旨在减小模型的体积和计算复杂度&#xff0c;从而提高在资源受限设备上的运行效率&#xff0c;模型参数量在轻量化加速中扮演着至关重要的角色。 首先&#xff0c;模型参数量直接决定了模型的复杂度和存储空间需求。随…

Python数据分析与数据可视化 概念

考试题型&#xff1a; 一、填空题&#xff08;1分*10&#xff09; 二、程序代码填空&#xff08;1分*20&#xff09; 三、读程序写结果&#xff08;10分*4&#xff09; 四、程序设计&#xff08;10分*1&#xff09; 五、问答题&#xff08;20分*1&#xff09; 考试范围&#x…

【前段】开发五子棋小游戏全流程

使用前端技术开发五子棋小游戏 在这篇博文中&#xff0c;我们将详细介绍如何使用HTML、CSS和JavaScript开发一个简单的五子棋小游戏。我们将展示如何初始化棋盘、处理用户交互以及实现胜负判定。特别是&#xff0c;我们将着重介绍胜负判定的逻辑实现。 完整代码我放在了这里&a…

springBoot 如何让数据库读写分离

springBoot 数据库读写分离 数据库的读写分离,首先要把spring 中的自动加载的类排除掉,因为我们配置文件配置了多数据源,并且希望自己主导sql语句执行的数据库。 启动类排除自动配置 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) 循环引用问题…

【喜马拉雅】副业分享、喜马拉雅如何赚钱、喜马拉雅写作赚钱、喜马拉雅会员免费吗?喜马拉雅极速版赚钱

上班族一枚&#xff0c;已经实现副业赚钱。结合自己的经历&#xff0c;给大家分享几点找副业的经验&#xff0c;专治「闲成废柴病」。 纯干货分享&#xff0c;不拉群、不私聊&#xff0c;请放心食用。建议先点赞收藏一下。 一、任何说马上能赚钱的副业&#xff0c;一般都不太靠…

React 状态管理库深度对比:在做技术选型的时候如何选择合适的状态库,nolan出品

掘金链接&#xff1a;https://juejin.cn/post/7368288987642232872 1,简介 在状态共享这方面&#xff0c;不像 Vuex&#xff0c;React 的官方并没有强力推荐某种封装方案&#xff0c;所以 React 的状态管理工具五花八门&#xff0c;百花齐放&#xff0c; react-redux、dva、C…

详解 JuiceFS sync 新功能,选择性同步增强与多场景性能优化

JuiceFS sync 是一个强大的数据同步工具&#xff0c;支持在多种存储系统之间进行并发同步或迁移数据&#xff0c;包括对象存储、JuiceFS、NFS、HDFS、本地文件系统等。此外&#xff0c;该工具还提供了增量同步、模式匹配&#xff08;类似 Rsync&#xff09;、分布式同步等高级功…

web安全学习笔记(16)

记一下第27-28课的内容。Token 验证 URL跳转漏洞的类型与三种跳转形式&#xff1b;URL跳转漏洞修复 短信轰炸漏洞绕过挖掘 一、token有关知识 什么是token&#xff1f;token是用来干嘛的&#xff1f;_token是什么意思-CSDN博客 二、URL跳转漏洞 我们在靶场中&#xff0c;…

【python量化交易】—— 双均线择时策略 - Qteasy自定义交易策略【附源码】

使用qteasy自定义并回测双均线交易策略 使用qteasy自定义并回测一个双均线择时策略策略思想导入qteasy模块创建一个新的策略回测交易策略&#xff0c;查看结果 使用qteasy自定义并回测一个双均线择时策略 我们今天使用qteasy来回测一个双均线择时交易策略&#xff0c;qteasy是…

计算机发展史故事【17】

任天堂崛起 七十年代美国雅达利公司开创一个高科技的电脑游戏业。无独有偶&#xff0c;一家专营电脑游戏机的日本任天堂公司&#xff0c;自八十年代初期把它的家庭电脑游戏机&#xff08;FC&#xff09;投放市场后&#xff0c;不平静的世界被再一次激起轩然大波。这个小小的日本…

x86 CPU的保护模式——概述(一)

文章目录 前言一、寄存器变化二、寻址变化三、为什么段寄存器依然是16位&#xff1f; 查看系列文章点这里&#xff1a; 操作系统真象还原 前言 我们在前面已经介绍过实模式了&#xff0c;它是32位 CPU 的一种工作模式&#xff0c;模拟了16位 CPU 的工作环境&#xff0c;但是大多…

java医院信息系统HIS源码SaaS模式Java版云HIS系统 接口技术RESTful API + WebSocket + WebService

java医院信息系统HIS源码SaaS模式Java版云HIS系统 接口技术RESTful API WebSocket WebService 云HIS是基于云计算的医疗卫生信息系统&#xff08;Cloud-Based Healthcare Information System&#xff09;&#xff0c;它运用云计算、大数据、物联网等新兴信息技术&#xff0c;…

centos7.9安装es7.12.0

下载es 国内镜像&#xff1a;https://mirrors.huaweicloud.com/elasticsearch/7.12.0/ 下载并上传内容到/usr/local目录下 解压&#xff1a; tar -zxvf /uar/local/elasticsearch-7.12.0-linux-x86_64.tar.gz安装 es一般不能用root启动&#xff0c;因此需要创建es:es用户和…

Mac SourceTree配置ssh git仓库

一、准备条件 1、Mac系统电脑 2、安装好SourceTree 3、获取ssh git仓库地址 二、配置步骤 1、打开终端命令行 ssh -t rsa -C "xxx""xxx"代表注册git仓库时&#xff0c;使用的用户名&#xff0c;可以是字符串也可以是邮箱地址。 如果遇到输入密码&#xf…

通过 Apple Vision Pro 释放创造力:深入研究空间计算

Apple 最新进军空间计算领域的 Apple Vision Pro,标志着重新定义我们与技术交互方式的重大飞跃。空间计算超越了传统界限,允许用户以无缝集成到物理世界的方式参与 2D 和 3D 内容。 我们可以关注两种类型的体验: 在空间中渲染 2D 内容。这涉及将现有设备窗口投影到空间领域…

某能源集团电力公司搭建数据报表中心,实现采集填报分析一体化

​在当今这个信息爆炸的时代&#xff0c;数据已成为企业最宝贵的财富&#xff0c;越来越多的企业开始重视数据的积累和归集。在企业日常生产和工作过程中&#xff0c;会产生绵延不断的数据&#xff0c;但这些数据往往没有统一的记录、归纳和整理&#xff0c;或者录入了系统却分…