【Python机器学习】聚类算法的对比与评估——在人脸数据集上比较算法

数据探查:

我们将k均值、DBSCAN和凝聚聚类算法应用于Wild数据集中的Labeled Faces,并查看它们是否找到了有趣的结构。我们将使用数据的特征脸表示,它由包含100个成分的PCA(whiten=True)生成:


people=fetch_lfw_people(data_home = "C:\\Users\\86185\\Downloads\\",min_faces_per_person=20,resize=.7)
image_shape=people.images[0].shape
mask=np.zeros(people.target.shape,dtype=np.bool_)
for target in np.unique(people.target):
    mask[np.where(people.target==target)[0][:50]]=1

X_people=people.data[mask]
y_people=people.target[mask]

pca=PCA(n_components=100,whiten=True,random_state=0)
pca.fit_transform(X_people)
X_pca=pca.transform(X_people)

与原始像素相比,这是对人脸图像的一种语义更强的表示,它的计算速度更快。

用DBSCAN分析人脸数据:

dbscan=DBSCAN()
labels=dbscan.fit_predict(X_pca)
print('标签:{}'.format(np.unique(labels)))

可以看到,所有返回的标签的-1,因此所有数据都被DBSCAN标记为噪声。我们可以改变两个参数来改进这一点:

1、增大eps,从而扩展每个点的邻域;

2、缩小min_samples,从而将更小的点视为簇。

首先尝试改变min_samples:

dbscan=DBSCAN(min_samples=3)
labels=dbscan.fit_predict(X_pca)
print('标签:{}'.format(np.unique(labels)))

可以看到,由3个点构成的组,所有点也被标记为噪声,因此需要增大eps:

dbscan=DBSCAN(min_samples=3,eps=15)
labels=dbscan.fit_predict(X_pca)
print('标签:{}'.format(np.unique(labels)))

使用更大的eps(15),只得到了单一簇和噪声点。我们可以利用这一结果找出噪声相对于其他数据的形状。

print('噪声、簇内点:{}'.format(np.bincount(labels+1)))

可以看到,噪声只有37个,因此可以查看所有的噪声点:


noise=X_people[labels==-1]
fig,axes=plt.subplots(5,9,subplot_kw={'xticks':(),'yticks':()},figsize=(12,4))
for image,ax in zip(noise,axes.ravel()):
    ax.imshow(image.reshape(image_shape),vmin=0,vmax=1)
plt.show()

可以看到,有些人脸图像在喝水(拿杯子)或者戴帽子等,猜测这就是被标记为噪声的原因。

这种类型的分析(尝试找出“奇怪的那一个”)被称为异常值检测。如果这是一个真实的应用,那么我们可以去尝试更好的裁切图像,以得到更均匀的数据。

如果想找到更有趣的簇,而不是一个非常大的簇,可以把eps设置的更小。

来看一下不同eps取值的结果:


for eps in [1,3,5,7,9,11,13]:
    print('\neps:{}'.format(eps))
    dbscan=DBSCAN(eps=eps,min_samples=3)
    labels=dbscan.fit_predict(X_pca)
    print('簇类别:{}'.format(np.unique(labels)))
    print('簇的大小:{}'.format(np.bincount(labels+1)))

对于较小的eps,所有的点都被标记为噪声。

eps=7时,会得到很多噪声点和一些较小的簇;

eps=9时,仍然会得到很多噪声点,但是会得到一个比较大的簇和一个较小的簇;

从eps=11开始,就只能得到一个较大的簇和一些噪声。

较大的簇从来没有超过过一个,最多有一个较大的簇包含大多数点,还有一些较小的簇。

我们可以通过研究eps=7时,将7个较小的簇中的点全部可视化来深入研究这个聚类:


dbscan=DBSCAN(min_samples=3,eps=7)
labels=dbscan.fit_predict(X_pca)
for cluster in range(max(labels)+1):
    mask=labels==cluster
    n_images=np.sum(mask)
    fig,axes=plt.subplots(1,n_images,figsize=(n_images*1.5,4),subplot_kw={'xticks':(),'yticks':()})
    for image,label,ax in zip(X_people[mask],y_people[mask],axes):
        ax.imshow(image.reshape(image_shape),vmin=0,vmax=1)
        ax.set_title(people.target_names[label].split()[-1])
    plt.show()

有一些簇对应这个数据集中一些脸部非常不同的人。

每个簇的人脸方向和面部表情也是固定、相似的。而有些簇中虽然包含多个人的面孔,但他们的方向和表情都比较相似。

用k均值分析人脸数据:

我们可以看到,利用DBSCAN无法创建多余一个较大的簇。凝聚聚类和k均值更可能创建均匀大小的簇。但我们需要设置簇的目标个数。

我们可以将簇设置为数据集中的已知个数,虽然无监督聚类算法不太可能完全得到他们。相反,我们可以先设置一个比较小的簇个数,这样我们可以分析每个簇:


km=KMeans(n_clusters=10,random_state=0)
label_km=km.fit_predict(X_pca)

print('簇的大小(k均值):{}'.format(np.bincount(label_km)))

可以看到,k均值聚类将数据划分为大小相似的簇,大小在60到363之间,这与DBSCAN非常不同。

通过将簇中心可视化来进一步分析k均值的结果。

由于我们是在PCA生成的表示中进行聚类,因此我们需要使用pca.inverse_transform将簇中心旋转回到原始空间并可视化:


fig,axes=plt.subplots(2,5,subplot_kw={'xticks':(),'yticks':()},figsize=(12,4))
for center,ax in zip(km.cluster_centers_,axes.ravel()):
    ax.imshow(pca.inverse_transform(center).reshape(image_shape),vmin=0,vmax=1)
plt.show()

k均值找到的簇中心是非常平滑的人脸。因为每个簇中心都是60到363张人脸图像的平均。使用降维的PCA表示,可以增加图像的平滑度。聚类似乎捕捉到人脸的不同方向、不同表情、以及是否有衬衫扣子之类的特征。

我们对每个簇中心给出了簇中5张最经典的图像(也就是该簇中与簇中心距离最近的图像)与5张最不典型的图像(也就是该簇中与簇中心距离最远的图像):

mglearn.plots.plot_kmeans_faces(km,pca,X_pca,X_people,y_people,people.target_names)
plt.show()

可以看到,“非典型的”点与簇中心不太相似,似乎分配有些随意。这可以归因于一下原因:k均值对所有数据点进行划分,不想DBSCAN那样具有噪声点的概念。

利用更多数量的簇,算法可以找到更细微的区别,但添加更多的簇会使得人工检查更为困难。

用凝聚聚类分析人脸数据:

下面看一下凝聚聚类的结果:

agglomerative=AgglomerativeClustering(n_clusters=10)
label_agg=agglomerative.fit_predict(X_pca)

print('簇的大小(凝聚聚类):{}'.format(np.bincount(label_agg)))

凝聚聚类生成的也是大小相近的簇,大小在49到553之间,这比k均值生成的簇更不均匀,但比DBSCAN生成的簇更加均匀。

我们可以通过计算ARI来度量凝聚聚类和k均值给出的两种数据划分是否相似:

km=KMeans(n_clusters=10,random_state=0)
label_km=km.fit_predict(X_pca)

print('ARI:{:.2f}'.format(adjusted_rand_score(label_agg,label_km)))

ARI只有0.09,说明labels_agg和labels_km这两种聚类的共同点很少,原因在于:对于k均值,原理簇中心的点似乎没有什么共同点。

下面绘制树状图,但是限制了数的深度,要不然全部呈现2063个数据点,图像无法阅读:

linkage_array=ward(X_pca)
plt.figure(figsize=(20,5))
dendrogram(linkage_array,p=7,truncate_mode='level',no_labels=True)
plt.xlabel('数据点')
plt.ylabel('簇 间距')
plt.show()

想要创建10个簇,我们要在顶部有10条竖线的位置将树横切。

我们将10个簇可视化。

在凝聚聚类内,没有簇中心的概念(虽然我们计算了平均值),我们芝士给出了每个簇的前几个点。


n_cluster=10
for cluster in range(n_cluster):
    mask=label_agg==cluster
    fig,axes=plt.subplots(1,10,figsize=(15,8),subplot_kw={'xticks':(),'yticks':()})
    axes[0].set_ylabel(np.sum(mask))
    for image,label,asdf,ax in zip(X_people[mask],y_people[mask],label_agg[mask],axes):
        ax.imshow(image.reshape(image_shape),vmin=0,vmax=1)
        ax.set_title(people.target_names[label].split()[-1],fontdict={'fontsize':9})
    plt.show()

虽然某些簇似乎具有语义上的主题,但其实很多簇都太大而实际上很难是均匀的。

为了得到更均匀的簇,我们可以再次运行算法,把簇设置为40个,并挑选一些特别的簇。

n_cluster=40
for cluster in [10,13,19,22,36]:
    mask=label_agg==cluster
    fig,axes=plt.subplots(1,15,figsize=(15,8),subplot_kw={'xticks':(),'yticks':()})
    cluster_size=np.sum(mask)
    axes[0].set_ylabel('#{}:{}'.format(cluster,cluster_size))
    for image,label,asdf,ax in zip(X_people[mask],y_people[mask],label_agg[mask],axes):
        ax.imshow(image.reshape(image_shape),vmin=0,vmax=1)
        ax.set_title(people.target_names[label].split()[-1],fontdict={'fontsize':9})
    for i in range(cluster_size,15):
        axes[i].set_visible(False)
    plt.show()

可以看到,被挑选的第一个是“笑脸”的簇,第二个是向右看,第三个是眯着眼,第四个基本都是大胡子。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为了提高出图效率,我做了一款可视化制作气泡图谱的小工具

嗨,大家好,我是徐小夕,之前和大家分享了很多可视化低代码的最佳实践,今天和大家分享一下我基于实际场景开发的小工具——BubbleMap。 demo地址:http://wep.turntip.cn/design/bubbleMap 开发背景 之前在公司做图表开发…

LINUX操作系统:Mx Linux,用虚拟机VMware Workstation安装体验

需求说明: 操作系统目前流行有Windows、Linux、Unix等,中国人应该要知道国有操作系统,也要支持国产操作系统,为了更好支持国产操作系统,我们也要知己知彼,那么今天就来体验一把操作系统Mx_Linux_23.2的安装…

mac m芯片下安装nacos

背景:最近再研究 下载地址: https://nacos.io/download/nacos-server/ 解压zip包 unzip nacos-server-2.3.2.zip启动 进入到bin目录下 ./startup.sh -m standalone访问可视化界面 账号密码都是nacos,进行登录即可,nacos的端口为…

打破网络通信界限,推动供应链数字化转型

在当前全球经济低迷的背景下,中国经济的发展模式正在转变,从规模扩张到品质提升,通过优势的整合和叠加,释放出新的生产力。2023年前三季度,中国国内生产总值达到91.3万亿元,同比增长了5.2%1,增速…

红酒与珠宝:璀璨与醇香的奢华交响,双重诱惑难挡

在璀璨的灯光下,红酒与珠宝各自闪耀着迷人的光芒,它们如同夜空中的繁星,交相辉映,共同演绎着奢华的双重诱惑。今天,就让我们一起走进这个充满魅力的世界,感受红酒与珠宝带来的无尽魅力。 首先,让…

1966 ssm 流浪猫领养网站系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 流浪猫领养网站系统是一套完善的信息系统,结合springMVC框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/…

红酒舞动,运动风采,品味力与美

当夜幕降临,城市的灯火渐次亮起,忙碌了一天的人们开始寻找那份属于自己的宁静与愉悦。在这个时刻,红酒与运动,这两个看似截然不同的元素,却能以它们不同的魅力,为我们带来一场视觉与感官的盛宴。 红酒&…

【八股系列】Vue中的<keep-alive>组件:深入解析与实践指南

🎉 博客主页:【剑九 六千里-CSDN博客】 🎨 上一篇文章:【探索响应式布局的奥秘:关键技术与实战代码示例】 🎠 系列专栏:【面试题-八股系列】 💖 感谢大家点赞👍收藏⭐评论…

如何在前端项目中制定代码注释规范

本文是前端代码规范系列文章,将涵盖前端领域各方面规范整理,其他完整文章可前往主页查阅~ 开始之前,介绍一下​最近很火的开源技术,低代码。 作为一种软件开发技术逐渐进入了人们的视角里,它利用自身独特的优势占领市…

要离职了,记录一下个人在用的 Mac 应用

大家好,我是楷鹏。 通用 飞书 说起来不信,第一个推荐的是【飞书】,飞书是目前用过最舒服的项目管理应用了。 单拎出来一个飞书文档,功能和体验远超市面上腾讯文档、石墨文档、语雀等等。 现在飞书还支持个人版,No…

ChatGPT的Mac客户端正式发布了

ChatGPT的Mac客户端正式发布了!Mac用户有福了 🎉 大家好,我是猫头虎,科技自媒体博主。今天我带来了一个超级重磅的消息 📢,就是 ChatGPT 的客户端终于来了!这对我们所有 Mac 用户,尤…

vue-cli 搭建项目,ElementUI的搭建和使用

vue-cli 官方提供的一个脚手架,用于快速生成一个vue的项目模板;预先定义 好的目录结构及基础代码,就好比咱们在创建Maven项目时可以选择创建一个 骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速; …

DHT11

第一个传感----DHT11 通过前面的学习,你已经学会了控制IO口、延时函数、串口的收发。接下来,你就可以借助以上的知识点完成自己的第一个传感器--DHT11啦! DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。应用非常广…

中文+Midjourney,能描画出什么样的作品呢?保姆级上手指南送给你

中文Midjourney,能描画出什么样的作品呢? 中文版Midjourney来了! 没有一点预热,Midjourney中文版(以下简称 MJCN)在本周开放了两次内测邀请,只需用 QQ 扫描邀请码,就可以在 QQ 频道…

PMP证书在国内已经泛滥了,大家怎么看?

目前,越来越多的人获得了PMP证书。自1999年PMP引入中国以来,全国累计PMP考试人数接近60万人次,通过PMP认证的人数约为42万人。虽然这个数据看起来很大,但绝对不能说是过多。 首先,PMP在中国并不普遍。根据美国项目管理…

浮动IP绑定主机步骤

文章目录 1,查看本机的原有IP2,绑定浮动IP3,验证绑定情况4,解绑浮动IP 1,查看本机的原有IP ifconfig得到本机的ip是192.168.10.128 2,绑定浮动IP ifconfig ens33:1 192.168.10.10 netmask 255.255.255.0…

Shopee、Lazada测评,是找服务商呢?还是建议自己养号补单呢?

目前大部分Shopee、Lazada的卖家由于运营成本的增加,都会找服务商测评来打造权重,但是找服务商有很多不靠谱,建议还是自行精养一批号,账号在手里比较安全可控,随时随地可以送测,精准搜索关键词货比三家下单…

【SQL】数据操作语言(DML) - 删除数据:精细管理数据的利刃

目录 前言 DELETE语句的基础使用 删除指定记录 清空表与删除表数据的区别 注意 前言 在数据库管理的日常工作中,数据的删除是一项需要格外小心的操作,因为一旦数据被删除,往往难以恢复。数据操作语言(DML)中的DELETE语句&am…

COMSOL -电力输电线的电场和磁场仿真

为确保电力输电线周围人员和环境的安全,工程师必须对电力线产生的电场和磁场进行监控。通过多物理场仿真,工程师能够预测电力线产生的场如何从电力线中扩散,以及如何影响其辐射至地面的强度。这篇文章,我们将使用两个示例模型来说…