【Python机器学习】k均值聚类——矢量量化,或者将k均值看作分解

news2025/1/17 17:58:39

虽然k均值是一种聚类算法,但在k均值和分解方法之间存在一些相似之处。k均值尝试利用簇中心来表示每个数据点,可以看作仅用一个分量来表示每个数据点,该分量由簇中心给出。这种观点将k均值看作是一种分解方法,其中每个点用单一分量来表示。这种观点被称为矢量量化

我们来并排比较PCA、NMF和k均值,分别显示提取的分量,以及利用100个分量对测试集中人脸的重建。对于k均值,重建就是在训练集中找到最近的簇中心:

import mglearn.plots
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs,make_moons
from sklearn.cluster import KMeans
from sklearn.datasets import fetch_lfw_people
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn.decomposition import PCA,NMF

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]


X_train,X_test,y_train,y_test=train_test_split(
    X_people,y_people,stratify=y_people,random_state=0
)
nmf=NMF(n_components=100,random_state=0)
nmf.fit(X_train)
pca=PCA(n_components=100,random_state=0)
pca.fit(X_train)
kmeans=KMeans(n_clusters=100,random_state=0)
kmeans.fit(X_train)

X_reconstrycted_pca=pca.inverse_transform(pca.transform(X_test))
X_reconstrycted_kmeans=kmeans.cluster_centers_[kmeans.predict(X_test)]
X_reconstrycted_nmf=np.dot(nmf.transform(X_test),nmf.components_)

fig,axes=plt.subplots(3,5,figsize=(8,8),
                      subplot_kw={'xticks':(),'yticks':()})
fig.suptitle('对比')
for ax,comp_kmeans,comp_pca,comp_nmf in zip(axes.T,kmeans.cluster_centers_,pca.components_,nmf.components_):
    ax[0].imshow(comp_kmeans.reshape(image_shape))
    ax[1].imshow(comp_pca.reshape(image_shape),cmap='viridis')
    ax[2].imshow(comp_nmf.reshape(image_shape))

axes[0,0].set_ylabel('kmeans')
axes[1,0].set_ylabel('pca')
axes[2,0].set_ylabel('nmf')
plt.show()


fig,axes=plt.subplots(4,5,subplot_kw={'xticks':(),'yticks':()},fig=(8,8))
fig.suptitle('R')
for ax,orig,rec_kmeans,rec_pca,rec_nmf in zip(axes.T,X_test,X_reconstrycted_kmeans,X_reconstrycted_pca,X_reconstrycted_nmf):
    ax[0].imshow(orig.reshape(image_shape))
    ax[1].imshow(rec_kmeans.reshape(image_shape))
    ax[2].imshow(rec_pca.reshape(image_shape))
    ax[3].imshow(rec_nmf.reshape(image_shape))

axes[0,0].set_ylabel('original')
axes[1,0].set_ylabel('kmeans')
axes[2,0].set_ylabel('pca')
axes[3,0].set_ylabel('nmf')
plt.show()


利用k均值做矢量量化的一个有趣之处在于,可以用比输入维度更多的簇来对数据进行编码。

回到two_moons数据集,利用PCA或NMF,我们对这个数据无能为力,因为它只有两个维度。使用PCA或NMF将其降到一维,将会完全破坏数据的结构。但通过使用更多的簇中心,我们可以用k均值找到一种更具表现力的表示。


import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs,make_moons
from sklearn.cluster import KMeans

X,y=make_moons(n_samples=200,noise=0.05,random_state=0)

kmeans=KMeans(n_clusters=10,random_state=0)
kmeans.fit(X)
y_pred=kmeans.predict(X)

plt.scatter(X[:,0],X[:,1],c=y_pred,s=60,cmap='Paired')
plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],s=60,marker='^',c=range(kmeans.n_clusters),linewidths=2,cmap='Paired')
plt.xlabel('Feature 0')
plt.ylabel('Feature 1')
plt.show()
print('簇:\n{}'.format(y_pred))

我们使用了10个簇中心,也就是说,现在的每个点都被分配了0到9之间的一个数字。我们可以将其看作10个分量表示的数据(我们有10个新特征),只有表示该点对应的簇中心的哪个特征不为0,其他特征均为0。利用这10维表示,现在可以用线性模型来划分两个半月形,而利用原始的两个特征是不可能做到这一点的。

将到每个簇中心的距离作为特征,还可以得到一种表现力更强的数据表示。可以利用kmeans的transform方法来完成这一点:


distance_features=kmeans.transform(X)
print('距离特征形状:{}'.format(distance_features.shape))
print('距离特征:{}'.format(distance_features))

k均值是非常流行的聚类算法,因为它不仅相对容易理解和实现,而且运行速度也相对较快。k均值可以轻松扩展到大型数据集。

k均值的缺点之一在于,它依赖于随机初始化,也就是说,算法的输出依赖于随机种子。默认情况下,scikit-learn用10种不同的随机初始化将算法运行10次,并返回最佳结果。

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

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

相关文章

BUU XXE COURSE 1 1 解题过程

通过使用BurpSuite工具抓包可以得出此题使用的是XML注入。 XML原理 xml是一种类似与html的文本标记语言,与HTML不同的是,xml的作用是传输数据,而不是显示数据。 xml语言是定义一个根元素,下面跟上若干对子元素。 XML DTD 为了规…

fot循环语句

概念: 循环是一种重复执行一段代码的结构,只要满足循环的条件,会一种执行这个代码。 循环条件:在一定范围内,按照指定的次数来执行循环 循环体:在指定的次数内,执行的命令序列。只要条件满足…

程序猿大战Python——面向对象——继承进阶

方法重写 目标:掌握方法的重写。 当父类的同名方法达不到子类的要求,则可以在子类中对方法进行重写。语法: class 父类名(object):def 方法A(self):代码... class 子类名(父类名):def 方法A(self):代码... 例如,一起来完成&…

【云原生】Docker可视化工具Portainer使用详解

目录 一、前言 二、docker可视化管理概述​​​​​​​ 2.1 什么是docker可视化管理 2.1.1 Docker可视化管理常用功能 2.2 为什么需要docker可视化管理工具 2.3 docker可视化工具带来的好处 三、常用的docker容器可视化管理工具解决方案 3.1 Portainer 3.2 Rancher 3…

快速业务建模

一句话故事 培训学院进行新季度招生工作,出计划后教务处审批,教学秘书下发计划,班主任手机名单审核后完成计划 用户故事 角色 时间线 动作为动名词 业务建模 多次建模,模型是否能完成业务

【解决方案】智慧园区解决方案(配套源码)

智慧园区整体解决方案-综合运营管理系统 1. 园区现状与发展机遇 2. 智慧园区愿景 3. 智慧解决方案架构 4. 智慧园区各子系统介绍 5. 智慧园区建设意义 楼宇管理,物业管理,消防管理,巡检管理,门禁管理,停车管理等综合实…

VMWARE安装Centos8,并且使用ssh连接虚拟机

VMWARE安装Centos8,并且使用ssh连接虚拟机 安装VMWARE安装Centos 8SSH连接 安装VMWARE 参考这篇文章: https://blog.csdn.net/weixin_74195551/article/details/127288338 安装Centos 8 首先在aliyun镜像仓库下载: https://mirrors.aliyun.com/centos/8/isos/x86_64/ 我下载…

练手代码之使用Python实现合并PDF文件

如果你有合并PDF的需要,你会怎么办 我们无所不能的程序员会选择写一个Python代码来实现(谁会这么无聊?是我),如果真的有PDF操作需要,我推荐你使用PDF Expert这个软件哈~ 话不多说直接上代码: …

FuTalk设计周刊-Vol.030

🔥AI漫谈 热点捕手 1、ChatGPT王炸升级!更强版GPT-4上线,API定价打骨折,发布现场掌声没停过 ChatGPT,今天裂变成无数个GPT。OpenAI在首届开发者日上,正式公布自定义GPT。还将上线“GPT商店”,…

html做一个画热图的软件

完整示例 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>热图生成器</title><script src"https://cdn.plot.ly/plotly-latest.min.js"></script><style>body …

基于Java的学生成绩管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;B/S结构 工具&#xff1a;MyEclipse&#xff0c;MySQL 系统展示 首页 个人中…

TDA4VH高速路线指南和接口设计概要

TDA4VH 高速链路设计指南阅读及考虑 0、说明 本人目前做相关域控制器相关内容&#xff0c;目前正在研究TDA4的开发&#xff0c;目前正在对高速电路的的相关设计进行考虑&#xff0c;下面对TI官方提供的高速电路的设计的开发文档进行学习和分享: 1、高速系统架构介绍及PCB阻抗…

【C语言】顺序表(下卷)

本文继续讲顺序表上卷未讲完的相关内容。&#xff08;简短的补充&#xff09; 在指定位置之前插入数据 test.c SeqList.c SeqList.h //在指定位置之前插入数据 void SLInsert(SL* ps, int pos, SLDataType x);在指定位置删除数据 test.c SeqList.c SeqList.h //在指定位…

跨平台免费流程图(思维导图)制作工具 draw.io v24.6.3(可离线)

在当今快节奏的工作环境中&#xff0c;有效地传达复杂信息和工作流程至关重要。流程图和思维导图是两种强大的视觉工具&#xff0c;它们帮助我们清晰地表达想法&#xff0c;理解复杂的系统&#xff0c;并协作完成项目。可以帮助我们清晰地展示信息和逻辑关系。然而&#xff0c;…

无需破解,打开就是旗舰版!

在当今快节奏的工作环境里&#xff0c;有效的视觉沟通变得至关重要。流程图、思维导图、组织结构图等图表能够帮助我们以清晰、直观的方式传达复杂信息。而Wondershare Edraw Max正是这样一款强大的绘图工具&#xff0c;它能够帮助用户轻松创建各种专业图表。 软件链接&#x…

Spring Boot 快速入门2 ——SpringBoot运行原理分析

一、SpringBoot运行原理 父依赖 我们再查看 Spring Boot 项目中 pom.xml 可以看出&#xff0c;所有的 Spring Boot 项目 直接或间接的 依赖于一个 父项目 spring-boot-starter-parent &#xff0c;主要是管理项目的资源及其插件。 <parent><groupId>org.sprin…

Linux 时区设置函数 tzset()【man 3 tzset】

1. NAME&#xff08;名&#xff09; tzset, tzname, timezone, daylight - 初始化时间转换信息 2. SYNOPSIS&#xff08;概要&#xff09; #include <time.h>void tzset(void);extern char *tzname[2]; extern long timezone; extern int daylight;glibc的功能测试宏要…

Uniapp在屏幕尺寸低于960出现样式错乱(开箱即用)

我司项目突然要做平板兼容,我在调试的时候发现当屏幕尺寸低于960px发现样式但凡是以rpx单位的全部失效&#xff0c;如果是以px为单位那么影响就比较小&#xff0c;当时解决方案是写了不少媒体查询和把单位rpx改成px&#xff0c;后面查阅文档发现大错特错宽屏适配只需一行代码即…

2024.06.22 刷题日记

199. 二叉树的右视图 这道题目的思路就是层次遍历&#xff0c;然后每次处理每一层所有的元素&#xff0c;如果是第一个就收集到答案中&#xff1a; class Solution { public:vector<int> rightSideView(TreeNode* root) {if (!root)return {};queue<TreeNode*> q…

Kubernetes Ingress 简介

前言 Ingress 是 Kubernetes 中的一种资源对象&#xff0c;用于管理从集群外部到内部服务的 HTTP 和 HTTPS 路由。它提供了灵活的路由功能、SSL/TLS 终止、负载均衡和虚拟主机支持。Ingress 需要一个 Ingress 控制器来实际处理路由&#xff0c;并且可以通过配置不同的控制器来…