动易网站安装网站优化的方法与技巧
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:19
当前位置: 首页 > news >正文
动易网站安装,网站优化的方法与技巧,wordpress社群模板,百度品牌广告收费标准基于 sklearn 的均值偏移聚类算法的应用 在机器学习和数据挖掘中#xff0c;聚类算法是一类非常重要的无监督学习方法。它的目的是将数据集中的数据点划分为若干个类#xff0c;使得同一类的样本点彼此相似#xff0c;而不同类的样本点相互之间差异较大。均值偏移聚类…基于 sklearn 的均值偏移聚类算法的应用 在机器学习和数据挖掘中聚类算法是一类非常重要的无监督学习方法。它的目的是将数据集中的数据点划分为若干个类使得同一类的样本点彼此相似而不同类的样本点相互之间差异较大。均值偏移聚类Mean Shift Clustering是一种基于密度的聚类方法可以很好地识别数据中的高密度区域。 1. 什么是均值偏移聚类 均值偏移Mean Shift是一种基于密度峰值的无监督聚类算法最早由 Fukunaga 和 Hostetler 于1975年提出。 均值偏移聚类算法是通过计算数据点的局部均值来不断更新每个数据点的位置直到所有的数据点都趋于聚集在密度较高的区域。其本质上是一种基于梯度上升的方式通过对数据点的迭代移动找到最密集的区域最后将数据点聚集成簇。 与传统的基于距离的聚类方法如K-means不同均值偏移聚类不需要预先指定簇的数量它自动寻找数据分布的密度极值点进行聚类能够处理非规则形状的数据分布。 1.1 核心特点 无需预先指定聚类数量自动发现任意形状的簇对噪声数据具有健壮性基于核密度估计的概率方法 2. 均值偏移的数学模型 2.1 质心候选位置的调整 这段描述了一个迭代过程称为爬山算法hill climbing该过程用于找到估计概率密度的局部最大值。爬山算法是一种启发式搜索方法通过不断地调整候选解的值逐步逼近目标的最优解。 给定一个候选质心的位置 x t x^t xt我们通过以下公式来更新候选质心的位置 x t 1 x t m ( x t ) x^{t1} x^t m(x^t) xt1xtm(xt) 其中 m ( x t ) m(x^t) m(xt) 是一个均值漂移向量mean shift vector它指向数据点密度增加的区域。 2.2 均值漂移向量的计算 均值漂移向量 m ( x t ) m(x^t) m(xt) 是通过计算每个质心所在邻域内的点的均值来更新质心的位置。为了计算这个向量我们首先定义质心 x t x^t xt 的邻域 N ( x t ) N(x^t) N(xt)即在给定距离范围内的所有样本点。接着均值漂移向量的计算公式如下 m ( x ) 1 ∣ N ( x ) ∣ ∑ x j ∈ N ( x ) x j − x m(x) \frac{1}{|N(x)|} \sum_{x_j \in N(x)} x_j - x m(x)∣N(x)∣1xj∈N(x)∑xj−x 其中 N ( x ) N(x) N(x) 是质心 x x x 的邻域 x j xj xj 是邻域内的样本点 ∣ N ( x ) ∣ |N(x)| ∣N(x)∣ 是邻域内样本点的数量 x x x 是当前的质心。 这个公式的意思是计算邻域内所有点的均值并通过减去当前质心的位置得到一个向量。这个向量指示质心应该如何调整位置。 2.3 核函数的使用 通常均值漂移向量的计算依赖于用于密度估计的核函数。上面给出的均值漂移向量公式是一个通用的公式 m ( x ) ∑ x j ∈ N ( x ) K ( x j − x ) x j ∑ x j ∈ N ( x ) K ( x j − x ) − x m(x) \frac{\sum{x_j \in N(x)} K(x_j - x) xj}{\sum{x_j \in N(x)} K(x_j - x)} - x m(x)∑xj∈N(x)K(xj−x)∑xj∈N(x)K(xj−x)xj−x 其中 K ( x j − x ) K(x_j - x) K(xj−x) 是一个核函数衡量了每个邻域点 x j x_j xj 与当前质心 x x x 之间的相似度。通过这种方式质心的更新不仅仅依赖于邻域点的位置还考虑了每个点的重要性通过核函数的加权。 2.4 核函数的特性 在我们的实现中核函数 K ( x j − x ) K(x_j - x) K(xj−x) 的值会根据点 x j x_j xj 与质心 x x x 的距离决定 当 x j x_j xj 与 x x x 的距离较小即 K ( x j − x ) K(x_j - x) K(xj−x) 较大时核函数值为 1。当 x j x_j xj 与 x x x 的距离较大即 K ( x j − x ) K(x_j - x) K(xj−x) 较小时核函数值为 0。 核函数的作用是决定哪些点在质心的邻域内以及这些点对质心更新的贡献大小。 3. 参数说明 from sklearn.cluster import MeanShiftMeanShift(*,bandwidthNone, # 控制邻域大小的核心参数影响聚类的精度和速度seedsNone, # 控制初始化的方式可以加速或精确化聚类过程。bin_seedingFalse, # 使用分箱方法来选择种子点min_bin_freq1, # 在分箱方法中每个区域内至少n个样本点才能被选择为种子点cluster_allTrue, # 是否将所有数据点都归类为簇或者标记为噪声点n_jobsNone, # 使得聚类过程能够并行化从而加速计算max_iter300, # 设置算法的最大迭代次数以避免过长的计算时间 )bandwidth (float) 描述: 这个参数控制用于确定每个点邻域范围的带宽。带宽定义了“邻域”的大小即每个点在计算均值漂移向量时考虑的邻域半径。如果未指定则算法会根据数据自动估计合适的带宽。 作用: 影响均值漂移的结果带宽越大每个质心的“邻域”越大算法可能会合并更多的簇带宽越小簇会更细致可能会产生更多的簇。 seeds (array-like) 描述: 用于初始化质心的种子点。如果为 None默认将会使用数据中的点作为种子点。可以通过传入一个自定义的种子点集合来控制算法的初始化过程。 作用: 影响聚类结果的初始位置指定种子点后可以加速聚类过程。 bin_seeding (bool) 描述: 如果为 True则使用分箱方法来选择种子点。分箱方法将数据分成多个小区域在每个区域中选择一个点作为种子从而减少计算量。如果为 False则使用所有数据点作为种子。 作用: 在大规模数据集上可以加速聚类过程减少计算复杂度。 min_bin_freq (int) 描述: 如果启用了 bin_seeding则该参数指定了在分箱方法中每个区域内至少需要有多少个样本点才能被选择为种子点。 作用: 影响种子点选择的频率较高的 min_bin_freq 值将减少种子点的数量。 cluster_all (bool) 描述: 如果为 True则所有的点都会被归类到某个簇中。如果为 False则没有找到密度极大值的点会被标记为 -1表示这些点没有归属于任何簇类似于离群点。 作用: 如果设置为 False会将不符合某个簇条件的点视为噪声或离群点常用于检测离群点。 n_jobs (int) 描述: 用于并行计算的工作线程数。n_jobs-1 会使用所有可用的 CPU 核心。默认情况下None 表示不使用并行计算即单线程。 作用: 如果数据量较大可以设置为 -1 来加速计算过程利用多核并行处理。 max_iter (int) 描述: 算法的最大迭代次数。在均值漂移过程中质心会不断地向密度极大值移动max_iter 限制了算法最多执行多少次迭代。如果算法在达到最大迭代次数之前收敛算法会提前停止。 作用: 控制算法的计算复杂度和时间。如果数据分布较复杂可能需要更多的迭代来达到收敛。 4. 均值偏移聚类样例 4.1 生成样例数据并聚类
导入必要的库
import numpy as np from sklearn.cluster import MeanShift, estimate_bandwidth # 导入均值偏移聚类和带宽估计函数 from sklearn.datasets import make_blobs # 用于生成模拟数据集的函数# 定义聚类的中心点 centers [[1, 1], [-1, -1], [1, -1]]# 生成模拟数据集包含10000个样本指定中心点和簇的标准差 X, _ make_blobs(n_samples10000, centerscenters, cluster_std0.6)# 使用估计带宽函数自动检测带宽量化值设为0.2选择500个样本计算带宽 bandwidth estimate_bandwidth(X, quantile0.2, n_samples500)# 创建均值偏移聚类对象并设定带宽和开启二值化种子 ms MeanShift(bandwidthbandwidth, binseedingTrue)# 对数据进行聚类 ms.fit(X)# 获取聚类标签和簇中心 labels ms.labels cluster_centers ms.clustercenters# 获取聚类标签的唯一值即不同的簇标签 labels_unique np.unique(labels)# 获取簇的数量 nclusters len(labels_unique)# 输出聚类的估计数量 print(估计的簇数量: %d % nclusters)
输出簇中心
print(簇中心为: \n, cluster_centers)估计的簇数量: 3 簇中心为: [[ 0.92930747 -0.92997006] [-0.90712668 -0.97393151] [ 1.02412056 0.94250739]] 4.2 可视化结果
导入绘图工具
import matplotlib.pyplot as plt import seaborn as sns # 导入seaborn库来美化图表sns.set_theme(stylewhitegrid, fontSimHei, rc{axes.unicode_minus: False}) # 设置主题和字体# 设定颜色和标记符号 colors [#dede00, #377eb8, #f781bf] markers [x, o, ^]# 绘制每个簇的样本点并标记簇的中心 for k, col in zip(range(nclusters), colors):my_members labels k # 获取属于第k个簇的样本cluster_center cluster_centers[k] # 获取第k个簇的中心plt.plot(X[my_members, 0], X[my_members, 1], markers[k], colorcol, labelf集群 {k1}, alpha0.4) # 绘制簇的样本点plt.plot(cluster_center[0],cluster_center[1],markers[k],markerfacecolorcol,markeredgecolork,markersize14,# labelf聚类中心点 {k1} # 绘制簇的中心点)# 设置图表标题 plt.title(均值偏移聚类样例结果)# 显示图表 plt.legend() # 显示图例 plt.show()5. 均值偏移聚类算法的应用 均值偏移聚类算法在计算机视觉图像分割、目标追踪、视频分析……、用户行为分析电商用户分群、社交网络社区发现、异常检测……、生物信息学基因表达数据分析、蛋白质结构分类……和地理信息系统卫星图像分析、人口密度研究……等领域中被广泛应用。 5.1 图像分割 5.1.1 选择图像flowers-6558487_640 5.1.2 导入图片并进行分割 import numpy as np import matplotlib.pyplot as plt import matplotlib.image as mpimg import seaborn as sns from sklearn.cluster import MeanShift, estimate_bandwidth from sklearn.datasets import load_sample_image from sklearn.preprocessing import StandardScaler# 设置 Seaborn 样式 sns.set_theme(stylewhitegrid, fontSimHei, rc{axes.unicode_minus: False}) # 设置主题和字体# 加载示例图像 img mpimg.imread(flowers-6558487_640.jpg)# 将图像转换为二维数组准备聚类 image_data img.reshape((-1, 3)) # 每个像素点是一个RGB值# 进行标准化 scaler StandardScaler() image_data_scaled scaler.fit_transform(image_data)# 估算带宽bandwidth bandwidth estimate_bandwidth(image_data_scaled, quantile0.1, n_samples500)# 使用均值偏移进行聚类 mean_shift MeanShift(bandwidthbandwidth, bin_seedingTrue) mean_shift.fit(image_data_scaled)# 获取聚类结果 labels meanshift.labels# 将聚类标签重新映射为图像 segmented_image labels.reshape(img.shape[:2])# 显示原图和分割结果 fig, ax plt.subplots(1, 2, figsize(12, 10))ax[0].imshow(img) ax[0].set_title(原始图像) ax[0].axis(off)ax[1].imshow(segmented_image, cmapjet) ax[1].set_title(聚类分割结果(MeanShift)) ax[1].axis(off)plt.show()5.1.3 显示分割结果
统计聚类数量
n len(set(labels))# 将标签重新变为图像的形状 segmented_image_list []# 创建每个簇的分割图像 for cluster in range(n): # 假设我们有3个簇# 创建一个全为0的图像与原图尺寸一致segmented_image np.zeros_like(img)# 将属于该簇的像素赋值为原图像素其他像素设置为黑色# 获取属于该簇的像素的索引cluster_pixels labels cluster# 将符合条件的像素赋值segmented_image.reshape(-1, 3)[cluster_pixels] img.reshape(-1, 3)[cluster_pixels]# 添加到分割图像列表中segmented_image_list.append(segmented_image)# 创建子图布局 fig, axes plt.subplots(1, n, figsize(12, 10))# 绘制每个聚类的分割图像 for i, ax in enumerate(axes.flat):ax.imshow(segmented_image_list[i]) # 显示分割后的图像ax.set_title(f聚类 {i1}, fontsize14) # 设置标题为聚类编号ax.axis(off) # 禁用坐标轴# 调整布局防止重叠 plt.tight_layout() plt.show()5.1.4 调整参数 由 5.1.3 图像可知黄色花朵被分割为了三个聚类聚类2、聚类3、聚类4说明效果不佳因此调整参数 quantile0.2 。
估算带宽bandwidth
bandwidth estimate_bandwidth(image_data_scaled, quantile0.2, n_samples500)5.2 异常检测 5.2.1 导入鸢尾花数据集并降维 import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn import datasets from sklearn.cluster import MeanShift from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler# 设置 Seaborn 样式 sns.set_theme(stylewhitegrid, fontSimHei, rc{axes.unicode_minus: False}) # 设置主题和字体# 加载鸢尾花数据集 iris datasets.load_iris() X iris.data y iris.target# 数据标准化 scaler StandardScaler() X_scaled scaler.fit_transform(X)# PCA降维到2维 pca PCA(n_components2) X_pca pca.fit_transform(X_scaled)# 绘制散点图 plt.figure(figsize(8, 6)) sns.scatterplot(xX_pca[:, 0], yX_pca[:, 1], hueNone, s100, edgecolork, alpha0.8) plt.title(鸢尾花数据集, fontsize16) plt.xlabel(主成分 1, fontsize12) plt.ylabel(主成分 2, fontsize12)# 设置网格线为虚线并设置透明度 plt.grid(colorgray, linestyle–, linewidth0.7, alpha0.5)# 显示图例 plt.show()5.2.2 添加异常数据并进行检测
在PCA降维后的数据中添加几个异常值
异常值远离正常数据点
outliers np.array([[4, 3], [-3, -3], [4, -4]]) # 假设我们人为添加3个异常点 X_pca_with_outliers np.vstack([X_pca, outliers])# 使用均值偏移聚类算法 mean_shift MeanShift(bandwidth1) mean_shift.fit(X_pca_with_outliers)# 获取聚类标签 labels meanshift.labels# 获取每个簇的大小 unique_labels, counts np.unique(labels, return_countsTrue) print(f聚类的簇数量: {len(unique_labels)})# 标记异常点
异常点的簇大小为1表示每个簇只包含一个样本
outliers_labels unique_labels[counts 1] # 找出簇大小为1的标签# 可视化聚类结果 plt.figure(figsize(8, 6))# 使用sns.scatterplot进行美化 sns.scatterplot(xX_pca_with_outliers[:, 0], yX_pca_with_outliers[:, 1], huelabels, paletteviridis, s100, alpha0.8, edgecolork, legendNone)# 标记异常点 for label in outliers_labels:outlier_points X_pca_with_outliers[labels label]plt.scatter(outlier_points[:, 0], outlier_points[:, 1], colorred, s100, markerx, label异常点)# 设置图表标题、轴标签 plt.title(均值偏移聚类与异常检测, fontsize16) plt.xlabel(主成分 1, fontsize12) plt.ylabel(主成分 2, fontsize12)# 显示图例
plt.legend(locupper right)
plt.show()聚类的簇数量: 7 6. 算法优缺点 优势 自动确定聚类数量对噪声不敏感适应任意形状的簇 局限 时间复杂度较高约O(n²)带宽选择对结果影响大不适用于高维数据
- 上一篇: 动易网站 修改栏目名字购物系统论文
- 下一篇: 动易网站开发城市建设网站金
相关文章
-
动易网站 修改栏目名字购物系统论文
动易网站 修改栏目名字购物系统论文
- 技术栈
- 2026年03月21日
-
动易网站 设置背景图片网络服务器施工方案
动易网站 设置背景图片网络服务器施工方案
- 技术栈
- 2026年03月21日
-
动易门户网站价格网站制作明细报价表
动易门户网站价格网站制作明细报价表
- 技术栈
- 2026年03月21日
-
动易网站开发城市建设网站金
动易网站开发城市建设网站金
- 技术栈
- 2026年03月21日
-
动易网站开发的主要技术产品如何做网站推广
动易网站开发的主要技术产品如何做网站推广
- 技术栈
- 2026年03月21日
-
动易网站设计方案网站程上传
动易网站设计方案网站程上传
- 技术栈
- 2026年03月21日






