【人工智能Ⅰ】实验8:DBSCAN聚类实验

实验8 DBSCAN聚类实验

一、实验目的

学习DBSCAN算法基本原理,掌握算法针对不同形式数据如何进行模型输入,并结合可视化工具对最终聚类结果开展分析。

二、实验内容

1:使用DBSCAN算法对iris数据集进行聚类算法应用。

2:使用DBSCAN算法对blob数据集进行聚类算法应用。

3:使用DBSCAN算法对flower_data数据集进行聚类算法应用。

三、实验结果与分析

【iris数据集的聚类】

1:调用DBSCAN进行聚类

在任务1中,需要分别对Sepal和Petal进行聚类。此处使用【sklearn】库中的DBSCAN封装包进行调用,选定初始参数eps = 0.5(领域的半径)、min_samples = 3(领域内最少包括的同类数据个数),采用fit方法进行模型训练,最后得到训练标签为【dbscan_sepal.labels_】和【dbscan_petal.labels_】。整体代码如下图所示。

2:绘出聚类前后的图

在任务2中,定义了图的大小和4个子图,分别用于显示花萼聚类前、花萼聚类后、花瓣聚类前、花瓣聚类后的聚类散点图,以便显示DBSCAN算法聚类前后的效果。整体代码如下图所示。

【子图1:原始的Sepal散点图】

【子图2:聚类后的Sepal散点图】

【子图3:原始的Petal散点图】

【子图4:聚类后的Petal散点图】

程序输出结果如下图所示。与K-means算法相比,数据集采用DBSCAN算法聚类后,Sepal的类别个数为1,Petal的类别个数为2。因为DBSCAN是根据密度进行聚类且无法设置预期的聚类类别个数,同时Sepal中整个数据点的分布是较为均匀的,因此Sepal的最终聚类个数为1;而Petal中整个数据点的分布主要集中在左下角和右上角,因此Petal的最终聚类个数为2。

3:计算并输出轮廓系数和ARI

在任务3中,利用【from sklearn.metrics import silhouette_score】和【from sklearn.metrics import adjusted_rand_score】从评价指标中调用轮廓系数和ARI,输入数据集本身的特征值和DBSCAN算法聚类得到的标签,进行对比后输出轮廓系数和ARI的结果。整体代码如下图所示。

程序输出结果如下图所示。可以看到DBSCAN算法计算出来的花萼聚类的轮廓系数为0.43左右、花瓣聚类的轮廓系数为0.77左右。同时,DBSCAN算法计算出来的花萼聚类的ARI为0.00左右、花瓣聚类的ARI为0.57左右。而在上一次的实验中,K-means算法计算出来的花萼聚类的ARI为0.60左右、花瓣聚类的ARI为0.89左右。

综上所述,针对iris数据集而言,K-means算法的表现比DBSCAN算法的表现更好,因为K-means算法的ARI明显高于DBSCAN算法的ARI。

【blob数据集的聚类】

0:输出数据集的基本信息

在读入数据集的文本文件后,直接打印每一行的特征信息。整体代码如下图所示。

程序的输出结果如下图所示。其中第一列是特征1,第二列是特征2,第三列是类别标签。

1:调用DBSCAN进行聚类

在任务1中,需要对blob数据集进行聚类。此处使用【sklearn】库中的DBSCAN封装包进行调用,选定初始参数eps = 0.3(领域的半径)、min_samples = 10(领域内最少包括的同类数据个数),采用fit方法进行模型训练,最后得到训练标签为【dbscan_labels】。整体代码如下图所示。

2:绘出DBSCAN算法聚类前后的图

在任务2中,定义了图的大小和2个子图,分别用于显示blob数据集聚类前、聚类后的散点图,以便显示DBSCAN算法聚类前后的效果。整体代码如下图所示。

程序输出结果如下图所示。其中,True Labels对应原始blob数据,DBSCAN Clustering对应采用DBSCAN算法聚类后的blob数据。

3:调用K-means进行聚类

在任务3中,需要对blob数据集进行聚类。此处使用【sklearn】库中的KMeans封装包进行调用,选定初始的聚类数目为2,采用fit方法进行模型训练,最后得到训练标签为【kmeans.labels_】。整体代码如下图所示。

4:绘出K-means算法聚类前后的图

在任务4中,定义了图的大小和2个子图,分别用于显示blob数据集聚类前、聚类后的散点图,以便显示DBSCAN算法聚类前后的效果。整体代码如下图所示。

程序输出结果如下图所示。其中,True Labels对应原始blob数据,KMeans Clustering对应采用K-means算法聚类后的blob数据。

5:分别计算并输出K-means算法和DBSCAN算法聚类后的轮廓系数

在任务5中,利用【from sklearn.metrics import silhouette_score】从评价指标中调用轮廓系数,输入数据集本身的标签和聚类算法得到的标签,进行对比后输出轮廓系数的结果。整体代码如下图所示。

程序输出结果如下图所示。可以看到计算出来的K-means算法聚类后的轮廓系数为0.48左右,而DBSCAN算法聚类后的轮廓系数为0.32左右。

6:分别计算并输出K-means算法和DBSCAN算法聚类后的Calinski-Harabasz指数

在任务6中,利用【from sklearn.metrics import calinski_harabasz_score】从评价指标中调用Calinski-Harabasz指数,输入数据集本身的标签和聚类算法得到的标签,进行对比后输出Calinski-Harabasz指数的结果。整体代码如下图所示。

程序输出结果如下图所示。可以看到计算出来的K-means算法聚类后的Calinski-Harabasz指数为291.22左右,而DBSCAN算法聚类后的Calinski-Harabasz指数为127.23左右。

7:分别计算并输出K-means算法和DBSCAN算法聚类后的ARI

在任务7中,利用【from sklearn.metrics import adjusted_rand_score】从评价指标中调用ARI,输入数据集本身的标签和聚类算法得到的标签,进行对比后输出ARI的结果。整体代码如下图所示。

程序输出结果如下图所示。可以看到计算出来的K-means算法聚类后的ARI为0.22左右,而DBSCAN算法聚类后的ARI为1.0。

综上所述,针对blob数据集而言,DBSCAN算法的表现比K-means算法的表现更好,因为K-means算法的ARI明显低于DBSCAN算法的ARI。

【flower_data数据集的聚类】

0:数据集的文件结构

    如下图所示,数据集根目录下共分为5类图像,分别是daisy、dandelion、roses、sunfls、tulips。

1:向程序导入数据集图像

在任务1中,首先利用dadaset_path变量存储数据集的路径,然后利用循环遍历每一个根据类别创建的子文件夹,利用cv2.imread读取图像,并将非空的子文件夹的名称添加到label中。整体代码如下图所示。

2:提取图像特征

    在任务2中,定义使用色彩直方图作为图像的特征并提取特征的函数extract_color_histogram(),并让存储图像的列表image_list中的每一张图片调用该特征提取函数。整体代码如下图所示。

3:数据标准化

    在任务3中,使用numpy中的array,对提取出来的特征向量进行标准化操作。整体代码如下图所示。

4:使用PCA降维

    在任务4中,由于图像的特征通道非常多,而要在二维聚类散点图中体现数据的分布,所以需要将原始的图像特征维数降低至2。整体代码如下图所示。

5:采用K-means算法进行聚类

在任务5中,需要对flower数据集进行聚类。此处使用【sklearn】库中的KMeans封装包进行调用,选定初始的聚类数目为5,采用fit方法进行模型训练,最后得到训练标签为【kmeans.labels_】。整体代码如下图所示。

6:采用DBSCAN算法进行聚类


在任务6中,需要对flower数据集进行聚类。此处使用【sklearn】库中的DBSCAN封装包进行调用,选定初始参数eps = 0.1(领域的半径)、min_samples = 50(领域内最少包括的同类数据个数),采用fit方法进行模型训练,最后得到训练标签为【kmeans.labels_】。整体代码如下图所示。

在任务6中,定义了图的大小,并定义了3个子图,分别用于显示聚类前、采用K-means算法聚类后、采用DBSCAN算法聚类后的散点图。整体代码如下图所示。

【子图1:原始数据的散点图】

【子图2:采用K-means算法聚类后散点图】

【子图3:采用DBSCAN算法聚类后散点图】

程序输出结果如下图所示。可以发现K-Means算法将数据点切成了5块(主要依靠降维后的2个特征进行分割),而DBSCAN算法根据密度将数据点分成了2块(高密度为红色,低密度为紫色)。

四、遇到的问题和解决方法

问题1:在一开始对菜单功能采用整型变量接受用户输入的信息的方法进行设定的时候,如果用户输入非数字的信息,则程序会出现报错,即无法将str信息成功转换为int信息。程序部分代码如图1所示,程序报错信息如图2所示。

解决1:将接收信息的number变量直接定义为string类型,然后在if-else判断组语句中,将数字也变为字符格式。修改的程序部分代码如图1所示,程序完整性检测如图2所示。


问题2:在处理flower数据集的时候,画图中无法将标签进行读取。具体报错如下图所示。

解决2:在画图之前建立标签映射,把每个类别的字符串标签映射到一种颜色中。具体代码如下图所示。

五、实验总结

1:DBSCAN算法的特点主要分为以下几个方面。

  1. 基于数据点的密度进行聚类:DBSCAN是一种基于数据点密度的聚类算法,不需要事先指定聚类的数量。它通过定义一个密度阈值来确定邻域内的数据点数量,从而将数据点分为核心点、边界点和噪声点。
  2. 能够发现任意形状的聚类:与K均值等算法不同,DBSCAN能够找到各种形状的聚类,包括非凸形状的聚类。
  3. 噪声容忍性:DBSCAN能够有效地处理噪声数据点,将它们识别为噪声点而不将其分配给任何聚类。
  4. 无需事先指定聚类数量:DBSCAN不需要用户事先指定聚类的数量,因为它根据数据的密度自动确定聚类的数量。
  5. 适用于不均匀分布的数据:DBSCAN适用于不同密度的数据集,能够有效地识别密集区域和稀疏区域中的聚类。
  6. 簇的连接性:DBSCAN通过将具有足够密度的核心点连接起来来形成聚类,从而保持了簇内数据点的连接性。

2:DBSCAN算法和K-means算法的区别主要分为以下几个方面。

  1. 聚类方式:K-means算法将数据点分成K个互不重叠的簇,每个簇的中心由簇内数据点的均值计算得出。K均值需要事先指定聚类的数量K。DBSCAN算法不需要事先指定聚类数量,而是通过定义邻域的方式,将数据点划分为核心点、边界点和噪声点。
  2. 对噪声的处理:K-means算法对噪声数据点敏感,离其他簇很远的噪声点也会分配到某一个簇。DBSCAN算法能够有效处理噪声数据点,不将簇外的噪声点分配给任何聚类。
  3. 聚类形状:K-means算法假定聚类是球状的,每个簇的中心是数据点的平均值,因此对于非球形簇效果不佳。DBSCAN算法由于自身基于数据点的密度的特点,所以能够发现不同形状的聚类,包括非凸形状的聚类。

六、程序源代码

【1:iris数据集 + blob数据集】

import matplotlib.pyplot as plt

from sklearn import datasets

from sklearn.cluster import DBSCAN

from sklearn.cluster import KMeans

import numpy as np

import pandas as pd

from sklearn.metrics import silhouette_score

from sklearn.metrics import calinski_harabasz_score

from sklearn.metrics import adjusted_rand_score

def print_data(want_print, print_iris):

    """

    展示iris的数据

    :return: None

    """

    print("iris{0}:\n{1}".format(want_print, print_iris))

    print("=" * 85)

def blob():

    color_list = ['#4daf4a', '#984ea3', '#dede00']

    # blobs = datasets.make_moons(n_samples=200, noise=0.05,  random_state=42)

    blobs = np.loadtxt(r'C:\Users\86158\Desktop\blobs.txt')

   

    # 打印整个blob数据

    print("Blob的数据如下所示:")

    for row in blobs:

        print(row)

   

    X = blobs[:,:2]

    y = blobs[:,-1].astype(int)

    color_y = [color_list[y[i]] for i in range(len(X))]

    # 调用Scikit-learn函数库中的DBSCAN模块进行聚类

    dbscan = DBSCAN(eps=0.3, min_samples=10)

   

    # 使用Blobs.txt数据(也可以使用上次的文本和图片数据)

    dbscan_labels = dbscan.fit_predict(X)

    # 绘出聚类前后的图

    plt.figure(figsize=(12, 5))

    """before clustering"""

    plt.subplot(1, 2, 1)

    plt.scatter(X[:, 0], X[:, 1], c=color_y, marker='o', edgecolor='k', s=40, label='True Labels')

    plt.title('True Labels')

    plt.legend()

    """after clustering"""

    plt.subplot(1, 2, 2)

    plt.scatter(X[:, 0], X[:, 1], c=dbscan_labels, marker='o', edgecolor='k', s=40, cmap=plt.cm.Paired)

    plt.title('DBSCAN Clustering')

    plt.show()

   

   

    """

    相同的数据集,与K-means进行比较

    即比较两个聚类方法在非球形聚集的数据集上的表现

    """

   

    # 调用Scikit-learn函数库中的kmeans模块进行聚类

    kmeans = KMeans(n_clusters=2)

   

    # 使用Blobs.txt数据(也可以使用上次的文本和图片数据)

    kmeans.fit(X)

    kmeans_labels = kmeans.labels_

   

    # 绘出聚类前后的图

    plt.figure(figsize=(12, 5))

    """before clustering"""

    plt.subplot(1, 2, 1)

    plt.scatter(X[:, 0], X[:, 1], c=color_y, marker='o', edgecolor='k', s=40, label='True Labels')

    plt.title('True Labels')

    plt.legend()

    """after clustering"""

    plt.subplot(1, 2, 2)

    plt.scatter(X[:, 0], X[:, 1], c=kmeans_labels, marker='o', edgecolor='k', s=40, cmap=plt.cm.Paired)

    plt.title('KMeans Clustering')

    plt.show()

   

    """

    对二者的metrics进行对比

        1:轮廓系数

            度量了样本与其所分配的簇之间的相似性和不相似性。

            对于每个样本,它计算了与同一簇中其他样本的相似性与与最接近的其他簇中的样本的不相似性之间的差异。

            轮廓系数的取值范围在[-1, 1]之间,值越接近1表示聚类效果越好。

        2Calinski-Harabasz指数(方差比准则)

            度量了簇内的差异性与簇间的相似性之间的比率。

            较高的指数值表示聚类效果较好。

        3ARIAdjusted Rand Index

            考虑了聚类结果与真实标签之间的一致性。

    """

    print()

   

    # KMeansDBSCAN的聚类结果计算轮廓系数

    silhouette_kmeans = silhouette_score(X, kmeans_labels)

    silhouette_dbscan = silhouette_score(X, dbscan_labels)

    print("轮廓系数比较(Silhouette Score")

    print("KMeans:", silhouette_kmeans)

    print("DBSCAN:", silhouette_dbscan)

    print()

    # KMeansDBSCAN的聚类结果计算Calinski-Harabasz指数

    calinski_kmeans = calinski_harabasz_score(X, kmeans_labels)

    calinski_dbscan = calinski_harabasz_score(X, dbscan_labels)

    print("Calinski-Harabasz指数比较(Calinski-Harabasz Index")

    print("KMeans:", calinski_kmeans)

    print("DBSCAN:", calinski_dbscan)

    print()

    # 计算KMeansDBSCANARI

    ari_kmeans = adjusted_rand_score(y, kmeans_labels)

    ari_dbscan = adjusted_rand_score(y, dbscan_labels)

    print("ARI指数比较(Adjusted Rand Index")

    print("KMeans:", ari_kmeans)

    print("DBSCAN:", ari_dbscan)

    print()

def iris():

    # 导入iris数据

    iris = datasets.load_iris()

    # 展示iris真实数据

    print_data(want_print="数据", print_iris=iris.data)

    # 展示iris特征名字

    print_data(want_print="特征名字", print_iris=iris.feature_names)

    # 展示目标值

    print_data(want_print="目标值", print_iris=iris.target)

    # 展示目标值的名字

    print_data(want_print="目标值的名字", print_iris=iris.target_names)

    # 为了便于使用,将iris数据转换为pandas库数据结构,并设立列的名字

    # iris数据转为pandas数据结构

    x = pd.DataFrame(iris.data)

    # iris数据的名字设为‘Sepal_Length’‘Sepal_Width’‘Sepal_Width’‘Petal_Width’

    x.columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width']

    # iris目标值也转为pandas数据结构

    y = pd.DataFrame(iris.target)

    # iris目标值得名字设为‘Targets’

    y.columns = ['Targets']

   

    # dbscan for iris

   

    # 创建一个DBSCAN模型并进行花萼聚类

    dbscan_sepal = DBSCAN(eps=0.5, min_samples=3)

    dbscan_sepal.fit(x[['Sepal_Length', 'Sepal_Width']])

    x['Sepal_DBSCAN_Cluster'] = dbscan_sepal.labels_

    # 创建一个DBSCAN模型并进行花瓣聚类

    dbscan_petal = DBSCAN(eps=0.5, min_samples=3)

    dbscan_petal.fit(x[['Petal_Length', 'Petal_Width']])

    x['Petal_DBSCAN_Cluster'] = dbscan_petal.labels_

    # 绘制DBSCAN花萼聚类结果

    plt.figure(figsize=(16, 7))

    plt.subplot(2, 2, 1)

    plt.scatter(x['Sepal_Length'], x['Sepal_Width'], c=colormap[y['Targets']], s=40, label='Original Data')

    plt.title('Original Sepal Data')

    plt.subplot(2, 2, 2)

    for cluster in np.unique(x['Sepal_DBSCAN_Cluster']):

        if cluster == -1:  # -1 表示噪声点

            cluster_data = x[x['Sepal_DBSCAN_Cluster'] == cluster]

            plt.scatter(cluster_data['Sepal_Length'], cluster_data['Sepal_Width'], c='gray', s=40, label='Noise')

        else:

            cluster_data = x[x['Sepal_DBSCAN_Cluster'] == cluster]

            plt.scatter(cluster_data['Sepal_Length'], cluster_data['Sepal_Width'], c=colormap[cluster], s=40, label=f'Cluster {cluster}')

    plt.title('Sepal DBSCAN Clustering Overlay')

    plt.legend()

    # 绘制DBSCAN花瓣聚类结果

    plt.subplot(2, 2, 3)

    plt.scatter(x['Petal_Length'], x['Petal_Width'], c=colormap[y['Targets']], s=40, label='Original Data')

    plt.title('Original Petal Data')

    plt.subplot(2, 2, 4)

    for cluster in np.unique(x['Petal_DBSCAN_Cluster']):

        if cluster == -1:  # -1 表示噪声点

            cluster_data = x[x['Petal_DBSCAN_Cluster'] == cluster]

            plt.scatter(cluster_data['Petal_Length'], cluster_data['Petal_Width'], c='gray', s=40, label='Noise')

        else:

            cluster_data = x[x['Petal_DBSCAN_Cluster'] == cluster]

            plt.scatter(cluster_data['Petal_Length'], cluster_data['Petal_Width'], c=colormap[cluster], s=40, label=f'Cluster {cluster}')

    plt.title('Petal DBSCAN Clustering Overlay')

    plt.legend()

    plt.tight_layout()

    plt.show()

    # 计算轮廓系数

    print()

    print("Iris数据集采用DBSCAN算法聚类的轮廓系数:")

    # 计算花萼聚类的轮廓系数

    silhouette_sepal_dbscan = silhouette_score(x[['Sepal_Length', 'Sepal_Width']], x['Sepal_DBSCAN_Cluster'])

    print("Sepal:", silhouette_sepal_dbscan)

    # 计算花瓣聚类的轮廓系数

    silhouette_petal_dbscan = silhouette_score(x[['Petal_Length', 'Petal_Width']], x['Petal_DBSCAN_Cluster'])

    print("Petal:", silhouette_petal_dbscan)

   

    # 计算调整兰德系数

    print()

    print("Iris数据集采用DBSCAN算法聚类的ARI")

    # 计算花萼聚类的ARI

    ari_sepal_dbscan = adjusted_rand_score(iris.target, x['Sepal_DBSCAN_Cluster'])

    print("Sepal:", ari_sepal_dbscan)

    # 计算花瓣聚类的ARI

    ari_petal_dbscan = adjusted_rand_score(iris.target, x['Petal_DBSCAN_Cluster'])

    print("Petal:", ari_petal_dbscan)

    print()

   

def menu():

    while 1:

        print("请根据提示输入这次实验时所调入的数据")

        print("输入1:可调用blob数据")

        print("输入2:可调用iris数据")

        print("输入3:退出DBSCAN实验")

       

        number = input("请输入:")

        if number == '1':

            # blob数据使用dbscan

            blob()

        elif number == '2':

            # iris数据使用dbscan

            iris()

        elif number == '3':

            # 退出系统

            break

        else:

            print("输入数字错误,请重新输入")

            print()

       

    print("谢谢使用")

    print()

if __name__ == '__main__':

    # 创建色板图

    colormap = np.array(['red', 'lime', 'black'])

    menu()

【2:flower_data数据集】

import numpy as np

import cv2

from sklearn.cluster import DBSCAN, KMeans

from sklearn.decomposition import PCA

import matplotlib.pyplot as plt

import os

# 1. 准备数据和图像

dataset_path = r'C:\Users\86158\Desktop\flower_photos'  # 数据集目录路径

image_list = []  # 用于存储图像的列表

labels = []      # 用于存储标签的列表

for root, dirs, files in os.walk(dataset_path):

    for filename in files:

        if filename.endswith('.jpg'):  # 仅处理.jpg文件

            image_path = os.path.join(root, filename)

            label = os.path.basename(root)  # 获取类别标签

            image = cv2.imread(image_path)  # 读取图像

            if image is not None:

                image_list.append(image)

                labels.append(label)

# 2. 提取图像特征

# 使用色彩直方图作为特征

def extract_color_histogram(image, bins=(8, 8, 8)):

    hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

    hist = cv2.calcHist([hsv_image], [0, 1, 2], None, bins, [0, 180, 0, 256, 0, 256])

    hist = cv2.normalize(hist, hist).flatten()

    return hist

# 提取特征向量

features = []

for img in image_list:

    hist = extract_color_histogram(img)

    features.append(hist)

# 3. 数据标准化

X = np.array(features)

# 4. 使用PCA降维

n_components = 2  # 设置PCA降维后的维度

pca = PCA(n_components=n_components)

X_pca = pca.fit_transform(X)

# 5. 聚类前的散点图按照标签画出

# 创建一个标签到颜色的映射

label_to_color = {label: np.random.rand(3,) for label in set(labels)}

# 使用映射将标签转换为颜色

label_colors = [label_to_color[label] for label in labels]

plt.figure(figsize=(12, 5))

plt.subplot(1, 3, 1)

plt.scatter(X_pca[:, 0], X_pca[:, 1], c=label_colors, cmap='rainbow', marker='o', s=25)

plt.title('Scatter Plot Before Clustering (PCA)')

# 6. 选择K均值聚类算法并进行聚类

kmeans = KMeans(n_clusters=5)

kmeans.fit(X_pca)

cluster_labels_kmeans = kmeans.labels_

# 7. 聚类后的散点图按照标签画出

plt.subplot(1, 3, 2)

plt.scatter(X_pca[:, 0], X_pca[:, 1], c=cluster_labels_kmeans, cmap='rainbow', marker='o', s=25)

plt.title('K-means Clustering (PCA)')

# 8. 使用DBSCAN聚类算法

dbscan = DBSCAN(eps=0.1, min_samples=50)

cluster_labels_dbscan = dbscan.fit_predict(X_pca)

# 9. 聚类后的散点图按照标签画出

plt.subplot(1, 3, 3)

plt.scatter(X_pca[:, 0], X_pca[:, 1], c=cluster_labels_dbscan, cmap='rainbow', marker='o', s=25)

plt.title('DBSCAN Clustering (PCA)')

plt.tight_layout()

plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

感知机(perceptron)

一、感知机 1、相关概念介绍 感知机(perceptron)是二分类的线性分类模型,属于监督学习算法。输入为实例的特征向量,输出为实例的类别(取1和-1)。 2、(单层)感知机存在的问题 感知机…

自动化测试、压力测试、持续集成

因为项目的原因,前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api。下面将研究的成果展示给大家,希望对需要的人有所帮助。 SoapUI 是什么? SoapUI 是一个开源测试工具,通过 soap/http 来检查、调用、实现 Web Service …

【Jmeter】Jmeter基础5-Jmeter元件介绍之线程(用户)

2.5.1、线程组 一个线程组即一个虚拟用户组,线程组中的每个线程即为1个虚拟用户,每个线程互相隔离,互不影响参数说明: 在取样器错误后要执行的动作 继续:忽略错误,继续执行启动下一进程循环: 终…

【ARM Trace32(劳特巴赫) 使用介绍 6 -- 通用寄存器查看与修改】

请阅读【Trace32 ARM 专栏导读】 文章目录 通用寄存器查看与修改Rester 命令语法Register.InitRegister.RELOAD高亮显示Register变化的值多核寄存器显示设置寄存器的值修改 通用寄存器查看与修改 在使用Trace32进行调试时,有时候需要查看并修改通用寄存器、PC指针、…

Json数据报文解析-Gson库-JsonObject类-JsonParse类-JsonArray类

一、前言 本文我们将介绍如何解析Json数据,主要通过Gson库中的相关类来实现。 二、详细步骤 首先,我们要拿到一个基础的Json数据,这里将以下面的Json数据作为示例: {"code":"1","msg":"ok&q…

RFID复习内容整理

第一章 日常生活中的RFID技术 身份证(高频) typeB13.56MHz 一卡通(高频) ISO/IEC 14443 typeA 图书馆门禁停车场门票ETC 微波段、超高频 服装快销品牌 物联网定义 最初的定义 将各种信息传感设备,如射频识别(RFID)…

HarmonyOS(二)—— 初识ArkTS开发语言(下)之ArkTS声明式语法和组件化基础

前言: 通过前面ArkTS开发语言(上)之TypeScript入门以及ArkTS开发语言(中)之ArkTS的由来和演进俩文我们知道了ArkTS的由来以及演进,知道了ArkTS具备了声明式语法和组件化特性,今天,搭…

持续集成交付CICD:Jenkins使用GitLab共享库实现自动上传前后端项目Nexus制品

目录 一、实验 1.GitLab本地导入前后端项目 2.Jenkins新建前后端项目流水线 3.Sonarqube录入质量阈与质量配置 4.修改GitLab共享库代码 5.Jenkins手动构建前后端项目流水线 6.Nexus查看制品上传情况 7.优化代码获取RELEASE分支 8.优化Jenkins流水线项目名称 一、实验 …

Qt槽函数不响应不执行的一种原因:ui提升导致重名

背景: 一个包含了组件提升的ui,有个按钮的槽函数就是不响应,于是找原因。 分析: 槽函数的对应一是通过connect函数绑定信号,二是on_XXX_signal的命名方式。界面上部件的槽函数通常是第二种。 我反复确认细节&#…

CS144(2023 Spring)Lab 0:networking warmup(环境搭建 webget bytestream)

文章目录 前言其他笔记相关链接 1. Set up GNU/Linux on your computer2. Networking by hand3. Writing a network program using an OS stream socket3.1 Linux配置3.2 C规范3.3 Writing webget3.3.1 实现3.3.2 测试 4. An in-memory reliable byte stream4.1 思路分析4.2 代…

【技巧】导出和导入Typecho的文章数据

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 背景介绍 1、要换服务器了,虽然Typecho和Theme都可以重装,但文章数据由于是存在数据库里的,所以需要额外一些操作才行。 2、在进行下面的数据导入导出之前,新服务器…

微服务的利与弊

一、前言 自从大多数web架构从单体演进到服务拆分,到微服务一统天下的几年来,应该没有web应用不是微服务架构的吧。最开始是阿里的doubble分层架构,到后来的SpringCloud全家桶,还有各个大厂自己定义的一套服务治理框架。微服务无…

项目一 分析并设计学生管理数据库

项目一 分析并设计学生管理数据库 1,做好管理数据库的知识准备 1.1,初识数据库 **1,DBMS:**数据库管理系统(Database Management System)。数据库 是通过DBMS创建和操作的 容器。 **2,DB:**数据库(data…

PR剪辑视频做自媒体添加字幕快速方式(简单好用的pr视频字幕模板)

如何选择合适的字幕添加进短视频呢?首先要先确定增加的视频风格,简约、商务、科技感、炫酷;再确定用途,注释、标记、语音翻译、引用、介绍;最后在相应的模板中挑选几个尝试,悬着一个最切合主题的使用&#…

jemeter,断言:响应断言、Json断言

一、响应断言 接口A请求正常返回值如下: {"status": 10013, "message": "user sign timeout"} 在该接口下创建【响应断言】元件,配置如下: 若断言成功,则查看结果树的接口显示绿色,若…

如何想成为嵌入式工程师?(这些东西您必须知道)

嵌入式的发展怎么样? 嵌入式系统领域一直在迅速发展,伴随着物联网、智能设备、汽车电子、医疗设备等应用的不断增加,对嵌入式技术的需求也在不断扩大。因此,嵌入式领域仍然是一个充满机会的领域,为专业人士提供…

Axure网页端高交互组件库, 下拉菜单文件上传穿梭框日期城市选择器

作品说明 组件数量:共 11 套 兼容软件:Axure RP 9/10,不支持低版本 应用领域:web端原型设计、桌面端原型设计 作品特色 本作品为「web端组件库」,高保真高交互 (带仿真功能效果);运用了动态面板、中继…

做数据分析为何要学统计学(6)——什么问题适合使用卡方检验?

卡方检验作为一种非常著名的非参数检验方法(不受总体分布因素的限制),在工程试验、临床试验、社会调查等领域被广泛应用。但是也正是因为使用的便捷性,造成时常被误用。本文参阅相关的文献,对卡方检验的适用性进行粗浅…

【力扣】2.两数相加

2.两数相加 这是第二题,还行豁~。 题解: 首先就是对题目的理解。这里你要知道两链表中数字的排列都是逆序的,也就是说示例一中2-4-3他原本的数字应该是342。同理可得下面链表的意思,二者相加所得到的结果也是逆序的,…

一张图片组合一组动作就可以生成毫无违和感的视频!

你敢信,1张人物图片 1张动作动画,就可以生成一段视频。网友直呼:“主播/视频UP主可能快要下岗了!” (模型视频来源于网络) 本周,字节跳动联合新加坡国立大学发布了一款开源项目 MagicAnimate&…