【机器学习】鸢尾花分类:机器学习领域经典入门项目实战

学习机器学习,就像学习任何新技能一样,最好的方法之一就是通过实战来巩固理论知识。鸢尾花分类项目是一个经典的入门项目,它不仅简单易懂,还能帮助我们掌握机器学习的基本步骤和方法。

鸢尾花数据集(Iris Dataset)早在1936年就由英国生物学家 Ronald A. Fisher 引入。这个数据集包含了150个鸢尾花样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度和花瓣宽度)和1个目标变量(鸢尾花的品种)。这个数据集常用于教学和练习,是机器学习领域的 “Hello World” 项目。

本项目旨在使用鸢尾花数据集,通过数据准备、数据预处理、数据分割、模型选择、模型训练、模型评估、模型优化和模型部署等步骤,全面展示机器学习的基本流程。我们将使用 Python 和 scikit-learn 库,通过实际代码演示如何完成一个完整的机器学习项目。希望这篇文章能够帮助初学者快速上手机器学习,理解和掌握关键的技术和方法。


文章目录

      • 1、项目介绍
        • 1.1、项目背景
        • 1.2、项目目标
        • 1.3、项目步骤
      • 2、项目实战
        • 2.1、数据准备
        • 2.2、数据可视化
        • 2.3、数据预处理
        • 2.4、数据分割
        • 2.5、选择模型
        • 2.6、训练模型
        • 2.7、评估模型
        • 2.8、模型优化
        • 2.9、模型部署
      • 3、项目源码


1、项目介绍

鸢尾花分类项目是机器学习领域中一个经典的入门项目,旨在通过分类算法将不同品种的鸢尾花进行分类。这个项目常用于教学和练习机器学习的基本概念。

1.1、项目背景

鸢尾花数据集(Iris Dataset)由英国生物学家和统计学家 Ronald A. Fisher 于 1936 年在他的论文《The use of multiple measurements in taxonomic problems》中首次引入。这个数据集包含了 150 个鸢尾花样本,每个样本有 4 个特征和 1 个目标变量。

  • 特征包括:花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)和 花瓣宽度(petal width);
  • 目标变量:鸢尾花的品种(有三种类别:山鸢尾(Iris Setosa)、变色鸢尾(Iris Versicolour)以及 维吉尼亚鸢尾(Iris Virginica))。
1.2、项目目标

使用机器学习算法,根据鸢尾花的四个特征来预测其所属的品种。

1.3、项目步骤

以下是机器学习大致的基本步骤,我们后面实战部分也将是参考此步骤来进行的:

  1. 数据准备:获取并准备好数据集。在鸢尾花数据集中,这包括加载数据,了解数据的结构,检查是否有缺失值等;
  2. 数据预处理:对数据进行清洗和转换,如处理缺失值、标准化或归一化特征等;
  3. 数据分割:将数据分成训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能;
  4. 选择模型:选择合适的机器学习算法来训练模型,如K近邻(KNN)、决策树、逻辑回归、支持向量机(SVM)等;
  5. 训练模型:使用训练数据来训练模型;
  6. 评估模型:使用测试数据评估模型的性能,查看模型的准确率、混淆矩阵等评估指标;
  7. 模型优化:根据评估结果调整模型参数,优化模型性能;
  8. 模型部署:将训练好的模型应用到实际问题中进行预测。

2、项目实战

2.1、数据准备

鸢尾花数据集作为机器学习领域中最著名的数据集之一,常用于入门级教学和算法验证。

我们可以通过以下地址对该数据集进行下载:https://archive.ics.uci.edu/dataset/53/iris。下载后,导入:

import pandas as pd

# 指定列名
feature_names = [
    "sepal length (cm)",
    "sepal width (cm)",
    "petal length (cm)",
    "petal width (cm)"
]

# 加载数据
data = pd.read_csv('path/to/iris.data', header=None, names=feature_names + ['class'])

# 查看数据
print(data.head())

或者,我们也可以使用 scikit-learn 库自带的标准数据集进行导入 from sklearn.datasets import load_iris

import pandas as pd
from sklearn.datasets import load_iris

# 加载数据集
iris = load_iris()                                                              # 使用 load_iris 函数加载鸢尾花数据集,返回一个 Bunch 对象
data = pd.DataFrame(data=iris.data, columns=iris.feature_names)                 # 将数据集的特征数据转换为 pandas DataFrame,并指定列名为特征名称
data['target'] = iris.target                                                    # 在 DataFrame 中添加一列 'target',对应每个样本的目标标签
data['target_names'] = data['target'].apply(lambda x: iris.target_names[x])     # 添加一列 'target_names',通过映射 'target' 列的值来获取对应的目标名称

# 查看数据
print(data.head())      # 查看数据集前五行数据
print('-')
print(data.info())      # 查看数据集的基本信息
print('-')
print(data.describe())  # 查看数据集的统计信息

打印结果:

   sepal length (cm)  sepal width (cm)  ...  target  target_names
0                5.1               3.5  ...       0        setosa
1                4.9               3.0  ...       0        setosa
2                4.7               3.2  ...       0        setosa
3                4.6               3.1  ...       0        setosa
4                5.0               3.6  ...       0        setosa

[5 rows x 6 columns]
-
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 6 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   sepal length (cm)  150 non-null    float64
 1   sepal width (cm)   150 non-null    float64
 2   petal length (cm)  150 non-null    float64
 3   petal width (cm)   150 non-null    float64
 4   target             150 non-null    int64  
 5   target_names       150 non-null    object 
dtypes: float64(4), int64(1), object(1)
memory usage: 7.2+ KB
None
-
       sepal length (cm)  sepal width (cm)  ...  petal width (cm)      target
count         150.000000        150.000000  ...        150.000000  150.000000
mean            5.843333          3.057333  ...          1.199333    1.000000
std             0.828066          0.435866  ...          0.762238    0.819232
min             4.300000          2.000000  ...          0.100000    0.000000
25%             5.100000          2.800000  ...          0.300000    0.000000
50%             5.800000          3.000000  ...          1.300000    1.000000
75%             6.400000          3.300000  ...          1.800000    2.000000
max             7.900000          4.400000  ...          2.500000    2.000000

[8 rows x 5 columns]
2.2、数据可视化

通过数据可视化手段,探索数据的分布和特征之间的关系。使用 seabornpairplot 函数绘制特征之间的分布图,以便于观察数据的分布情况和不同类别之间的关系。

import seaborn as sns
import matplotlib.pyplot as plt

# 绘制特征分布图
sns.pairplot(data, hue='target', markers=["o", "s", "D"])  # 使用 seaborn 库的 pairplot 函数绘制散点图矩阵,根据 'target' 列着色,并使用不同的标记
plt.show()                                                 # 显示图形

打印结果:

image-20240613150903410

2.3、数据预处理

对数据进行清洗和转换,如处理缺失值、标准化或归一化特征等。

# 检查是否有缺失值
print(data.isnull().sum())  # 打印每列的缺失值数量,以检查数据集中是否存在缺失值

# 标准化特征值
scaler = StandardScaler()                                                  # 创建一个 StandardScaler 对象
data[iris.feature_names] = scaler.fit_transform(data[iris.feature_names])  # 对特征列进行标准化处理,使其均值为 0,标准差为 1

# 查看标准化后的数据
print(data.head())  # 打印标准化后的数据集的前五行,查看标准化效果

打印结果:

       sepal length (cm)  sepal width (cm)  ...  petal width (cm)      target
count         150.000000        150.000000  ...        150.000000  150.000000
mean            5.843333          3.057333  ...          1.199333    1.000000
std             0.828066          0.435866  ...          0.762238    0.819232
min             4.300000          2.000000  ...          0.100000    0.000000
25%             5.100000          2.800000  ...          0.300000    0.000000
50%             5.800000          3.000000  ...          1.300000    1.000000
75%             6.400000          3.300000  ...          1.800000    2.000000
max             7.900000          4.400000  ...          2.500000    2.000000

[8 rows x 5 columns]
-
sepal length (cm)    0
sepal width (cm)     0
petal length (cm)    0
petal width (cm)     0
target               0
target_names         0
dtype: int64
   sepal length (cm)  sepal width (cm)  ...  target  target_names
0          -0.900681          1.019004  ...       0        setosa
1          -1.143017         -0.131979  ...       0        setosa
2          -1.385353          0.328414  ...       0        setosa
3          -1.506521          0.098217  ...       0        setosa
4          -1.021849          1.249201  ...       0        setosa

[5 rows x 6 columns]
2.4、数据分割

将数据分成训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。

分割数据集的主要目的是为了评估模型的性能。通过将数据集划分为训练集和测试集,我们可以在训练集上训练模型,并在测试集上评估模型的泛化能力。这有助于检测模型是否过拟合或欠拟合,并提供对模型性能的更真实的评估。

from sklearn.model_selection import train_test_split

# 分割数据集
X = data[iris.feature_names]  # 特征数据,包含所有特征列
y = data['target']  # 目标数据,包含目标标签
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
                                                    random_state=42)  # 将数据集按 70% 训练集和 30% 测试集进行分割,设置随机种子为 42 以确保可重复性

# 查看分割后的数据集大小
print(f"训练集大小: {X_train.shape[0]}, 测试集大小: {X_test.shape[0]}")  # 打印训练集和测试集的大小

打印结果:

训练集大小: 105, 测试集大小: 45
2.5、选择模型

选择合适的机器学习算法来训练模型,如 K近邻(KNN)、决策树、逻辑回归、支持向量机(SVM)等。

这里选择 K 近邻(KNN)算法。

from sklearn.neighbors import KNeighborsClassifier

# 初始化 KNN 分类器
knn = KNeighborsClassifier(n_neighbors=3)  # 创建一个 K 近邻分类器对象,设置近邻数为 3
2.6、训练模型

使用训练数据来训练模型。

# 训练模型
knn.fit(X_train, y_train)     # 使用训练数据训练 K 近邻分类器模型
2.7、评估模型

使用测试数据评估模型的性能,查看模型的准确率、混淆矩阵等评估指标。

评估指标解释:

  1. 准确率(Accuracy):正确预测的样本数占总样本数的比例;
  2. 分类报告(Classification Report),包括精确率、召回率、F1 分数和支持:
    • 精确率(Precision):正确预测的正样本数占预测为正样本数的比例;
    • 召回率(Recall):正确预测的正样本数占实际正样本数的比例;
    • F1 分数(F1-score):精确率和召回率的调和平均数;
    • 支持(Support):实际样本中每个类别的数量;
  3. 混淆矩阵(Confusion Matrix):显示实际标签和预测标签的分布,帮助理解分类模型的错误类型。
pfrom sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 预测测试集
y_pred = knn.predict(X_test)  # 使用训练好的模型对测试数据进行预测,得到预测标签

# 评估模型
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")                      # 计算并打印模型在测试集上的准确率
print('-')
print("Classification Report:\n", classification_report(y_test, y_pred))  # 打印分类报告,包括精确率、召回率、F1 分数等
print('-')
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))            # 打印混淆矩阵,显示真实标签和预测标签之间的关系
print('-')

打印结果:

Accuracy: 1.0
-
Classification Report:
               precision    recall  f1-score   support

           0       1.00      1.00      1.00        19
           1       1.00      1.00      1.00        13
           2       1.00      1.00      1.00        13

    accuracy                           1.00        45
   macro avg       1.00      1.00      1.00        45
weighted avg       1.00      1.00      1.00        45

-
Confusion Matrix:
 [[19  0  0]
 [ 0 13  0]
 [ 0  0 13]]
2.8、模型优化

根据评估结果调整模型参数,优化模型性能。例如,通过网格搜索优化 KNN 模型的参数。

PS:网格搜索是一种系统化的方法,用于调整模型的超参数以提高模型的性能。通过交叉验证和不同参数组合的评估,网格搜索可以找到最佳的参数配置,从而提高模型的预测准确性和泛化能力。

from sklearn.model_selection import GridSearchCV

# 定义参数范围
param_grid = {'n_neighbors': range(1, 20)}  # 创建一个参数字典,设置 'n_neighbors' 参数的取值范围为 1 到 19

# 网格搜索
grid_search = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5)  # 创建一个 GridSearchCV 对象,使用 KNeighborsClassifier 和定义的参数范围,设置交叉验证折数为 5
grid_search.fit(X_train, y_train)                                     # 使用训练数据进行网格搜索,以找到最佳参数组合

# 最优参数
print(f"Best parameters: {grid_search.best_params_}")  # 打印通过网格搜索找到的最优参数
print('-')

# 使用最优参数训练模型
knn_best = grid_search.best_estimator_  # 获取使用最优参数训练的最佳模型
y_pred_best = knn_best.predict(X_test)  # 使用最佳模型对测试数据进行预测

# 评估模型
print(f"Accuracy(best): {accuracy_score(y_test, y_pred)}")                      # (优化后)计算并打印模型在测试集上的准确率
print('-')
print("Classification Report(best):\n", classification_report(y_test, y_pred))  # (优化后)打印分类报告,包括精确率、召回率、F1 分数等
print('-')
print("Confusion Matrix(best):\n", confusion_matrix(y_test, y_pred))            # (优化后)打印混淆矩阵,显示真实标签和预测标签之间的关系
print('-')

打印结果:

Best parameters: {'n_neighbors': 1}
-
Accuracy(best): 1.0
-
Classification Report(best):
               precision    recall  f1-score   support

           0       1.00      1.00      1.00        19
           1       1.00      1.00      1.00        13
           2       1.00      1.00      1.00        13

    accuracy                           1.00        45
   macro avg       1.00      1.00      1.00        45
weighted avg       1.00      1.00      1.00        45

-
Confusion Matrix(best):
 [[19  0  0]
 [ 0 13  0]
 [ 0  0 13]]
2.9、模型部署

将训练好的模型应用到实际问题中进行预测。例如,预测新的鸢尾花样本的类别。

PS:为什么要标准化新样本?标准化新样本是必要的步骤,因为模型在训练时使用的是标准化后的数据。如果新样本没有经过相同的标准化处理,特征值的尺度可能会与训练数据不同,从而导致预测不准确。通过使用相同的 StandardScaler 对新样本进行标准化,可以确保特征值在相同的尺度上,保证模型的预测效果。

# 新样本数据
new_samples = [[5.1, 3.5, 1.4, 0.2], [6.7, 3.0, 5.2, 2.3]]

# 将新样本数据转换为 DataFrame,并指定特征名称
new_samples_df = pd.DataFrame(new_samples, columns=iris.feature_names)

# 标准化新样本
new_samples_scaled = scaler.transform(new_samples_df)  # 使用之前的标准化器 scaler 对新样本进行标准化处理,使其与训练数据具有相同的尺度

# 预测新样本的类别
predictions = knn_best.predict(new_samples_scaled)  # 使用最佳模型 knn_best 对标准化后的新样本进行类别预测
print(f"新样本的预测类别: {predictions}")  # 打印新样本的预测类别

打印结果:

新样本的预测类别: [0 2]

打印结果显示新样本的预测类别分别为 [0, 2],即第一个新样本被预测为类别 0,第二个新样本被预测为类别 2。结合鸢尾花数据集的类别名称,这意味着:

  • 类别 0 对应的是 Iris-setosa
  • 类别 2 对应的是 Iris-virginica

3、项目源码

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix


# 加载数据集
iris = load_iris()  # 使用 load_iris 函数加载鸢尾花数据集,返回一个 Bunch 对象
data = pd.DataFrame(data=iris.data, columns=iris.feature_names)  # 将数据集的特征数据转换为 pandas DataFrame,并指定列名为特征名称
data['target'] = iris.target  # 在 DataFrame 中添加一列 'target',对应每个样本的目标标签
data['target_names'] = data['target'].apply(
    lambda x: iris.target_names[x])  # 添加一列 'target_names',通过映射 'target' 列的值来获取对应的目标名称

# 查看数据
print(data.head())  # 查看数据集前五行数据
print('-')
print(data.info())  # 查看数据集的基本信息
print('-')
print(data.describe())  # 查看数据集的统计信息
print('-')

# 绘制特征分布图
sns.pairplot(data, hue='target', markers=["o", "s", "D"])  # 使用 seaborn 库的 pairplot 函数绘制散点图矩阵,根据 'target' 列着色,并使用不同的标记
plt.show()  # 显示图形

# 检查是否有缺失值
print(data.isnull().sum())  # 打印每列的缺失值数量,以检查数据集中是否存在缺失值

# 标准化特征值
scaler = StandardScaler()  # 创建一个 StandardScaler 对象
data[iris.feature_names] = scaler.fit_transform(data[iris.feature_names])  # 对特征列进行标准化处理,使其均值为 0,标准差为 1

# 查看标准化后的数据
print(data.head())  # 打印标准化后的数据集的前五行,查看标准化效果
print('-')

# 分割数据集
X = data[iris.feature_names]  # 特征数据,包含所有特征列
y = data['target']  # 目标数据,包含目标标签
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
                                                    random_state=42)  # 将数据集按 70% 训练集和 30% 测试集进行分割,设置随机种子为 42 以确保可重复性

# 查看分割后的数据集大小
print(f"训练集大小: {X_train.shape[0]}, 测试集大小: {X_test.shape[0]}")  # 打印训练集和测试集的大小
print('-')

# 初始化 KNN 分类器
knn = KNeighborsClassifier(n_neighbors=3)  # 创建一个 K 近邻分类器对象,设置近邻数为 3

# 训练模型
knn.fit(X_train, y_train)     # 使用训练数据训练 K 近邻分类器模型

# 预测测试集
y_pred = knn.predict(X_test)  # 使用训练好的模型对测试数据进行预测,得到预测标签

# 评估模型
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")                      # 计算并打印模型在测试集上的准确率
print('-')
print("Classification Report:\n", classification_report(y_test, y_pred))  # 打印分类报告,包括精确率、召回率、F1 分数等
print('-')
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))            # 打印混淆矩阵,显示真实标签和预测标签之间的关系
print('-')

# 定义参数范围
param_grid = {'n_neighbors': range(1, 20)}  # 创建一个参数字典,设置 'n_neighbors' 参数的取值范围为 1 到 19

# 网格搜索
grid_search = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5)  # 创建一个 GridSearchCV 对象,使用 KNeighborsClassifier 和定义的参数范围,设置交叉验证折数为 5
grid_search.fit(X_train, y_train)                                     # 使用训练数据进行网格搜索,以找到最佳参数组合

# 最优参数
print(f"Best parameters: {grid_search.best_params_}")  # 打印通过网格搜索找到的最优参数
print('-')

# 使用最优参数训练模型
knn_best = grid_search.best_estimator_  # 获取使用最优参数训练的最佳模型
y_pred_best = knn_best.predict(X_test)  # 使用最佳模型对测试数据进行预测

# 评估模型
print(f"Accuracy(best): {accuracy_score(y_test, y_pred)}")                      # (优化后)计算并打印模型在测试集上的准确率
print('-')
print("Classification Report(best):\n", classification_report(y_test, y_pred))  # (优化后)打印分类报告,包括精确率、召回率、F1 分数等
print('-')
print("Confusion Matrix(best):\n", confusion_matrix(y_test, y_pred))            # (优化后)打印混淆矩阵,显示真实标签和预测标签之间的关系
print('-')

# 新样本数据
new_samples = [[5.1, 3.5, 1.4, 0.2], [6.7, 3.0, 5.2, 2.3]]  # 定义新的样本数据,每个样本包含四个特征值

# 将新样本数据转换为 DataFrame,并指定特征名称
new_samples_df = pd.DataFrame(new_samples, columns=iris.feature_names)

# 标准化新样本
new_samples_scaled = scaler.transform(new_samples_df)  # 使用之前的标准化器 scaler 对新样本进行标准化处理,使其与训练数据具有相同的尺度

# 预测新样本的类别
predictions = knn_best.predict(new_samples_scaled)  # 使用最佳模型 knn_best 对标准化后的新样本进行类别预测
print(f"新样本的预测类别: {predictions}")              # 打印新样本的预测类别

通过这段代码,我们展示了如何加载鸢尾花数据集、进行标准化处理、分割数据集、使用网格搜索优化 K 近邻分类器、训练模型、评估模型以及对新样本进行预测。最终的预测结果 [0, 2] 表明第一个新样本被预测为 Iris-setosa,第二个新样本被预测为 Iris-virginica,这验证了整个机器学习过程的正确性和有效性。

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

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

相关文章

Django 5 Web应用开发实战

文章目录 一、内容简介二、目录内容三、值得一读四、适读人群 一、内容简介 《Django 5 Web应用开发实战》集Django架站基础、项目实践、开发经验于一体&#xff0c;是一本从零基础到精通Django Web企业级开发技术的实战指南。《Django 5 Web应用开发实战》内容以Python 3.x和…

Java多线程面试重点-1

0. 什么是并发&#xff1f;什么是并行&#xff1f; 并发&#xff1a;把时间分成一段一段&#xff0c;每个线程轮流抢占时间段。 如果时间段非常短&#xff0c;线程切换非常快&#xff0c;被称为伪并行。并行&#xff1a;多个线程可以同时运行。 并发与并行造成的影响&#xff…

如何把路由器设备的LAN口地址为三大私网地址

要将路由器的LAN口地址配置为三大私有IP地址范围之一&#xff08;10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16&#xff09;&#xff0c;我们需要访问路由器的管理界面并进行相应的设置。 下面是步骤&#xff1a; 连接到路由器&#xff1a; 连接到路由器的管理界面&#xf…

在vue中循环中调用接口-promise.all();按顺序执行异步处理

&#x1f308;&#x1f308;&#x1f308;目录 场景一 解决 场景二 解决 场景一 数组遍历中每次遍历都需要去请求getStaffCover接口&#xff0c;拿到该接口的结果拼接到数组的每一项&#xff0c;等到数组遍历完之后&#xff0c;拿到拼接好的数组。拼接的数组必须是最终遍历…

计算机网络 —— 应用层(应用层概述及服务方式)

计算机网络 —— 应用层&#xff08;应用层概述及服务方式&#xff09; 应用层服务方式C/S&#xff08;客户端-服务器&#xff08;C/S&#xff09;模型&#xff09;基本概念特点B/S&#xff08;Browser/Server&#xff09;基本概念特点应用场景 p2p &#xff08;对等网络&#…

这三款使用的视频、图片设计工具,提供工作效率

Videograp Videograp是一款专注于视频生成的工具&#xff0c;特别适合需要快速剪辑和编辑视频的用户。Videograp具备以下特点&#xff1a; 影音比例转换&#xff1a;Videograp支持调整视频的分辨率和比例&#xff0c;使其更适合不同的播放环境和设备。 AI快剪&#xff1a;该工…

超市陈列艺术:不仅仅是货品摆放,更是营销策略的体现

品类管理在门店落地的最直观表现就是单品的空间陈列管理&#xff0c;通过陈列细节的差异体现出门店的商品定位与策略。此文分析入木三分&#xff0c;值得学习。 在商品陈列的空间管理领域&#xff0c;不仅要考虑整体的空间陈列&#xff0c;也要对每个商品的空间陈列位置&#…

旅游行业电商平台:数字化转型的引擎与未来发展趋势

引言 旅游行业数字化转型的背景和重要性 随着信息技术的飞速发展&#xff0c;数字化转型成为各行业发展的必然趋势。旅游行业&#xff0c;作为一个高度依赖信息和服务的领域&#xff0c;数字化转型尤为重要。通过数字化手段&#xff0c;旅游行业能够实现资源的高效配置、服务的…

Apache Doris单机快速安装(已踩坑)

官方文档&#xff1a;https://doris.incubator.apache.org/zh-CN/docs/get-starting/quick-start/ 环境&#xff1a; 操作系统&#xff1a;CentOS7.6 X86_64 JDK&#xff1a;Oracle jdk1.8.0_351 1.版本下载 从 doris.apache.org 下载相应的 Doris 安装包&#xff0c;并且解压…

11.QLoRA微调ChatGLM3-6B

实战 QLoRA 微调 ChatGLM3-6B 大模型 实战 PEFT 库 QLoRA ChatGLM3-6B 微调数据集 AdvertiseGen AdvertiseGen 数据集获取 使用ChatGLM3-6b Tokenizer处理数据 关于ig nore_label_id 的设置&#xff1a; 在许多自然语言处理和机器学习框架中&#xff0c; ig nore_label_id 被…

idea在空工程中添加新模块并测试的步骤

ServicesTest是空的工程&#xff0c;没有pom文件。现在需要在ServicesTest目录下添加新模块作为新的工程&#xff0c;目的是写一下别的技术功能。 原先目录结构&#xff0c;ServicesTest是空的工程&#xff0c;没有pom文件。下面的几个模块是新的工程&#xff0c;相互独立。 1.…

树莓派4B学习笔记8:开机自启动Python脚本_kill关闭后台脚本

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 紧接着上篇文章学习的串口通信,今日学习如何让树莓派开机…

[Algorithm][贪心][柠檬水找零][将数组和减半的最少操作次数][最大数][摆动序列]详细讲解

目录 1.柠檬水找零1.题目链接2.算法原理详解3.代码实现 2.将数组和减半的最少操作次数1.题目链接2.算法原理详解3.代码实现 3.最大数1.题目链接2.算法原理详解3.代码实现 4.摆动序列1.题目链接2.算法原理详解3.代码实现 1.柠檬水找零 1.题目链接 柠檬水找零 2.算法原理详解 …

网络安全 - ARP 欺骗原理+实验

APR 欺骗 什么是 APR 为什么要用 APR A P R \color{cyan}{APR} APR&#xff08;Address Resolution Protocol&#xff09;即地址解析协议&#xff0c;负责将某个 IP 地址解析成对应的 MAC 地址。 在网络通信过程中会使用到这两种地址&#xff0c;逻辑 IP 地址和物理 MAC 地址&…

短剧APP小程序开发之小程序内存管理挑战:短剧缓存与释放策略探讨(第二篇)

在上一篇帖子中&#xff0c;我们探讨了小程序内存管理的限制以及缓存策略的设计。本篇将进一步探讨释放策略的具体实现以及优化方案&#xff0c;以支持大量短剧内容的加载和播放。 释放策略的具体实现 监听内存警告&#xff1a;小程序提供了监听内存警告的API&#xff0c;开发…

【PL理论】(22) 函数式语言:多参数 | 柯里化 (Currying) : 将多参数函数实现为返回一个函数的函数

&#x1f4ad; 写在前面&#xff1a;本章我们将继续讲解函数式语言&#xff0c;介绍多参数&#xff0c;着重讲解柯里化的概念&#xff0c;将多参数函数实现为返回一个函数的函数。 目录 0x00 多参数&#xff08;Multiple Arguments&#xff09; 0x01 柯里化&#xff08;Curr…

Android framework的Zygote源码分析

文章目录 Android framework的Zygote源码分析linux的fork Android framework的Zygote源码分析 init.rc 在Android系统中&#xff0c;zygote是一个native进程&#xff0c;是Android系统上所有应用进程的父进程&#xff0c;我们系统上app的进程都是由这个zygote分裂出来的。zyg…

AI虚拟试穿技术:开启高保真、多场景、多样化服装组合的试穿应用

随着电子商务的快速发展,消费者对于在线购物体验的要求越来越高。特别是在服装领域,消费者渴望能够在购买前直观地了解服装的试穿效果。传统的虚拟试穿技术虽然已有一定的发展,但在不同场景下的高保真度和鲁棒性方面仍面临挑战。为此,我们研发了一种全新的AI虚拟试穿技术,…

电脑开机之后要很久才能进入系统?进入WinPE也是卡顿半天?

前言 小白最近接到了一张很奇怪的电脑维修单&#xff0c;客户说他的工作室电脑开机特别慢&#xff0c;开机之后特别卡顿&#xff0c;在使用的时候也会一卡一卡的。 这事情开始看很简单&#xff1a;估计就是电脑还是机械硬盘&#xff0c;所以开机很慢又卡顿。所以应该是把机械…

vi/vim使用命令

你是否在编辑文件时以为键盘坏了&#xff0c;为什么不能删除呢&#xff0c;为什么不能敲代码呢&#xff0c;等你初识vi&#xff0c;会觉得这个东西为什么设计得这么难用&#xff0c;这篇教程带你熟练得用上这款经典的工具 Vi 是在 Unix 系统上广泛使用的编辑器&#xff0c;Vim …