聚类算法(上):8个常见的无监督聚类方法介绍和比较

news2024/9/23 17:24:56

无监督聚类方法的评价指标必须依赖于数据和聚类结果的内在属性,例如聚类的紧凑性和分离性,与外部知识的一致性,以及同一算法不同运行结果的稳定性。

本文将全面概述Scikit-Learn库中用于的聚类技术以及各种评估方法。

本文将分为2个部分,1、常见算法比较 2、聚类技术的各种评估方法

本文作为第一部分将介绍和比较各种聚类算法:

  • K-Means
  • Affinity Propagation
  • Agglomerative Clustering
  • Mean Shift Clustering
  • Bisecting K-Means
  • DBSCAN
  • OPTICS
  • BIRCH

首先我们生成一些数据,后面将使用这些数据作为聚类技术的输入。

 importpandasaspd
 importnumpyasnp
 importseabornassns
 importmatplotlib.pyplotasplt
 
 #Set the number of samples and features
 n_samples=1000
 n_features=4
 
 #Create an empty array to store the data
 data=np.empty((n_samples, n_features))
 
 #Generate random data for each feature
 foriinrange(n_features):
   data[:, i] =np.random.normal(size=n_samples)
 
 #Create 5 clusters with different densities and centroids
 cluster1=data[:200, :] +np.random.normal(size=(200, n_features), scale=0.5)
 cluster2=data[200:400, :] +np.random.normal(size=(200, n_features), scale=1) +np.array([5,5,5,5])
 cluster3=data[400:600, :] +np.random.normal(size=(200, n_features), scale=1.5) +np.array([-5,-5,-5,-5])
 cluster4=data[600:800, :] +np.random.normal(size=(200, n_features), scale=2) +np.array([5,-5,5,-5])
 cluster5=data[800:, :] +np.random.normal(size=(200, n_features), scale=2.5) +np.array([-5,5,-5,5])
 
 #Combine the clusters into one dataset
 X=np.concatenate((cluster1, cluster2, cluster3, cluster4, cluster5))
 
 # Plot the data
 plt.scatter(X[:, 0], X[:, 1])
 plt.show()

结果如下:

我们将用特征值和簇ID创建一个DF。稍后在模型性能时将使用这些数据。

 df=pd.DataFrame(X, columns=["feature_1", "feature_2", "feature_3", "feature_4"])
 cluster_id=np.concatenate((np.zeros(200), np.ones(200), np.full(200, 2), np.full(200, 3), np.full(200, 4)))
 df["cluster_id"] =cluster_id
 df

现在我们将构建和可视化8个不同的聚类模型:

1、K-Means

K-Means聚类算法是一种常用的聚类算法,它将数据点分为K个簇,每个簇的中心点是其所有成员的平均值。K-Means算法的核心是迭代寻找最优的簇心位置,直到达到收敛状态。

K-Means算法的优点是简单易懂,计算速度较快,适用于大规模数据集。但是它也存在一些缺点,例如对于非球形簇的处理能力较差,容易受到初始簇心的选择影响,需要预先指定簇的数量K等。此外,当数据点之间存在噪声或者离群点时,K-Means算法可能会将它们分配到错误的簇中。

 #K-Means
 fromsklearn.clusterimportKMeans
 
 #Define function:
 kmeans=KMeans(n_clusters=5)
 
 #Fit the model:
 km=kmeans.fit(X)
 km_labels=km.labels_
 
 #Print results:
 #print(kmeans.labels_)
 
 #Visualise results:
 plt.scatter(X[:, 0], X[:, 1], 
             c=kmeans.labels_,      
             s=70, cmap='Paired')
 plt.scatter(kmeans.cluster_centers_[:, 0],
             kmeans.cluster_centers_[:, 1],
             marker='^', s=100, linewidth=2, 
             c=[0, 1, 2, 3, 4])

2、Affinity Propagation

Affinity Propagation是一种基于图论的聚类算法,旨在识别数据中的"exemplars"(代表点)和"clusters"(簇)。与K-Means等传统聚类算法不同,Affinity Propagation不需要事先指定聚类数目,也不需要随机初始化簇心,而是通过计算数据点之间的相似性得出最终的聚类结果。

Affinity Propagation算法的优点是不需要预先指定聚类数目,且能够处理非凸形状的簇。但是该算法的计算复杂度较高,需要大量的存储空间和计算资源,并且对于噪声点和离群点的处理能力较弱。

 fromsklearn.clusterimportAffinityPropagation
 
 #Fit the model:
 af=AffinityPropagation(preference=-563, random_state=0).fit(X)
 cluster_centers_indices=af.cluster_centers_indices_
 af_labels=af.labels_
 n_clusters_=len(cluster_centers_indices)
 
 #Print number of clusters:
 print(n_clusters_)
 
 importmatplotlib.pyplotasplt
 fromitertoolsimportcycle
 
 plt.close("all")
 plt.figure(1)
 plt.clf()
 
 colors=cycle("bgrcmykbgrcmykbgrcmykbgrcmyk")
 fork, colinzip(range(n_clusters_), colors):
     class_members=af_labels==k
     cluster_center=X[cluster_centers_indices[k]]
     plt.plot(X[class_members, 0], X[class_members, 1], col+".")
     plt.plot(
         cluster_center[0],
         cluster_center[1],
         "o",
         markerfacecolor=col,
         markeredgecolor="k",
         markersize=14,
     )
     forxinX[class_members]:
         plt.plot([cluster_center[0], x[0]], [cluster_center[1], x[1]], col)
 
 plt.title("Estimated number of clusters: %d"%n_clusters_)
 plt.show()

3、Agglomerative Clustering

凝聚层次聚类(Agglomerative Clustering)是一种自底向上的聚类算法,它将每个数据点视为一个初始簇,并将它们逐步合并成更大的簇,直到达到停止条件为止。在该算法中,每个数据点最初被视为一个单独的簇,然后逐步合并簇,直到所有数据点被合并为一个大簇。

Agglomerative Clustering算法的优点是适用于不同形状和大小的簇,且不需要事先指定聚类数目。此外,该算法也可以输出聚类层次结构,便于分析和可视化。缺点是计算复杂度较高,尤其是在处理大规模数据集时,需要消耗大量的计算资源和存储空间。此外,该算法对初始簇的选择也比较敏感,可能会导致不同的聚类结果。

 fromsklearn.clusterimportAgglomerativeClustering
 
 #Fit the model:
 clustering=AgglomerativeClustering(n_clusters=5).fit(X)
 
 AC_labels=clustering.labels_
 n_clusters=clustering.n_clusters_
 
 print("number of estimated clusters : %d"%clustering.n_clusters_)
 
 # Plot clustering results
 colors= ['purple', 'orange', 'green', 'blue', 'red']
 
 forindex, metricinenumerate([#"cosine", 
                                 "euclidean", 
                                 #"cityblock"
                                 ]):
     model=AgglomerativeClustering(
         n_clusters=5, linkage="ward", affinity=metric
     )
     model.fit(X)
     plt.figure()
     plt.axes([0, 0, 1, 1])
     forl, cinzip(np.arange(model.n_clusters), colors):
         plt.plot(X[model.labels_==l].T, c=c, alpha=0.5)
     plt.axis("tight")
     plt.axis("off")
     plt.suptitle("AgglomerativeClustering(affinity=%s)"%metric, size=20)
 
 
 plt.show()

4、Mean Shift Clustering

Mean Shift Clustering是一种基于密度的非参数聚类算法,其基本思想是通过寻找数据点密度最大的位置(称为"局部最大值"或"高峰"),来识别数据中的簇。算法的核心是通过对每个数据点进行局部密度估计,并将密度估计的结果用于计算数据点移动的方向和距离。算法的核心是通过对每个数据点进行局部密度估计,并将密度估计的结果用于计算数据点移动的方向和距离。

Mean Shift Clustering算法的优点是不需要指定簇的数目,且对于形状复杂的簇也有很好的效果。算法还能够有效地处理噪声数据。他的缺点也是计算复杂度较高,尤其是在处理大规模数据集时,需要消耗大量的计算资源和存储空间,该算法还对初始参数的选择比较敏感,需要进行参数调整和优化。

 fromsklearn.clusterimportMeanShift, estimate_bandwidth
 
 # The following bandwidth can be automatically detected using
 bandwidth=estimate_bandwidth(X, quantile=0.2, n_samples=100)
 
 #Fit the model:
 ms=MeanShift(bandwidth=bandwidth)
 ms.fit(X)
 MS_labels=ms.labels_
 cluster_centers=ms.cluster_centers_
 
 labels_unique=np.unique(labels)
 n_clusters_=len(labels_unique)
 
 print("number of estimated clusters : %d"%n_clusters_)
 
 fromitertoolsimportcycle
 
 plt.figure(1)
 plt.clf()
 
 colors=cycle("bgrcmykbgrcmykbgrcmykbgrcmyk")
 fork, colinzip(range(n_clusters_), colors):
     my_members=labels==k
     cluster_center=cluster_centers[k]
     plt.plot(X[my_members, 0], X[my_members, 1], col+".")
     plt.plot(
         cluster_center[0],
         cluster_center[1],
         "o",
         markerfacecolor=col,
         markeredgecolor="k",
         markersize=14,
     )
 plt.title("Estimated number of clusters: %d"%n_clusters_)
 plt.show()

5、Bisecting K-Means

Bisecting K-Means是一种基于K-Means算法的层次聚类算法,其基本思想是将所有数据点划分为一个簇,然后将该簇分成两个子簇,并对每个子簇分别应用K-Means算法,重复执行这个过程,直到达到预定的聚类数目为止。

算法首先将所有数据点视为一个初始簇,然后对该簇应用K-Means算法,将该簇分成两个子簇,并计算每个子簇的误差平方和(SSE)。然后,选择误差平方和最大的子簇,并将其再次分成两个子簇,重复执行这个过程,直到达到预定的聚类数目为止。

Bisecting K-Means算法的优点是具有较高的准确性和稳定性,能够有效地处理大规模数据集,并且不需要指定初始聚类数目。该算法还能够输出聚类层次结构,便于分析和可视化。缺点是计算复杂度较高,尤其是在处理大规模数据集时,需要消耗大量的计算资源和存储空间。此外该算法对初始簇的选择也比较敏感,可能会导致不同的聚类结果。

 fromsklearn.clusterimportBisectingKMeans
 
 #Build and fit model:
 bisect_means=BisectingKMeans(n_clusters=5).fit(X)
 BKM_labels=bisect_means.labels_
 
 #Print model attributes:
 #print('Labels: ', bisect_means.labels_)
 print('Number of clusters: ', bisect_means.n_clusters)
 
 #Define varaibles to be included in scatterdot:
 y=bisect_means.labels_
 #print(y)
 centers=bisect_means.cluster_centers_
 
 # Visualize the results using a scatter plot
 plt.scatter(X[:, 0], X[:, 1], c=y)
 plt.scatter(centers[:, 0], centers[:, 1], c='r', s=100)
 
 plt.show()

6、DBSCAN

DBSCAN (Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,其可以有效地发现任意形状的簇,并能够处理噪声数据。DBSCAN算法的核心思想是:对于一个给定的数据点,如果它的密度达到一定的阈值,则它属于一个簇中;否则,它被视为噪声点。

DBSCAN算法的优点是能够自动识别簇的数目,并且对于任意形状的簇都有较好的效果。并且还能够有效地处理噪声数据,不需要预先指定簇的数目。缺点是对于密度差异较大的数据集,可能会导致聚类效果不佳,需要进行参数调整和优化。另外该算法对于高维数据集的效果也不如其他算法

 fromsklearn.clusterimportDBSCAN
 
 db=DBSCAN(eps=3, min_samples=10).fit(X)
 DBSCAN_labels=db.labels_
 
 # Number of clusters in labels, ignoring noise if present.
 n_clusters_=len(set(labels)) - (1if-1inlabelselse0)
 n_noise_=list(labels).count(-1)
 
 print("Estimated number of clusters: %d"%n_clusters_)
 print("Estimated number of noise points: %d"%n_noise_)
 
 unique_labels=set(labels)
 core_samples_mask=np.zeros_like(labels, dtype=bool)
 core_samples_mask[db.core_sample_indices_] =True
 
 colors= [plt.cm.Spectral(each) foreachinnp.linspace(0, 1, len(unique_labels))]
 fork, colinzip(unique_labels, colors):
     ifk==-1:
         # Black used for noise.
         col= [0, 0, 0, 1]
 
     class_member_mask=labels==k
 
     xy=X[class_member_mask&core_samples_mask]
     plt.plot(
         xy[:, 0],
         xy[:, 1],
         "o",
         markerfacecolor=tuple(col),
         markeredgecolor="k",
         markersize=14,
     )
 
     xy=X[class_member_mask&~core_samples_mask]
     plt.plot(
         xy[:, -1],
         xy[:, 1],
         "o",
         markerfacecolor=tuple(col),
         markeredgecolor="k",
         markersize=6,
     )
 
 plt.title(f"Estimated number of clusters: {n_clusters_}")
 plt.show()

7、OPTICS

OPTICS(Ordering Points To Identify the Clustering Structure)是一种基于密度的聚类算法,其能够自动确定簇的数量,同时也可以发现任意形状的簇,并能够处理噪声数据。OPTICS算法的核心思想是:对于一个给定的数据点,通过计算它到其它点的距离,确定其在密度上的可达性,从而构建一个基于密度的距离图。然后,通过扫描该距离图,自动确定簇的数量,并对每个簇进行划分。

OPTICS算法的优点是能够自动确定簇的数量,并能够处理任意形状的簇,并能够有效地处理噪声数据。该算法还能够输出聚类层次结构,便于分析和可视化。缺点是计算复杂度较高,尤其是在处理大规模数据集时,需要消耗大量的计算资源和存储空间。另外就是该算法对于密度差异较大的数据集,可能会导致聚类效果不佳。

 fromsklearn.clusterimportOPTICS
 importmatplotlib.gridspecasgridspec
 
 #Build OPTICS model:
 clust=OPTICS(min_samples=3, min_cluster_size=100, metric='euclidean')
 
 # Run the fit
 clust.fit(X)
 
 space=np.arange(len(X))
 reachability=clust.reachability_[clust.ordering_]
 OPTICS_labels=clust.labels_[clust.ordering_]
 labels=clust.labels_[clust.ordering_]
 
 plt.figure(figsize=(10, 7))
 G=gridspec.GridSpec(2, 3)
 ax1=plt.subplot(G[0, 0])
 ax2=plt.subplot(G[1, 0])
 
 
 # Reachability plot
 colors= ["g.", "r.", "b.", "y.", "c."]
 forklass, colorinzip(range(0, 5), colors):
     Xk=space[labels==klass]
     Rk=reachability[labels==klass]
     ax1.plot(Xk, Rk, color, alpha=0.3)
 ax1.plot(space[labels==-1], reachability[labels==-1], "k.", alpha=0.3)
 ax1.set_ylabel("Reachability (epsilon distance)")
 ax1.set_title("Reachability Plot")
 
 # OPTICS
 colors= ["g.", "r.", "b.", "y.", "c."]
 forklass, colorinzip(range(0, 5), colors):
     Xk=X[clust.labels_==klass]
     ax2.plot(Xk[:, 0], Xk[:, 1], color, alpha=0.3)
 ax2.plot(X[clust.labels_==-1, 0], X[clust.labels_==-1, 1], "k+", alpha=0.1)
 ax2.set_title("Automatic Clustering\nOPTICS")
 
 
 plt.tight_layout()
 plt.show()

8、BIRCH

BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)是一种基于层次聚类的聚类算法,其可以快速地处理大规模数据集,并且对于任意形状的簇都有较好的效果。BIRCH算法的核心思想是:通过对数据集进行分级聚类,逐步减小数据规模,最终得到簇结构。BIRCH算法采用一种类似于B树的结构,称为CF树,它可以快速地插入和删除子簇,并且可以自动平衡,从而确保簇的质量和效率。

BIRCH算法的优点是能够快速处理大规模数据集,并且对于任意形状的簇都有较好的效果。该算法对于噪声数据和离群点也有较好的容错性。缺点是对于密度差异较大的数据集,可能会导致聚类效果不佳,对于高维数据集的效果也不如其他算法。

 importmatplotlib.colorsascolors
 fromsklearn.clusterimportBirch, MiniBatchKMeans
 fromtimeimporttime
 fromitertoolsimportcycle
 
 # Use all colors that matplotlib provides by default.
 colors_=cycle(colors.cnames.keys())
 
 fig=plt.figure(figsize=(12, 4))
 fig.subplots_adjust(left=0.04, right=0.98, bottom=0.1, top=0.9)
 
 # Compute clustering with BIRCH with and without the final clustering step
 # and plot.
 birch_models= [
     Birch(threshold=1.7, n_clusters=None),
     Birch(threshold=1.7, n_clusters=5),
 ]
 final_step= ["without global clustering", "with global clustering"]
 
 
 forind, (birch_model, info) inenumerate(zip(birch_models, final_step)):
     t=time()
     birch_model.fit(X)
     print("BIRCH %s as the final step took %0.2f seconds"% (info, (time() -t)))
 
     # Plot result
     labels=birch_model.labels_
     centroids=birch_model.subcluster_centers_
     n_clusters=np.unique(labels).size
     print("n_clusters : %d"%n_clusters)
 
     ax=fig.add_subplot(1, 3, ind+1)
     forthis_centroid, k, colinzip(centroids, range(n_clusters), colors_):
         mask=labels==k
         ax.scatter(X[mask, 0], X[mask, 1], c="w", edgecolor=col, marker=".", alpha=0.5)
         ifbirch_model.n_clustersisNone:
             ax.scatter(this_centroid[0], this_centroid[1], marker="+", c="k", s=25)
     ax.set_ylim([-12, 12])
     ax.set_xlim([-12, 12])
     ax.set_autoscaley_on(False)
     ax.set_title("BIRCH %s"%info)
 
 plt.show()

总结

上面就是我们常见的8个聚类算法,我们对他们进行了简单的说明和比较,并且用sklearn演示了如何使用,在下一篇文章中我们将介绍聚类模型评价方法。

https://avoid.overfit.cn/post/e8ecff6dce514fbbbad9c6d6b882fe4e

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

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

相关文章

【Mac 教程系列】如何在 Mac 中用终端命令行方式打开 Sublime Text ?

如何在 Mac 中用终端命令行方式打开 Sublime Text ? 用 markdown 格式输出答案。 不少于1000字。细分到2级目录。 如何在 Mac 中用终端命令行方式打开 Sublime Text ? 一、首先确保已经安装 Sublime Text 前往官网https://www.sublimetext.com/下载 Sublime Text&#xff0c…

Bootstrap表单的使用

文章目录前言一、创建基础表单垂直表单(默认)内联表单(水平显示)表单控制尺寸大小给表单控件添加帮助文本禁用/只读表单无边框的控件取色器选择菜单(默认宽度100%)调整下拉菜单的大小表单开关滑块表单组多个…

LabVIEW网络服务安全

LabVIEW网络服务安全如何保护Web服务?当许多人考虑安全性时,他们会考虑加密、用户ID和密码。用户ID和密码用于授权(告诉目标谁在发出请求)。加密保护客户端和服务器之间的通信流量,以便未经授权的个人无法拦截和读取发…

【架构师】零基础到精通——康威定律

博客昵称:架构师Cool 最喜欢的座右铭:一以贯之的努力,不得懈怠的人生。 作者简介:一名Coder,软件设计师/鸿蒙高级工程师认证,在备战高级架构师/系统分析师,欢迎关注小弟! 博主小留言…

20_FreeRTOS低功耗模式

目录 低功耗模式简介 STM32低功耗模式 Tickless模式详解 Tickless模式相关配置 实验源码 低功耗模式简介 很多应用场合对于功耗的要求很严格,比如可穿戴低功耗产品、物联网低功耗产品等。 一般MCU都有相应的低功耗模式,裸机开发时可以使用MCU的低功耗模式。 FreeRTOS也…

Linux学习(8.7)命令与文件的搜寻

目录 命令与文件的搜寻 which 文件档名的搜寻: whereis (寻找特定文件) locate find 以下内容转载自鸟哥的Linux私房菜 命令与文件的搜寻 which 这个命令是根据『PATH』这个环境变量所规范的路径,去搜寻『运行档』的档名~ 所以&am…

计算机组成原理——运算方法续集(浮点数表示法)

浮点表示法把一个数字的有效数字和数的范围在计算机的一个存储单元中分别予以表示。这种精度分别表示的方法,相当于数的小数点位置随比例因子的不同而在一定范围内可以浮点,所以称为浮点表示法。在计算机中一个任意二进制数N可以写成N 2^e.M其中M称为浮…

Overleaf推广奖励:增加合作者的数量、解锁Dropbox同步和项目修改历史

Overleaf推广奖励 Overleaf是一个LaTeX\LaTeXLATE​X在线编译器,它可以让你与合作者共同在线编辑文档。但是默认的免费账号仅能邀请一个合作者。那么如何增加合作者的数量呢? Overleaf推出了一个奖励计划,你邀请其他人注册Overleaf&#xf…

使用MavenCentral发布Kotlin多平台库的远程依赖(KMM,KMP)

前言 开发者可能都会做自己的开源库,像我以前只做一些单平台的,如Android或JVM平台,这时候直接使用jitpack即可,很简单就能发布远程依赖 jitpack参考: 发布开源库的踩坑经历:jitpack.io_李小白lt的博客 而现在Kotlin可以通过expect来实现原生多平台项目(或库),这时我们开发…

【计算机三级网络技术】 第二篇 中小型系统总体规划与设计

文章目录一、基于网络的信息系统基本结构二、划分网络系统组建工程阶段三、网络需求调研与系统设计原则四、网络用户调查与网络工程需求分析1.网络用户调查2.网络节点的地理位置分布3.应用概要分析4.网络需求详细分析五、网络总体设计基本方法1.网络工程建设总体目标与设计原则…

C++---线性dp---传纸条(每日一道算法2023.2.26)

注意事项: 本题dp思路与 “线性dp–方格取数” 一致,下方思路仅证明为什么使用方格取数的思路是正确的。 题目: 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。 一次素质拓展活动中,班上同学安排坐成…

3.7寸按键翻页工牌

产品参数 产品型号 ESL_BWR3.7_BLE 产品尺寸 (mm) 62.51066.5 显示技术 E ink 显示区域 (mm) 47.32(H)81.12(V) 分辨率 (像素) 280480 像素尺寸(mm) 0.1690.169 150dpi 显示颜色 黑/白 视觉角度 180 工作温度 0℃ - 50℃ 电池 500mAh ( Type-C 充电…

黑盒测试用例设计方法-等价类划分法

目录 一、等价类的作用 二、等价类的分类 三、等价类的方法 四、等价类的原则 五、按照测试用例的完整性划分等价类 六、等价类步骤 七、案例 一、等价类的作用 为穷举测试设计测试点。 穷举:列出所有的可能情况,对其一一判断。 测试点&#x…

JasperReports studio相关操作

1.2 JasperReports JasperReports是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,或者XML格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应…

【数据挖掘】1、综述:背景、数据的特征、数据挖掘的六大应用方向、有趣的案例

目录一、背景1.1 学习资料1.2 数据的特征1.3 数据挖掘的应用案例1.4 获取数据集1.5 数据挖掘的定义二、分类三、聚类四、关联分析五、回归六、可视化七、数据预处理八、有趣的案例8.1 隐私保护8.2 云计算的弹性资源8.3 并行计算九、总结一、背景 1.1 学习资料 推荐书籍如下&a…

C语言刷题(3)——“C”

各位CSDN的uu们你们好呀,今天小雅兰的内容还是做几道题噢,好好复习一下之前的知识点,现在,就让我们开始复习吧 牛客网在线编程_编程学习|练习题_数据结构|系统设计题库 倒置字符串_牛客题霸_牛客网 BC40 竞选社长 BC41 你是天才…

vitepress 就这几步操作,博客就搭好啦?

Ⅰ、什么是vitepress 💎 vitepress 使用场景 简单的说 ,只要 会用 markdown 语法,就能构建自己的 「博客、笔记、使用文档」等系统 ; ✨ vitepress 优势 优势介绍傻瓜式操作只需要配置 菜单 和 对应的 markdown 就能实现博客、笔…

OKR 与 KPI有何异同?各部门OKR实例【小bu】

OKR 与 KPI,如何本土化是关键 近期公司计划对去年实施的绩效考核方案进行优化,公司以往采用 KPI 绩效考核方式,产生了一些争议。一方面,执行期间部分部门一度忽略指标设置的真实目的,导致出现短视思维和行为&#xff1…

Vision Transformer学习了什么-WHAT DO VISION TRANSFORMERS LEARN? A VISUAL EXPLORATION

WHAT DO VISION TRANSFORMERS LEARN? A VISUAL EXPLORATION 文章地址 代码地址 摘要 视觉转换器( Vision Transformers,ViTs )正在迅速成为计算机视觉的事实上的架构,但我们对它们为什么工作和学习什么知之甚少。虽然现有研究对卷积神经网络的机制进…

LabVIEW控制DO通道输出一个精确定时的数字波形

LabVIEW控制DO通道输出一个精确定时的数字波形如何使用数据采集板卡的DO通道输出一个精确定时的数字波形?解答:产生一个数字波形首先需要创建一个布尔数组,把波形序列信息放到该布尔数组中,然后通过一个布尔数组至数字转换vi来产生数字波形。…