解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱
一、引言
机器学习算法种类繁多,它们各自有着独特的优势和应用场景。前面我们学习了线性回归算法、逻辑回归算法、决策树算法。而今天,我们要深入探讨的是其中一种经典且广泛应用的聚类算法 —— K - 平均算法(K-Means Algorithm) 。它在数据挖掘、图像处理、市场分析等众多领域都发挥着重要作用,能够帮助我们发现数据中的潜在模式和规律,为决策提供有力支持。
二、K - 平均算法基础
2.1 定义与概念
K - 平均算法,也被称为 K - 均值算法,是一种广泛应用的聚类算法 ,属于无监督学习的范畴。在无监督学习中,我们没有预先标记好的类别信息,而聚类的目的就是发现数据的内在结构和模式,将相似的数据点划分到同一个簇(cluster)中 。
K - 平均算法的核心目标是将给定的数据集划分为 K 个互不重叠的簇,使得同一个簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。这里的 “相似” 通常通过距离来衡量,比如欧氏距离、曼哈顿距离等 ,最常用的是欧氏距离。通过将数据点分配到距离最近的簇中心,来实现聚类的效果。
2.2 核心原理
-
质心选择:首先,需要确定要划分的簇的数量 K,这是 K - 平均算法的一个超参数,需要根据具体问题和数据特点进行设定。然后,随机从数据集中选择 K 个数据点作为初始质心(centroid),这些质心代表了每个簇的初始中心位置。
-
样本分配:对于数据集中的每一个样本点,计算它与 K 个质心的距离,通常使用欧氏距离公式 。将该样本点分配到距离最近的质心所对应的簇中。这样,所有样本点都被划分到了 K 个簇中的某一个。
-
质心更新:在完成所有样本点的分配后,重新计算每个簇的质心。新的质心是该簇中所有样本点的均值。例如,对于一个二维数据点的簇,新质心的横坐标是该簇中所有点横坐标的平均值,纵坐标是所有点纵坐标的平均值。通过更新质心,使得每个簇的中心位置更能代表该簇内的数据点。
-
迭代优化:重复样本分配和质心更新这两个步骤,直到质心不再发生变化(或变化非常小,小于预先设定的阈值),或者达到了预先设定的最大迭代次数。此时,算法收敛,认为聚类结果已经稳定,完成聚类过程。
2.3 数学原理
假设我们有一个包含 n 个样本的数据集 D = { x 1 , x 2 , ⋯ , x n } D=\{x_1,x_2,\cdots,x_n\} D={x1,x2,⋯,xn},要将其划分为 K 个簇。用 C = { C 1 , C 2 , ⋯ , C k } C=\{C_1,C_2,\cdots,C_k\} C={C1,C2,⋯,Ck} 表示划分后的簇集合,其中 C i C_i Ci 表示第 i 个簇, μ i \mu_i μi 表示第 i 个簇的质心。
K - 平均算法的目标是最小化每个样本点到其所属簇质心的距离平方和,即目标函数为:
J ( C , μ ) = ∑ i = 1 K ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 J(C,\mu)=\sum_{i = 1}^{K}\sum_{x\in C_i}||x-\mu_i||^2 J(C,μ)=i=1∑Kx∈Ci∑∣∣x−μi∣∣2
其中, ∣ ∣ x − μ i ∣ ∣ 2 ||x-\mu_i||^2 ∣∣x−μi∣∣2 表示样本点 x 到质心 μ i \mu_i μi 的欧氏距离的平方。
在算法的迭代过程中,通过不断更新质心和样本点的分配,来逐步优化目标函数,使其值不断减小,最终收敛到一个局部最优解(由于 K - 平均算法对初始质心敏感,不一定能收敛到全局最优解)。
具体来说,质心的更新公式为:
μ i = 1 ∣ C i ∣ ∑ x ∈ C i x \mu_i=\frac{1}{|C_i|}\sum_{x\in C_i}x μi=∣Ci∣1x∈Ci∑x
其中, ∣ C i ∣ |C_i| ∣Ci∣ 表示簇 C i C_i Ci 中的样本点数量。
通过不断重复样本分配(根据距离最近原则将样本点分配到簇中)和质心更新(根据簇内样本点计算新质心)这两个步骤,使得目标函数 J ( C , μ ) J(C,\mu) J(C,μ) 不断减小,直到满足收敛条件(质心不再变化或变化小于阈值,或者达到最大迭代次数)。
三、算法流程与步骤
3.1 初始化质心
初始化 K 个质心是 K - 平均算法的第一步,质心的选择对算法的收敛速度和最终聚类结果有着重要影响。常见的初始化方法有随机选择和 K-means++ 算法。
-
随机选择:最简单的方式是从数据集中随机选取 K 个数据点作为初始质心。这种方法实现简单,计算开销小,在数据集较小且分布相对均匀时,有可能快速收敛到较好的聚类结果。但在复杂数据集上,随机选择的质心可能过于接近,导致聚类结果陷入局部最优。例如在一个包含多个明显分离簇的数据集上,若随机选择的质心都集中在一个小区域,那么聚类结果可能无法准确反映数据的真实结构。
-
K-means++ 算法:该算法旨在选择距离较远的初始质心,以提高聚类效果和收敛速度。其步骤如下:
- 1、随机选择一个数据点作为第一个质心。
- 2、对于每个未被选择的数据点,计算它与已选择质心的最小距离,并将这个距离的平方作为该点被选为下一个质心的概率。
- 3、根据计算出的概率,使用轮盘赌选择法或其他随机选择方法,选择下一个质心。
- 4、重复步骤 2 和 3,直到选择出 K 个质心。
通过这种方式,K-means++ 算法能够使初始质心在数据空间中更均匀地分布,减少陷入局部最优的可能性。在图像分割任务中,使用 K-means++ 初始化质心可以更准确地将图像中的不同区域分割出来,相比随机初始化,聚类结果更加稳定和准确。
3.2 样本分配
在完成质心初始化后,接下来要将数据集中的每个样本分配到距离它最近的质心所在的簇中。这一步骤的关键是计算样本与质心之间的距离,最常用的距离度量是欧氏距离。对于两个 n n n 维向量 x = ( x 1 , x 2 , ⋯ , x n ) x=(x_1,x_2,\cdots,x_n) x=(x1,x2,⋯,xn)和 y = ( y 1 , y 2 , ⋯ , y n ) y=(y_1,y_2,\cdots,y_n) y=(y1,y2,⋯,yn),它们之间的欧氏距离计算公式为:
d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x,y)=\sqrt{\sum_{i = 1}^{n}(x_i - y_i)^2} d(x,y)=i=1∑n(xi−yi)2
以一个二维数据集为例,假设有样本点 P ( 2 , 3 ) P(2,3) P(2,3) 和质心 C 1 ( 1 , 1 ) C_1(1,1) C1(1,1)、 C 2 ( 4 , 5 ) C_2(4,5) C2(4,5),则 P P P 到 C 1 C_1 C1 的欧氏距离为:
d ( P , C 1 ) = ( 2 − 1 ) 2 + ( 3 − 1 ) 2 = 1 + 4 = 5 d(P,C_1)=\sqrt{(2 - 1)^2+(3 - 1)^2}=\sqrt{1 + 4}=\sqrt{5} d(P,C1)=(2−1)2+(3−1)2=1+4=5
P P P 到 C 2 C_2 C2 的欧氏距离为:
d ( P , C 2 ) = ( 2 − 4 ) 2 + ( 3 − 5 ) 2 = 4 + 4 = 2 2 d(P,C_2)=\sqrt{(2 - 4)^2+(3 - 5)^2}=\sqrt{4 + 4}=2\sqrt{2} d(P,C2)=(2−4)2+(3−5)2=4+4=22
由于 5 < 2 2 \sqrt{5}<2\sqrt{2} 5<22,所以样本点 P P P 被分配到质心 C 1 C_1 C1 所在的簇中。通过对数据集中的每一个样本点执行这样的距离计算和分配操作,完成一次样本分配过程,使得每个样本都归属于一个特定的簇。
3.3 质心更新
在完成所有样本的分配后,需要重新计算每个簇的质心。新质心的计算方法是将簇内所有样本点的对应维度的均值作为新质心在该维度的值。例如,对于一个包含 m 个样本点的簇 C C C,每个样本点是一个 n 维向量,设样本点为 x j = ( x 1 j , x 2 j , ⋯ , x n j ) x^j=(x_1^j,x_2^j,\cdots,x_n^j) xj=(x1j,x2j,⋯,xnj) ,其中 j = 1 , 2 , ⋯ , m j = 1,2,\cdots,m j=1,2,⋯,m ,则该簇的新质心 μ \mu μ 的计算公式为:
μ i = 1 m ∑ j = 1 m x i j \mu_i=\frac{1}{m}\sum_{j = 1}^{m}x_i^j μi=m1j=1∑mxij
其中, i = 1 , 2 , ⋯ , n i = 1,2,\cdots,n i=1,2,⋯,n,表示质心的第 i 个维度的值。
假设一个簇中有三个样本点 A ( 1 , 2 ) A(1,2) A(1,2)、 B ( 3 , 4 ) B(3,4) B(3,4)、 C ( 5 , 6 ) C(5,6) C(5,6),则新质心的横坐标为:
μ 1 = 1 + 3 + 5 3 = 3 \mu_1=\frac{1 + 3 + 5}{3}=3 μ1=31+3+5=3
纵坐标为:
μ 2 = 2 + 4 + 6 3 = 4 \mu_2=\frac{2 + 4 + 6}{3}=4 μ2=32+4+6=4
所以新质心为 ( 3 , 4 ) (3,4) (3,4)。通过更新质心,使得每个簇的中心位置更能代表该簇内样本点的分布情况,为下一轮的样本分配提供更准确的参考。
3.4 迭代收敛
完成质心更新后,算法进入下一轮迭代,再次进行样本分配和质心更新的步骤。这个迭代过程不断重复,直到满足一定的收敛条件。常见的收敛条件有两种:
-
质心不再变化:当两次迭代之间,所有质心的位置变化都非常小(小于预先设定的一个极小阈值)时,认为算法已经收敛,聚类结果稳定。例如,设定阈值为 1 0 − 6 10^{-6} 10−6,如果某次迭代后,所有质心在各个维度上的变化量都小于 1 0 − 6 10^{-6} 10−6,则算法停止迭代。
-
达到预设迭代次数:预先设定一个最大迭代次数,如 100 次。无论质心是否还在变化,只要达到了这个最大迭代次数,算法就停止迭代。这种方式可以防止算法在某些情况下陷入无限循环,确保算法在有限的时间内结束。
在实际应用中,根据具体情况选择合适的收敛条件。如果对聚类结果的精度要求较高,且数据量不是特别大,可以优先考虑质心不再变化的条件;如果希望算法在一定时间内结束,并且对结果精度要求不是极高,可以采用达到预设迭代次数的条件。通过不断迭代优化,K - 平均算法最终能够将数据集划分成 K 个相对稳定的簇,完成聚类任务。
四、K - 平均算法的优缺点
4.1 优点
-
简单高效: K - 平均算法的原理和步骤都相对简单,易于理解和实现。它的计算过程主要涉及距离计算和均值计算,不需要复杂的数学推导和模型训练,在处理大规模数据集时,能够快速地完成聚类任务,具有较高的计算效率。在电商领域,对海量的用户购买行为数据进行聚类分析,K - 平均算法可以在较短时间内完成聚类,帮助商家发现不同类型的用户群体,为精准营销提供依据。
-
计算复杂度低:K - 平均算法的时间复杂度主要取决于样本数量 n、簇的数量 K 和迭代次数 I,通常为 O (nKI)。在实际应用中,K 和 I 通常是相对较小的常数,因此算法的时间复杂度接近线性,能够在合理的时间内处理大规模数据。对于具有数百万条记录的客户交易数据集,K - 平均算法可以在可接受的时间内完成聚类分析,为企业的市场决策提供支持。
-
可扩展性好:K - 平均算法可以很容易地扩展到高维数据空间,对数据的维度没有严格限制。在图像识别领域,图像数据通常具有很高的维度(如 RGB 图像每个像素点有三个维度),K - 平均算法可以有效地对图像数据进行聚类,实现图像分割、图像压缩等任务。
-
对球形簇数据效果好:当数据集中的簇大致呈球形分布,且簇内数据点分布较为均匀时,K - 平均算法能够很好地识别出这些簇,聚类效果较为理想。在地理信息系统中,对城市中不同区域的人口分布进行聚类分析,如果不同区域的人口分布呈现出相对集中的球形特征,K - 平均算法可以准确地将这些区域划分成不同的簇,帮助城市规划者了解人口分布情况。
4.2 缺点
-
需要预先指定 K 值:在使用 K - 平均算法之前,必须事先确定要划分的簇的数量 K。然而,在实际应用中,很难预先知道数据的真实簇数。如果 K 值选择不当,可能会导致聚类结果不理想。选择的 K 值过小,会使得多个不同的簇被合并成一个簇,丢失数据的内在结构信息;选择的 K 值过大,会将一个簇划分成多个小簇,产生过度聚类的问题。在对新闻文章进行聚类时,如果 K 值设置不合理,可能会将不同主题的文章错误地聚在一起,或者将同一主题的文章分散到多个簇中,无法准确地提取文章的主题信息。
-
对初始质心敏感:由于初始质心是随机选择的,不同的初始质心可能会导致不同的聚类结果。如果初始质心选择不当,算法可能会收敛到局部最优解,而不是全局最优解。在一个包含多个明显分离簇的数据集上,如果初始质心都集中在一个小区域,那么聚类结果可能无法准确反映数据的真实结构,导致聚类效果不佳。为了克服这个问题,通常需要多次运行算法,选择不同的初始质心,然后根据某种评估指标(如轮廓系数、Calinski-Harabasz 指数等)选择最优的聚类结果。
-
对非球形簇和异常值敏感:K - 平均算法假设簇是球形的,且簇内数据点分布均匀。对于非球形的簇结构,K - 平均算法的聚类效果可能较差,无法准确地划分数据。当数据集中存在异常值时,这些异常值会对质心的计算产生较大影响,导致质心偏移,从而影响聚类结果的准确性。在一个包含离群点的客户收入数据集中,离群点(如高收入的企业家)可能会使某个簇的质心明显偏离正常客户的收入水平,导致该簇的聚类结果不能代表大多数客户的特征。
五、案例实战
5.1 准备数据集
为了更直观地理解 K - 平均算法的应用,我们以经典的 Iris 数据集为例。Iris 数据集是一个多类分类的基准数据集,包含 150 个样本,分为 3 个类别,分别对应鸢尾花的三个品种:Setosa、Versicolor 和 Virginica。每个样本具有 4 个特征维度:花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)和花瓣宽度(petal width),所有测量值均以厘米为单位。
在 Python 中,我们可以使用 Scikit-learn
库轻松加载 Iris
数据集,代码如下:
from sklearn.datasets import load_iris# 加载Iris数据集iris = load_iris()data = iris.data
加载数据集后,通常需要对数据进行预处理。这一步骤旨在确保数据的质量和一致性,以提高算法的性能和准确性。常见的预处理操作包括处理缺失值、去除异常值和数据标准化。在 Iris 数据集中,不存在缺失值,异常值也较少,因此我们重点进行数据标准化处理,使每个特征具有相同的尺度,避免因特征尺度差异较大而影响算法效果。
使用 Scikit-learn
库中的StandardScaler
进行数据标准化,代码如下:
from sklearn.preprocessing import StandardScaler# 数据标准化scaler = StandardScaler()data_scaled = scaler.fit_transform(data)
经过标准化处理后,数据集中每个特征的均值变为 0,标准差变为 1,这样可以使 K - 平均算法更加稳定和准确。
5.2 算法实现
接下来,我们使用 Python 和 Scikit-learn
库实现 K - 平均算法。具体步骤包括模型初始化、训练和预测。
首先,初始化 K - 平均模型,设置簇的数量 K。在 Iris 数据集中,我们知道真实的类别数为 3,因此设置 n_clusters = 3
。同时,为了使结果具有可重复性,设置 random_state
参数。代码如下:
from sklearn.cluster import KMeans# 初始化K-平均模型,设置簇的数量为3kmeans = KMeans(n_clusters=3, random_state=42)
然后,使用预处理后的数据对模型进行训练:
# 训练模型kmeans.fit(data_scaled)
训练完成后,模型会根据数据的特征和分布,将数据点划分到不同的簇中。我们可以使用训练好的模型对数据进行预测,得到每个数据点所属的簇标签:
# 预测每个数据点所属的簇labels = kmeans.predict(data_scaled)
通过以上步骤,我们完成了 K - 平均算法的实现,得到了每个样本点所属的簇标签。这些标签将用于后续的结果分析和评估。
5.3 结果分析
完成 K - 平均算法的训练和预测后,我们需要对聚类结果进行分析。首先,查看每个簇的样本数量和质心位置。通过kmeans.labels_
可以获取每个样本点所属的簇标签,通过kmeans.cluster_centers_
可以获取每个簇的质心。代码如下:
import numpy as np# 查看每个簇的样本数量cluster_sizes = np.unique(labels, return_counts=True)[1]print("每个簇的样本数量:", cluster_sizes)# 查看每个簇的质心cluster_centers = kmeans.cluster_centers_print("每个簇的质心:\n", cluster_centers)
上述代码中,np.unique(labels, return_counts=True)
用于统计每个簇标签的数量,从而得到每个簇的样本数量。kmeans.cluster_centers_
直接返回每个簇的质心,这些质心是在聚类过程中通过不断迭代计算得到的,代表了每个簇的中心位置。
为了更直观地展示聚类效果,我们可以使用可视化工具,如 Matplotlib
或 Seaborn
。由于 Iris 数据集是四维数据,为了在二维平面上展示,我们可以选择其中两个特征进行可视化。这里我们选择花萼长度和花瓣长度两个特征:
import matplotlib.pyplot as plt# 选择花萼长度和花瓣长度两个特征x = data[:, 0]y = data[:, 2]# 绘制散点图,不同颜色表示不同的簇plt.scatter(x, y, c=labels, cmap='viridis')# 绘制簇的质心plt.scatter(cluster_centers[:, 0], cluster_centers[:, 2], marker='x', c='red', s=200)plt.xlabel('花萼长度')plt.ylabel('花瓣长度')plt.title('K-平均算法聚类结果')plt.show()
在上述代码中,plt.scatter(x, y, c=labels, cmap='viridis')
根据样本点所属的簇标签,使用不同颜色绘制散点图,展示不同簇的数据分布情况。plt.scatter(cluster_centers[:, 0], cluster_centers[:, 2], marker='x', c='red', s=200)
绘制每个簇的质心,以红色的 “x” 标记,便于观察簇的中心位置。通过可视化结果,可以直观地看到 K - 平均算法将数据点划分成了三个簇,并且不同簇之间的数据点具有一定的区分度。最终结果如下图所示:
5.4 评估指标
为了评估 K - 平均算法的聚类效果,我们引入一些常用的评估指标,如 SSE(Sum of Squared Errors,误差平方和)和轮廓系数(Silhouette Coefficient)。
SSE 是一种常用的评估聚类效果的指标,它衡量了每个样本点到其所属簇质心的距离平方和。SSE 值越小,说明簇内的数据点越紧密,聚类效果越好。在 Scikit-learn 中,可以通过kmeans.inertia_
获取 SSE 值:
# 计算SSEsse = kmeans.inertia_print("SSE:", sse)
通过上述代码我们最终得到的SSE为:
SSE: 191.02473685317972
轮廓系数结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。其取值范围为 [-1, 1],系数越接近 1,表示聚类效果越好;越接近 - 1,表示样本可能被误分;越接近 0,表示样本处于两个簇的边界上。在 Scikit-learn 中,可以使用metrics.silhouette_score
计算轮廓系数:
from sklearn import metrics# 计算轮廓系数silhouette_score = metrics.silhouette_score(data_scaled, labels)print("轮廓系数:", silhouette_score)
通过上述代码我们最终得到的轮廓系数为:
轮廓系数: 0.4798814508199817
通过分析这些评估指标,可以更客观地了解 K - 平均算法在当前数据集上的聚类效果。如果 SSE 值较大,说明簇内的数据点不够紧密,可能需要调整簇的数量 K 或优化算法;如果轮廓系数较低,说明聚类效果不理想,可能存在样本误分或簇划分不合理的情况,需要进一步分析和改进。
六、优化与改进
6.1 初始质心选择策略
K - 平均算法对初始质心的选择非常敏感,不同的初始质心可能导致不同的聚类结果,甚至可能使算法收敛到局部最优解。为了改善这一问题,人们提出了多种优化初始质心选择的方法,其中 K-means++ 算法(具体算法见3.1:初始化质心)是一种广泛应用且效果显著的方法。
以一个包含多个明显分离簇的数据集为例,假设使用随机初始化质心的 K - 平均算法,可能会因为初始质心都集中在一个簇中,导致其他簇无法被正确识别,聚类结果陷入局部最优。而使用 K-means++ 算法初始化质心时,由于其选择质心的策略能够使质心在数据空间中更均匀地分布,更有可能将质心分别放置在不同的簇中,从而准确地识别出各个簇,得到更优的聚类结果。在实际应用中,K-means++ 算法在处理大规模数据集和复杂数据分布时,能够显著提高算法的收敛速度和聚类质量,减少算法对初始条件的依赖,使聚类结果更加可靠。
6.2 确定 K 值的方法
在使用 K - 平均算法时,预先指定 K 值是一个关键问题,因为不合适的 K 值可能导致聚类结果不理想。以下介绍两种常用的确定最优 K 值的方法:肘部法和轮廓系数法。
- 肘部法(Elbow Method):
肘部法的核心指标是 SSE(Sum of Squared Errors,误差平方和),它表示每个样本点到其所属簇质心的距离平方和。公式为:
S S E = ∑ i = 1 K ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 SSE=\sum_{i = 1}^{K}\sum_{x\in C_i}||x-\mu_i||^2 SSE=i=1∑Kx∈Ci∑∣∣x−μi∣∣2
其中, C i C_i Ci 是第 i 个簇, x x x 是 C i C_i Ci 中的样本点, μ i \mu_i μi 是 C i C_i Ci 的质心。
肘部法的核心思想是:随着聚类数 K 的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和 SSE 自然会逐渐变小。并且,当 K 小于真实聚类数时,由于 K 的增大会大幅增加每个簇的聚合程度,故 SSE 的下降幅度会很大;而当 K 到达真实聚类数时,再增加 K 所得到的聚合程度回报会迅速变小,所以 SSE 的下降幅度会骤减,然后随着 K 值的继续增大而趋于平缓。也就是说 SSE 和 K 的关系图是一个手肘的形状,而这个肘部对应的 K 值就是数据的真实聚类数。
具体操作步骤如下:
- 选择一个合理的 K 值范围,例如从 1 到 10。
- 对于范围内的每个 K 值,运行 K - 平均算法,并计算相应的 SSE 值。
- 绘制 K 值与 SSE 值的关系曲线,即肘部图。在图中,横轴表示 K 值,纵轴表示 SSE 值。
- 观察曲线,找到 SSE 下降速度显著减缓的点,即曲线出现 “肘部” 的位置,该位置对应的 K 值即为最佳聚类数。
轮廓系数法(Silhouette Coefficient):
轮廓系数结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。对于数据集中的每个样本点 x i x_i xi,其轮廓系数 s i s_i si 的计算如下:
- 计算 x i x_i xi 与同一簇中所有其他样本的平均距离,记为 a i a_i ai, a i a_i ai 越小,表示样本点在簇内的凝聚度越高。
- 计算 x i x_i xi 与最近簇中所有样本的平均距离,记为 b i b_i bi, b i b_i bi 越大,表示样本点与其他簇的分离度越高。
- 计算样本点 x i x_i xi 的轮廓系数:
s i = b i − a i max ( a i , b i ) s_i=\frac{b_i - a_i}{\max(a_i,b_i)} si=max(ai,bi)bi−ai
整个数据集的轮廓系数是所有样本点轮廓系数的平均值,其取值范围为 [-1, 1]。轮廓系数越接近 1,表示聚类效果越好;越接近 - 1,表示样本可能被误分;越接近 0,表示样本处于两个簇的边界上。
确定 K 值的步骤如下:
- 选择一个 K 值范围,如从 2 到 10。
- 对于每个 K 值,运行 K - 平均算法并计算轮廓系数。
- 选择轮廓系数最大时对应的 K 值作为最优的聚类数。
6.3 应对非球形簇和异常值
K - 平均算法假设簇是球形的,且对异常值较为敏感,这在实际应用中可能导致聚类效果不佳。为了解决这些问题,可以采用以下方法:
-
使用 DBSCAN 算法处理非球形簇:
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,它不需要事先指定簇的数量,并且能够处理非球形簇数据。-
其核心概念包括:
-
核心点:如果一个点的 ϵ \epsilon ϵ邻域内至少包含 MinPts 个点,则该点被定义为核心点。这里的 ϵ \epsilon ϵ是邻域半径,MinPts 是最小点数,这两个参数需要根据数据特点进行设置。
-
边界点:一个点如果不在任何核心点的 ϵ \epsilon ϵ邻域内,但属于某个核心点的 ϵ \epsilon ϵ邻域,则被定义为边界点。
-
噪声点:不属于任何核心点或边界点的点被称为噪声点。
-
-
DBSCAN 算法的主要步骤如下:
- 选择合适的参数 ϵ \epsilon ϵ和 MinPts。这是 DBSCAN 算法的关键步骤,参数的选择会直接影响聚类结果。通常可以通过多次试验或根据数据的先验知识来确定合适的参数值。
- 对于数据集中的每个点,定义其 ϵ \epsilon ϵ邻域(即距离不超过 ϵ \epsilon ϵ的所有点)。
- 检查每个点的邻域是否包含至少 MinPts 个点,确定核心点。
- 从每个核心点开始,递归地将邻近的核心点添加到同一簇中,形成簇。
- 标记未被分配到任何簇中的点为噪声点。
在一个包含环形分布数据点的数据集上,K - 平均算法由于假设簇是球形的,可能无法正确识别环形簇,而 DBSCAN 算法能够根据数据点的密度分布,准确地将环形区域划分为一个簇,并将噪声点识别出来,从而得到更符合数据实际分布的聚类结果。-
处理异常值的方法:
-
删除含有异常值的记录:如果异常值是由于错误或噪声(如设备故障、手动输入错误等)导致的,那么最简单的处理方法就是删除这些异常值。但这种方法需要谨慎使用,因为如果删除的数据量过大,可能会导致信息丢失。在一个客户收入数据集中,如果某个收入值明显偏离正常范围,且经过核实是由于录入错误导致的,那么可以考虑删除该记录。但如果数据集中存在较多这样的异常值,删除它们可能会影响对整体客户收入分布的分析。
-
将异常值视为缺失值,交给缺失值处理方法来处理:常见的缺失值处理方法有均值填充、中位数填充、众数填充等。可以根据数据的特点选择合适的填充方法。对于一个数值型数据集,如果某个特征存在异常值,可以将其视为缺失值,然后用该特征的均值或中位数进行填充。但这种方法可能会掩盖异常值所包含的信息,在某些情况下可能会影响分析结果的准确性。
-
使用鲁棒的统计方法:某些统计方法对异常值有很好的鲁棒性,即使存在异常值,也能得到准确的结果。在计算数据的中心趋势时,可以使用中位数代替均值,因为中位数受异常值的影响较小。在聚类算法中,也有一些鲁棒的聚类方法,如基于密度的聚类算法(如 DBSCAN),它们能够自动识别并排除噪声点(异常值),从而得到更稳定的聚类结果。
-
-
七、应用领域
K - 平均算法作为一种经典的聚类算法,凭借其简单高效的特点,在众多领域都有着广泛的应用,为解决实际问题提供了有效的手段。以下是 K - 平均算法在一些主要领域的应用介绍。
7.1 图像分割
在图像处理领域,图像分割是一项关键任务,其目的是将图像中的不同区域分离出来,以便进行后续的分析和处理,如目标识别、图像压缩等。K - 平均算法在图像分割中发挥着重要作用,它可以根据图像中像素的颜色、亮度等特征将像素点聚类成不同的组,每个组对应图像中的一个区域。
以彩色图像分割为例,我们可以将每个像素的 RGB 值作为一个三维向量,将图像中的所有像素点看作一个数据集。通过 K - 平均算法,将这些像素点划分成 K 个簇,每个簇代表图像中的一个特定区域,如天空、地面、建筑物等。在这个过程中,K 值的选择决定了分割的精细程度,K 值越大,分割出的区域越细致,但计算复杂度也会相应增加。
7.2 市场细分
在市场营销领域,了解消费者的需求和行为模式是制定有效营销策略的关键。K - 平均算法可以帮助企业根据消费者的各种属性,如年龄、收入、消费习惯、购买频率等,将消费者细分为不同的群体,每个群体具有相似的消费特征和需求。
假设我们有一个包含大量消费者信息的数据集,通过 K - 平均算法对这些数据进行聚类分析,我们可能会发现一些有趣的消费者群体,如高收入且高消费的群体、年轻且注重时尚的群体、价格敏感型的群体等。企业可以针对不同的群体制定个性化的营销策略,推出符合他们需求的产品和服务,提高市场竞争力。
7.3 生物信息学
在生物信息学领域,随着高通量技术的发展,产生了大量的生物数据,如基因表达数据、蛋白质序列数据等。如何从这些海量的数据中挖掘出有价值的信息,成为了生物信息学研究的重要课题。K - 平均算法在生物信息学中有着广泛的应用,特别是在基因表达数据分析方面。
研究人员可以通过 K - 平均算法将具有相似表达模式的基因聚类到一起,从而发现基因之间的潜在关系和功能模块。这有助于深入了解生物过程的分子机制,为疾病的诊断、治疗和药物研发提供重要的线索。在研究癌症相关基因时,通过对大量癌症患者和正常样本的基因表达数据进行 K - 平均聚类分析,可能会发现一些与癌症发生发展密切相关的基因簇,为癌症的早期诊断和治疗提供新的靶点。
7.4 文本挖掘
在信息爆炸的时代,文本数据的数量呈指数级增长,如何对这些文本数据进行有效的组织和管理,成为了一个重要的问题。K - 平均算法在文本挖掘领域有着重要的应用,它可以用于文档聚类、主题提取等任务。
对于大量的新闻文章,我们可以使用 K - 平均算法将它们按照主题进行聚类,每个簇代表一个特定的主题,如政治、经济、体育、娱乐等。这样可以帮助用户快速找到自己感兴趣的文章,提高信息检索的效率。在主题提取方面,K - 平均算法可以将文本中的关键词聚类,从而提取出文本的主要主题,为文本的分类和标注提供依据。
八、总结与展望
简单总结一下,我们这篇文章主要学习了如下内容:K - 平均算法是经典聚类算法,简单高效,应用广泛。它通过迭代将数据集划分为 K 个簇,使簇内相似性高、簇间低。该算法有核心概念、数学原理及特定流程,如初始化质心、样本分配等。
其优点是简单高效、复杂度低、扩展性好,尤其适用于球形簇数据,但存在需预指定 K 值、对初始质心及非球形簇和异常值敏感等缺点。为克服不足,可采用 K - means++ 选初始质心,用肘部法等确定 K 值,借助 DBSCAN 处理非球形簇及应对异常值。
通过 Iris 数据集实战,体验其实现过程。在图像分割等多领域,K - 平均算法发挥重要作用。未来,随着数据变化,它有望与新兴技术结合,研究人员也将持续优化,以适应复杂场景,在数据挖掘等领域贡献更大力量。
K-Means 项目代码地址:【传送门】
延伸阅读
-
机器学习核心算法系列文章
解锁机器学习核心算法 | 决策树:机器学习中高效分类的利器
解锁机器学习核心算法 | 逻辑回归:不是回归的“回归”
解锁机器学习核心算法 | 线性回归:机器学习的基石 -
深度学习框架探系列文章
深度学习框架探秘|TensorFlow:AI 世界的万能钥匙
深度学习框架探秘|PyTorch:AI 开发的灵动画笔
深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决
深度学习框架探秘|Keras:深度学习的魔法钥匙
相关文章:
解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱
一、引言 机器学习算法种类繁多,它们各自有着独特的优势和应用场景。前面我们学习了线性回归算法、逻辑回归算法、决策树算法。而今天,我们要深入探讨的是其中一种经典且广泛应用的聚类算法 —— K - 平均算法(K-Means Algorithm)…...
Go入门之语言变量 常量介绍
func main(){var a int8 10var b int 5var c int 6fmt.Println("a", a, "b", b, "c", c)d : 10fmt.Printf("a%v leixing%T\n", d, d) } main函数是入口函数,fmt包有三个打印的函数Println,Print,Printf。第…...
音频采集(VUE3+JAVA)
vue部分代码 xx.vue import Recorder from ./Recorder.js; export default {data() {return {mediaStream: null,recorder: null,isRecording: false,audioChunks: [],vadInterval: null // 新增:用于存储声音活动检测的间隔 ID};},async mounted() {this.mediaSt…...
Linux运维篇-存储基础知识
什么是存储 用于存放数据信息的设备和介质,等同于计算机系统中的外部存储,是一个完整的系统。 存储的结构和趋势 存储的体系结构 当前存储的主要体系结构有三种: DASNASSAN 存储的发展趋势 ssd固态硬盘云存储一体化应用存储设备非结构…...
【git】已上传虚拟环境的项目更改成不再上传虚拟环境
虽然git用了很长时间,但是距离精通还是太远了。注意到虚拟环境是因为上传项目时用到的系统是macOS,而拉取项目时用到的系统是win,意识到是时候学习知识了(好懒啊)。 头一次上传:使用.gitignore避免虚拟环境…...
【Linux网络编程】应用层协议HTTP(请求方法,状态码,重定向,cookie,session)
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux网络编程笔记: https://blog.cs…...
Android GreenDAO 适配 AGP 8.0+
在 Android 中使用 GreenDao,由于 GreenDao 现在不维护,所以更新到新版本的 Gradle 经常出问题,在这记录一些升级遇到的问题,并且记录解决方案。 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 一、‘:app…...
使用html css js 来实现一个服装行业的企业站源码-静态网站模板
最近在练习 前端基础,html css 和js 为了加强 代码的 熟悉程序,就使用 前端 写了一个个服装行业的企业站。把使用的技术 和 页面效果分享给大家。 应用场景 该制衣服装工厂官网前端静态网站模板主要用于前端练习和编程练习,适合初学者进行 HT…...
小胡说技书博客分类(部分目录):服务治理、数据治理与安全治理对比表格
文章目录 一、对比表格二、目录2.1 服务2.2 数据2.3 安全 一、对比表格 下表从多个维度对服务治理、数据治理和安全治理进行详细对比,为读者提供一个直观而全面的参考框架。 维度服务治理数据治理安全治理定义对软件开发全流程、应用交付及API和接口管理进行规范化…...
SpringBoot3.x整合WebSocket
SpringBoot3.x整合WebSocket 本文主要介绍最新springboot3.x下如何整合WebSocket. WebSocket简述 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它允许在浏览器和服务器之间进行实时的、双向的通信。相对于传统的基于请求和响应的 HTTP 协议ÿ…...
SpringBoot中自动装配机制的原理
SpringBoot中的自动装配机制是其核心特性之一,其原理主要基于一系列约定和配置,能够根据项目的依赖和配置自动为应用程序加载和配置需要的Spring组件。以下是SpringBoot自动装配机制原理的详细解释: 一、启动类和注解 SpringBootApplicatio…...
STM32外设SPI FLASH应用实例
STM32外设SPI FLASH应用实例 1. 前言1.1 硬件准备1.2 软件准备 2. 硬件连接3. 软件实现3.1 SPI 初始化3.2 QW128 SPI FLASH 驱动3.3 乒乓存储实现 4. 测试与验证4.1 数据备份测试4.2 数据恢复测试 5 实例5.1 参数结构体定义5.2 存储参数到 SPI FLASH5.3 从 SPI FLASH 读取参数5…...
PHP支付宝--转账到支付宝账户
官方参考文档: https://opendocs.alipay.com/open/62987723_alipay.fund.trans.uni.transfer?sceneca56bca529e64125a2786703c6192d41&pathHash66064890 可以使用默认应用,也可以自建新应用,此处以默认应用来讲解【默认应用默认支持…...
太空飞船任务,生成一个地球发射、火星着陆以及下一次发射窗口返回地球的动画3D代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from mpl_toolkits.mplot3d import Axes3D# 天体参数设置(简化模型) AU 1.5e8 # 天文单位(公里) earth_orbital_radius …...
埃拉托斯特尼筛法来生成素数表【C语言】
代码: char *prime(int MAX) {char *a (char*)malloc(MAX * sizeof(char));if (a NULL) {fprintf(stderr, "Memory allocation failed\n");exit(EXIT_FAILURE);}memset(a, 1, MAX * sizeof(char));a[0] 0;a[1] 0;for (int i 2; i * i < MAX; i) …...
VSCode 实用快捷键
前文 VSCode 作为文本编辑神器, 熟练使用其快捷键更是效率翻倍, 本文介绍 VSCode 常用的实用的快捷键 实用快捷键 涉及到文本操作, 搜索定位, 多光标, 面板打开等快捷键 功能快捷键复制光标当前行 (不需要鼠标选中) Ctrl C 剪切光标当前行 (不需要鼠标选中) Ctrl X 当前行下…...
Ubuntu24.04无脑安装docker(含图例)
centos系统请看这篇 Linux安装Docker教程(详解) 一. ubuntu更换软件源 请看这篇:Ubuntu24.04更新国内源 二. docker安装 卸载老版docker(可忽略) sudo apt-get remove docker docker-engine docker.io containerd runc更新软件库 sudo a…...
近地面无人机植被定量遥感与生理参数反演
近地面无人机植被遥感是指利用无人机(UAV)搭载传感器,在低空(通常低于 100 米)对植被进行高分辨率遥感观测和数据采集的技术。这种技术结合了无人机的高灵活性和遥感的高精度,广泛应用于农业、生态学、林业…...
如何创建自定义权限的kubeconfig
如何创建自定义权限的kubeconfig 有些小伙伴问如何做自定义权限的kubeconfig首先看下我们怎么了解我们控制的权限的api以及涉及的资源和动作权限从哪里可以轻松查看了解了上面的,接下来就简单了,和简单的授权流程一致1、创建一个账户2、创建想要的角色或…...
使用 pjsua2 开发呼叫机器人,批量拨打号码并播放固定音频
如何使用 pjsua2 开发呼叫机器人,批量拨打号码并播放固定音频 声明 该播客仅提供实现思路,并非实际的方案记录,不要盲目照搬。 pjsua2库的安装会有较多问题,请参考本人之前的播客进行安装 pjsua2。 pjsua2 库具体的 api 说明请参考开源库内的 范例代码。 引言 在今天的…...
使用nvm管理node.js版本,方便vue2,vue3开发
在Vue项目开发过程中,我们常常会遇到同时维护Vue2和Vue3项目的情况。由于不同版本的Vue对Node.js 版本的要求有所差异,这就使得Node.js 版本管理成为了一个关键问题。NVM(Node Version Manager)作为一款强大的Node.js 版本管理工具…...
Breakout Tool
思科 CML 使用起来还是很麻烦的,很多操作对于习惯了 secure crt 或者 putty 等工具的网络工程师都不友好。 Breakout Tool 提供对远程实验室中虚拟机控制台与图形界面的本地化接入能力,其核心特性如下: Console 访问:基于 Telnet…...
网络安全-攻击流程-用户层
用户层攻击主要针对操作系统中的用户空间应用程序及用户权限,利用软件漏洞、配置错误或用户行为弱点进行攻击。以下是常见的用户层攻击类型及其流程,以及防御措施: 1. 缓冲区溢出攻击 攻击流程: 目标识别:确定存在漏…...
内网下,Ubuntu (24.10) 离线安装docker最新版教程
一般在数据比较敏感的情况下,是无法使用网络的,而对于Ubuntu系统来说,怎么离线安装docker呢? 下面我给大家来讲一下: 采用二进制安装: 1.下载docker离线包 官网下载: Index of linux/static…...
用deepseek学大模型08-卷积神经网络(CNN)
yuanbao.tencent.com 从入门到精通卷积神经网络(CNN),着重介绍的目标函数,损失函数,梯度下降 标量和矩阵形式的数学推导,pytorch真实能跑的代码案例以及模型,数据,预测结果的可视化展示, 模型应用场景和优缺点…...
6.【线性代数】—— 列空间和零空间
六 列空间和零空间 1. 列空间 C(A)2. 零空间 N(A)2.1 定义2.2 为什么零空间是一个子空间?2.3 Axb的解空间,是一个子空间吗? 1. 列空间 C(A) [ c o l 11 c o l 21 c o l 31 c o l 12 c o l 22 c o l 32 c o l 13 c o l 23 c o l 33 ] ⏟ A [ a…...
Spring SmartLifecycle:精准控制Bean的生命周期
一、核心作用 SmartLifecycle 是 Spring 框架中用于 精确控制组件生命周期阶段 的高级接口,主要解决三类问题: 有序启停:控制多个组件启动/关闭顺序阶段化处理:将初始化/销毁操作划分为不同阶段上下文感知:获取应用上…...
【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析②】
ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase02 作者:车端域控测试工程师 更新日期:2025年02月15日 关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-002测试用例 用例ID测试场景验证要点参考条款预期…...
gitee SSH 公钥设置教程
Gitee 提供了基于 SSH 协议的 Git 服务,在使用 SSH 协议访问仓库仓库之前,需要先配置好账户 SSH 公钥。 1、生成秘钥 Windows 用户建议使用 Windows PowerShell 或者 Git Bash,在 命令提示符 下无 cat 和 ls 命令。 ssh-keygen -t ed25519 -C "Gitee SSH Key"中间…...
Wireshark 输出 数据包列表本身的值
在 Wireshark 中,如果你想输出数据包列表本身的值(例如,将数据包的摘要信息、时间戳、源地址、目的地址等导出为文本格式),可以使用 导出为纯文本文件 的功能。以下是详细步骤: 步骤 1:打开 Wir…...
electron 学习
文章目录 1.注意项1.1 安装前最好设置一下代理 官网 tutorial https://www.electronjs.org/docs/latest/tutorial/tutorial-prerequisites 1.注意项 1.1 安装前最好设置一下代理 npm config set registry https://registry.npmmirror.com/...
Asp.Net Core MVC 中级开发教程
Asp.Net Core MVC 中级开发教程 一、Asp.Net Core Mvc 区域使用 ASP.NET Core MVC的Areas使用整理 - 天马3798 - 博客园 二、Asp.Net Core 路径处理 Asp.Net Core Web相对路径、绝对路径整理 Asp.Net Core获取当前上下文对象 三、Asp.Net Core 服务使用和封装 四、Asp.Net …...
DeepSeek与ChatGPT的全面对比
在人工智能(AI)领域,生成式预训练模型(GPT)已成为推动技术革新的核心力量。OpenAI的ChatGPT自发布以来,凭借其卓越的自然语言处理能力,迅速占据市场主导地位。然而,近期中国AI初创公…...
什么是网络安全?网络安全防范技术包括哪些?
伴随着互联网的发展,它已经成为我们生活中不可或缺的存在,无论是个人还是企业,都离不开互联网。正因为互联网得到了重视,网络安全问题也随之加剧,给我们的信息安全造成严重威胁,而想要有效规避这些风险&…...
使用Java爬虫获取1688按图搜索商品(拍立淘API接口)
在电商领域,按图搜索商品(拍立淘)是一种非常实用的功能,尤其适合用户通过图片快速查找相似商品。1688开放平台提供了按图搜索商品的API接口,允许开发者通过图片获取相关的商品信息。本文将详细介绍如何使用Java爬虫技术…...
物联网技术赋能预测性维护的深度剖析与前景展望
一、引言 1.1 研究背景与意义 随着信息技术的飞速发展,物联网技术已逐渐渗透到各个行业领域,成为推动产业变革和创新的重要力量。物联网通过将各种设备、物品与互联网连接,实现数据的采集、传输和交互,为各行业带来了前所未有的智能化和自动化水平提升。在工业领域,设备…...
前端工程化的具体实现细节
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
Dav_笔记14:优化程序提示 HINTs -4
指定全局表提示 指定表的提示通常是指发生提示的DELETE,SELECT或UPDATE查询块中的表,而不是指语句引用的任何视图中的表。 如果要为显示在视图中的表指定提示,Oracle建议使用全局提示,而不是在视图中嵌入提示。 您可以使用包含具…...
解锁享元模式:内存优化与性能提升的关键密码
系列文章目录 待后续补充~~~ 文章目录 一、享元模式初相识二、享元模式的核心概念2.1 内部状态与外部状态2.2 享元角色剖析 三、Java 代码中的享元模式3.1 简单示例代码实现3.2 代码解析与关键步骤 四、实际应用场景探秘4.1 文本编辑器中的享元模式4.2 游戏开发中的享元模式4.3…...
负载均衡 方式
DNS 软件负载均衡 Nginx 也是 软件负载均衡 各种策略 1、轮询(默认) 2、weight(权重) 3、IP Hash (会话粘滞) 4、fair 5、UrlHash...
CAS单点登录(第7版)18.日志和审计
如有疑问,请看视频:CAS单点登录(第7版) 日志和审计 Logging 概述 Logging CAS 提供了一个日志记录工具,用于记录重要信息事件,如身份验证成功和失败;可以对其进行自定义以生成用于故障排除的其他信息。…...
Linux多版本管理工具介绍
一、update-alternatives工具 1. 简介 update-alternatives是Linux系统自带的一个用于管理多个版本命令的工具。它允许用户在不同的软件版本之间进行切换,而不需要手动修改环境变量或者链接文件。 2. 基本使用 查看已安装的alternatives 使用命令update-alterna…...
DeepSeek笔记(二):DeepSeek局域网访问
如果有多台电脑,可以通过远程访问,实现在局域网环境下多台电脑共享使用DeepSeek模型。在本笔记中,首先介绍设置局域网多台电脑访问DeepSeek-R1模型。 一、启动Ollama局域网访问 1.配置环境变量 此处本人的操作系统是Windows11,…...
摄像头畸变矫正
简单介绍 所谓畸变其实就是由摄像头引起的图片失真, 一般在广角摄像头表现明显, 原本平整的桌面通过镜头看像个球面, 直观的解释直线被拍成了曲线, 这让我想起来了一个表情包. 去畸变的办法 首先我们需要一个标准棋盘(印有特定的标定图案), 如图: 把它摊平放在桌子上, 然后用…...
EasyRTC:智能硬件适配,实现多端音视频互动新突破
一、智能硬件全面支持,轻松跨越平台障碍 EasyRTC 采用前沿的智能硬件适配技术,无缝对接 Windows、macOS、Linux、Android、iOS 等主流操作系统,并全面拥抱 WebRTC 标准。这一特性确保了“一次开发,多端运行”的便捷性,…...
机器视觉--图像的运算(乘法)
一、引言 在图像处理领域,Halcon 是一款功能强大且广泛应用的机器视觉软件库。它提供了丰富的算子和工具,能够满足各种复杂的图像处理需求。图像的乘法运算作为其中一种基础操作,虽然不像一些边缘检测、形态学处理等操作那样被频繁提及&…...
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
Day 5:哈希表应用(两数之和、重复元素判断) 一、哈希表(Hash Table)基础 1. 什么是哈希表? 哈希表(Hash Table) 是一种键值对(key-value)存储的数据结构&…...
Kafka分区管理大师指南:扩容、均衡、迁移与限流全解析
#作者:孙德新 文章目录 分区分配操作(kafka-reassign-partitions.sh)1.1 分区扩容、数据均衡、迁移(kafka-reassign-partitions.sh)1.2、修改topic分区partition的副本数(扩缩容副本)1.3、Partition Reassign场景限流1.4、节点内副本移动到不…...
vue 接口传formdata
在Vue中,如果你需要向服务器发送FormData对象,通常是为了上传文件或者需要发送表单数据。FormData是一个非常有用的工具,因为它可以直接使用表单元素的值以及文件内容,并以一种浏览器兼容的方式来发送这些数据。下面是如何在Vue中…...
图像处理篇---基本OpenMV图像处理
文章目录 前言1. 灰度化(Grayscale)2. 二值化(Thresholding)3. 掩膜(Mask)4. 腐蚀(Erosion)5. 膨胀(Dilation)6. 缩放(Scaling)7. 旋转…...