机器学习之聚类——MeanShift算法和图像矢量量化

简介: 机器学习之聚类——MeanShift算法和图像矢量量化

MeanShift:见名知意

       大家英语怎么样,不好也没关系,没有人比百度更懂翻译。看看这个算法的名字,Mean和Shift紧紧相随,Mean的意思是平均值,Shift的意思是转移,挪动,可以更形象的解释为漂移。组合起来就是均值漂移。

       MeanShift 这个概念最早是由Fukunaga等人于1975年在一篇关于概率密度梯度函数的估计中提出来的。然而在以后的很长一段时间内 MeanShift 并没有引起人们的注意,直到20年以后,也就是1995年,YizongCheng发表了一篇对均值漂移算法里程碑意义的文章,大大扩大了 MeanShift 的适用范围,另外YizongCheng指出了 MeanShift 可能应用的领域,并给出了具体的例子。

算法原理及优缺点

       MeanShift 算法的思路是这样的:

       我们以二维的数据为例,首先以平面内任意一个点为圆心,以半径R画一个圆(也有可能是矩形、椭圆形),形成所谓感兴趣区域,然后计算感兴趣区域中所有数据样本点的质心,这个质心大概率与刚才的圆心不同,圆心到质心的向量就是漂移向量,如下图:

然后再以上面的漂移向量的终点,即上一步的质心为圆心,继续上述过程,又可以得到一个新的质心和漂移向量,如下图:

然后不断地继续这样的过程,直到算法收敛,比如两次质心的偏移量足够小时,则结束算法

可以预见,算法过程最终的效果就是:圆心从起点开始,最终会一步一步走到样本数据最密集的地方

这里说明一下核函数的概念,在计算质心时,核函数决定了感兴趣区域内各样本点对质心的贡献,下面是几个常用的核函数:

原理介绍了,总结一下它的优缺点吧:

优点:

1、与K-Means算法不一样的是,MeanShift算法可以自动决定类别的数目。

2、不受异常值影响。

3、没有局部最小值。

缺点:

1、在高维空间数据下表现不佳。

2、无法指定聚类的数量。

图片的矢量量化

       简单来讲,图片的矢量量化就是用更少的颜色种类来表达图片,颜色可以用数据表达,所以矢量量化可以看作是对图片数据的压缩。原图片可能有很多种颜色,有着丰富的表达力,经过矢量量化处理后,图片的颜色变化更加生硬,颜色边界更清晰。在具体的程序处理中,可以对图片的像素数据进行聚类,用聚类中心代替原图片中属于该聚类的像素点。这里的聚类可以使用多种聚类算法,比如K-means、AP聚类、MeanShift等,本文采用MeanShift。好了,上代码!

我们处理的素材是经典的Lena

代码如下:

from PIL import Image
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from sklearn.cluster import MeanShift
from sklearn.metrics import euclidean_distances
 
 
# 将像素数据转化为图像
def restore_image(cb, cluster, shape):
    row, col, dummy = shape
    _image = np.empty((row, col, 3))
    index = 0
    for _r in range(row):
        for _c in range(col):
            _image[_r, _c] = cb[cluster[index]]
            index += 1
    return _image
 
 
if __name__ == '__main__':
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    matplotlib.rcParams['axes.unicode_minus'] = False
    # 加载图像并对图像数据进行预处理
    im = Image.open('.\\lena.png')
    image = np.array(im).astype(float) / 255
    image = image[:, :, :3]
    # 摊平像素数据
    image_v = image.reshape((-1, 3))
    # 图像像素总数
    N = image_v.shape[0]
    # 选择足够多的样本(如1000个),计算聚类中心
    idx = np.random.randint(0, N, size=1000)
    image_sample = image_v[idx]
    # 取像素点欧氏距离中值最为MeanShift感兴趣区域半径
    m = euclidean_distances(image_sample, squared=True)
    band_width = np.median(m)
    # 模型
    model = MeanShift(bin_seeding=True, bandwidth=band_width)
    # 训练
    ms = model.fit(image_sample)
    # 簇中心
    centers = ms.cluster_centers_
    # 聚类图片像素
    c = model.predict(image_v)
    # 像素类别标签
    y_hat = ms.labels_
    # 聚类个数
    n_clusters = np.unique(y_hat).size
    print('聚类结果:\n', c)
    print('带宽:', band_width, '聚类簇的个数为:', n_clusters)
    # 绘制结果
    plt.figure(figsize=(12, 6), facecolor='w')
    plt.subplot(121)
    plt.axis('off')
    plt.title('原始图片', fontsize=14)
    plt.imshow(image)
 
    plt.subplot(122)
    vq_image = restore_image(centers, c, image.shape)
    plt.axis('off')
    plt.title('矢量量化后图片:%d色' % n_clusters, fontsize=14)
    plt.imshow(vq_image)
 
    plt.tight_layout()
    plt.subplots_adjust(top=0.9)
    # plt.show()
    plt.savefig('VectorQuantization.png')

运行效果如下:

 

作者这水平有限,有不足之处欢迎留言指正

相关文章
|
4天前
|
机器学习/深度学习 算法 数据挖掘
算法金 | K-均值、层次、DBSCAN聚类方法解析
**摘要:** 这篇文章介绍了聚类分析的基本概念和几种主要的聚类算法。聚类是无监督学习中用于发现数据内在结构的技术,常用于市场分析、图像分割等场景。K-均值是一种基于划分的算法,简单高效但易受初始值影响;层次聚类包括凝聚和分裂方式,形成层次结构但计算复杂;DBSCAN基于密度,能处理任意形状的簇,但参数选择敏感。文章还讨论了这些算法的优缺点和适用场景,并提供了相关资源链接和Python实现。
28 9
算法金 | K-均值、层次、DBSCAN聚类方法解析
|
4天前
|
机器学习/深度学习 人工智能 算法
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
昆虫识别系统,使用Python作为主要开发语言。通过TensorFlow搭建ResNet50卷积神经网络算法(CNN)模型。通过对10种常见的昆虫图片数据集('蜜蜂', '甲虫', '蝴蝶', '蝉', '蜻蜓', '蚱蜢', '蛾', '蝎子', '蜗牛', '蜘蛛')进行训练,得到一个识别精度较高的H5格式模型文件,然后使用Django搭建Web网页端可视化操作界面,实现用户上传一张昆虫图片识别其名称。
113 7
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
|
5天前
|
机器学习/深度学习 人工智能 算法
算法金 | 统计学的回归和机器学习中的回归有什么差别?
**摘要:** 统计学回归重在解释,使用线性模型分析小数据集,强调假设检验与解释性。机器学习回归目标预测,处理大数据集,模型复杂多样,关注泛化能力和预测误差。两者在假设、模型、数据量和评估标准上有显著差异,分别适用于解释性研究和预测任务。
33 8
算法金 | 统计学的回归和机器学习中的回归有什么差别?
|
1天前
|
机器学习/深度学习 人工智能 自然语言处理
机器学习算法入门:从K-means到神经网络
【6月更文挑战第26天】机器学习入门:从K-means到神经网络。文章涵盖了K-means聚类、逻辑回归、决策树和神经网络的基础原理及应用场景。K-means用于数据分组,逻辑回归适用于二分类,决策树通过特征划分做决策,神经网络则在复杂任务如图像和语言处理中大显身手。是初学者的算法导览。
|
3天前
|
算法 计算机视觉
基于Chan-Vese算法的图像边缘提取matlab仿真
**算法预览展示了4幅图像,从边缘检测到最终分割,体现了在matlab2022a中应用的Chan-Vese水平集迭代过程。核心代码段用于更新水平集并显示迭代效果,最后生成分割结果及误差曲线。Chan-Vese模型(2001)是图像分割的经典方法,通过最小化能量函数自动检测平滑区域和清晰边界的图像分割,适用于复杂环境,广泛应用于医学影像和机器视觉。**
|
2天前
|
机器学习/深度学习 算法 数据挖掘
Python机器学习10大经典算法的讲解和示例
为了展示10个经典的机器学习算法的最简例子,我将为每个算法编写一个小的示例代码。这些算法将包括线性回归、逻辑回归、K-最近邻(KNN)、支持向量机(SVM)、决策树、随机森林、朴素贝叶斯、K-均值聚类、主成分分析(PCA)、和梯度提升(Gradient Boosting)。我将使用常见的机器学习库,如 scikit-learn,numpy 和 pandas 来实现这些算法。
|
1天前
|
算法 数据挖掘 数据库
详尽分享聚类算法实现(二)DBSCAN
详尽分享聚类算法实现(二)DBSCAN
|
2天前
|
机器学习/深度学习 自然语言处理 算法
m基于深度学习的OFDM+QPSK链路信道估计和均衡算法误码率matlab仿真,对比LS,MMSE及LMMSE传统算法
**摘要:** 升级版MATLAB仿真对比了深度学习与LS、MMSE、LMMSE的OFDM信道估计算法,新增自动样本生成、复杂度分析及抗频偏性能评估。深度学习在无线通信中,尤其在OFDM的信道估计问题上展现潜力,解决了传统方法的局限。程序涉及信道估计器设计,深度学习模型通过学习导频信息估计信道响应,适应频域变化。核心代码展示了信号处理流程,包括编码、调制、信道模拟、降噪、信道估计和解调。
23 8
|
4天前
|
算法
基于GA遗传优化的混合发电系统优化配置算法matlab仿真
**摘要:** 该研究利用遗传算法(GA)对混合发电系统进行优化配置,旨在最小化风能、太阳能及电池储能的成本并提升系统性能。MATLAB 2022a用于实现这一算法。仿真结果展示了一系列图表,包括总成本随代数变化、最佳适应度随代数变化,以及不同数据的分布情况,如负荷、风速、太阳辐射、弃电、缺电和电池状态等。此外,代码示例展示了如何运用GA求解,并绘制了发电单元的功率输出和年变化。该系统原理基于GA的自然选择和遗传原理,通过染色体编码、初始种群生成、适应度函数、选择、交叉和变异操作来寻找最优容量配置,以平衡成本、效率和可靠性。
|
5天前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。

热门文章

最新文章