使用Kmeans算法完成聚类任务

 聚类任务

 聚类任务是一种无监督学习任务,其目的是将一组数据点划分成若干个类别或簇,使得同一个簇内的数据点之间的相似度尽可能高,而不同簇之间的相似度尽可能低。聚类算法可以帮助我们发现数据中的内在结构和模式,发现异常点和离群值,简化数据表示,以及为进一步的分析提供基础。聚类任务在现实世界中有很多应用场景,以下是其中的一些例子:

  1. 市场细分:聚类可以帮助将市场分成不同的细分市场,以便更好地针对消费者需求制定营销策略。

  2. 图像分析:聚类可以用于图像分析,例如将相似的图像分组。

  3. 模式识别:聚类可以用于发现数据中的模式和关系,例如在医疗领域中,可以使用聚类来发现疾病之间的关系。

  4. 推荐系统:聚类可以用于推荐系统中,以将用户分组并向他们推荐相似的产品或服务。

 K-Means算法

 K-Means是一种基于聚类的无监督机器学习算法,其目的是将一组数据点分为k个不同的簇,使得每个数据点与其所属簇的中心点(也称质心)的距离最小化。以下是K-Means的工作原理:

  1. 初始化:随机选择k个数据点作为初始质心。

  2. 分配:对每个数据点,计算其与每个质心的距离,并将其分配给距离最近的质心所代表的簇。

  3. 重新计算质心:对于每个簇,重新计算其质心位置,即将该簇中所有数据点的坐标求平均。

  4. 重复执行第2,3步,直到所有数据点的簇分配不再改变或达到预设的最大迭代次数为止。

下面是用K-Means算法完成聚类的简单Demo,下面的demo中K设置为2.

from sklearn.cluster import KMeans
import numpy as np
# create some sample data
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
# create a KMeans object with 2 clusters
kmeans = KMeans(n_clusters=2, random_state=0)
# fit the KMeans object to the data
kmeans.fit(X)
# print the centroids of the two clusters
print(kmeans.cluster_centers_)
# predict the cluster labels for the data points
labels = kmeans.predict(X)
# print the predicted cluster labels for the data points
print(labels)

执行结果:cluster_centers_:[[1. 2.][4. 2.]], labels:[0 0 0 1 1 1]

上面的Demo中使用到KMeans函数,KMeans函数是一种聚类分析算法,用于将数据集分成多个簇。其主要作用是将相似的数据点分到同一个簇中,同时将不同的数据点分到不同的簇中。KMeans算法通过迭代寻找最优的聚类结果,可以对数据进行分组、分类和聚类分析。该函数包含多个输入参数,各个参数含义如下:

  • n_clusters:聚类的数量(簇的个数),即K值。默认值为8。如果知道数据的实际类别数目,可以将其设置为该数目;否则,可以通过手动设置不同的聚类数量来寻找最佳解。

  • init初始化质心的方法。默认为"k-means++",表示使用一种改进的贪心算法来选取初始质心。也可以设置为随机选择初始质心的"random"方法。

  • max_iter最大迭代次数。默认值为300。当质心移动的距离小于阈值或达到最大迭代次数时,算法停止。

  • tol质心移动的阈值。默认值为1e-4。当质心移动的距离小于该阈值时,算法停止。

  • n_init随机初始化的次数。默认值为10。由于KMeans算法易受初始质心的影响,因此可以通过多次运行算法并选择最好的结果来减少随机性的影响。

  • algorithmKMeans算法实现的方式。默认为"auto",表示由算法自动选择最佳的实现方式("full"表示使用标准的KMeans算法,"elkan"表示使用改进的Elkan算法)。对于大规模数据集,建议使用"elkan"实现方式。

  上面的Demo例子是对List数据进行聚类,接下来看看如何使用K-means方法对足球队进行聚类,下面的例子中读取了csv文件中的原始数据,csv文件中存放了不同球队在三次比赛中的排名。

# coding: utf-8
from sklearn.cluster import KMeans
from sklearn import preprocessing
import pandas as pd
import numpy as np
# 输入数据
data = pd.read_csv('./kmeans/data.csv', encoding='gbk')
train_x = data[["2019年国际排名", "2018世界杯", "2015亚洲杯"]]
kmeans = KMeans(n_clusters=3)
# 规范化到[0,1]空间
min_max_scaler = preprocessing.MinMaxScaler()
train_x = min_max_scaler.fit_transform(train_x)
# kmeans算法
kmeans.fit(train_x)
predict_y = kmeans.predict(train_x)
# 合并聚类结果,插入到原数据中
result = pd.concat((data, pd.DataFrame(predict_y)), axis=1)
result.rename({0: u'聚类'}, axis=1, inplace=True)
print(result)

采用K-means方法进行聚类,假设K=3,聚类后的结果如下所示,可以看到把球队分到了0,1,2三种不同类型中。

 对图像进行聚类

  上面的例子是对数据进行聚类,下面看看如何对图像进行聚类,下面的Demo例子中将weixin登陆的图标按不同像素下的颜色分成了2类。

# -*- coding: utf-8 -*-
# 使用K-means对图像进行聚类,显示分割标识的可视化
import numpy as np
import PIL.Image as image
from sklearn.cluster import KMeans
from sklearn import preprocessing# 加载图像,并对数据进行规范化
def load_data(filePath):# 读文件f = open(filePath, 'rb')data = []# 得到图像的像素值img = image.open(f)# 得到图像尺寸width, height = img.sizefor x in range(width):for y in range(height):# 得到点(x,y)的三个通道值c1, c2, c3 = img.getpixel((x, y))data.append([c1, c2, c3])f.close()# 采用Min-Max规范化mm = preprocessing.MinMaxScaler()data = mm.fit_transform(data)return np.asarray(data), width, height# 加载图像,得到规范化的结果img,以及图像尺寸
img, width, height = load_data('./kmeans/weixin.jpg')# 用K-Means对图像进行2聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(img)
label = kmeans.predict(img)
# 将图像聚类结果,转化成图像尺寸的矩阵
label = label.reshape([width, height])
# 创建个新图像pic_mark,用来保存图像聚类的结果,并设置不同的灰度值
pic_mark = image.new("L", (width, height))
for x in range(width):for y in range(height):# 根据类别设置图像灰度, 类别0 灰度值为255, 类别1 灰度值为127pic_mark.putpixel((x, y), int(256 / (label[x][y] + 1)) - 1)
pic_mark.save("./kmeans/weixin_mark1.jpg", "JPEG")

下图中第一张图是原图,第二张图是分类K=2的结果。可以看到,因为只进行了2种类型区分,新生成的图片中,纯白色是原图中深蓝色的代表,黑灰色是原图中白亮色的代表。说明聚类正确。

 图三是K=16的分类结果,当分类K=16时,和原图就很接近了,K=16的分类代码细节如下所示:

# -*- coding: utf-8 -*-
# 使用K-means对图像进行聚类,并显示聚类压缩后的图像
import numpy as np
import PIL.Image as image
from sklearn.cluster import KMeans
from sklearn import preprocessing
import matplotlib.image as mpimg# 加载图像,并对数据进行规范化
def load_data(filePath):# 读文件f = open(filePath, 'rb')data = []# 得到图像的像素值img = image.open(f)# 得到图像尺寸width, height = img.sizefor x in range(width):for y in range(height):# 得到点(x,y)的三个通道值c1, c2, c3 = img.getpixel((x, y))data.append([(c1 + 1) / 256.0, (c2 + 1) / 256.0, (c3 + 1) / 256.0])f.close()return np.asarray(data), width, height# 加载图像,得到规范化的结果imgData,以及图像尺寸
img, width, height = load_data('./kmeans/weixin.jpg')
# 用K-Means对图像进行16聚类
kmeans = KMeans(n_clusters=16)
label = kmeans.fit_predict(img)
# 将图像聚类结果,转化成图像尺寸的矩阵
label = label.reshape([width, height])
# 创建个新图像img,用来保存图像聚类压缩后的结果
img = image.new('RGB', (width, height))
for x in range(width):for y in range(height):c1 = kmeans.cluster_centers_[label[x, y], 0]c2 = kmeans.cluster_centers_[label[x, y], 1]c3 = kmeans.cluster_centers_[label[x, y], 2]img.putpixel((x, y),(int(c1 * 256) - 1, int(c2 * 256) - 1, int(c3 * 256) - 1))
img.save('./kmeans/weixin_new.jpg')

    上面介绍了如何使用K-Means算法完成文本类或者图片类聚类任务,在实际项目中,K-Means算法应用非常广泛,主要应用在如下的业务场景中。

  1. 市场营销:K-Means算法可以对市场消费者进行分类,以便公司更好地了解他们的需求和行为,制定更有效的营销策略。

  2. 图像处理:K-Means算法可以用于对图像像素进行聚类,以实现图像压缩和图像分割等功能。

  3. 自然语言处理:K-Means算法可以用于对文本数据进行聚类,以实现语义分析和文本分类等功能。

  4. 生物信息学:K-Means算法可以用于对生物数据进行聚类,以实现基因分类和蛋白质分类等功能。

  5. 金融领域:K-Means算法可以用于对金融数据进行聚类,以实现风险评估和资产管理等功能。

上面提到K-Means算法可以对图像像素进行聚类,以实现图像压缩的功能,下面的例子中就采用K-Means算法对图片像素进行聚类,从而实现压缩的效果。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from PIL import Image# 加载图片
img = Image.open('./kmeans/baby.jpg')
img_data = np.array(img)# 将三维的图片数组变成二维的像素点数组
pixels = img_data.reshape((img_data.shape[0] * img_data.shape[1], img_data.shape[2]))
# 使用K-Means聚类算法对像素点进行聚类
kmeans = KMeans(n_clusters=16, random_state=0)
labels = kmeans.fit_predict(pixels)# 将每个像素点替换为所属聚类的中心点
new_pixels = kmeans.cluster_centers_[labels]# 将一维的像素点数组还原为图片数组的形式
new_img_data = new_pixels.reshape((img_data.shape[0], img_data.shape[1], img_data.shape[2]))# 显示原始图片和压缩后的图片
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))
fig.suptitle('Image Compression using K-Means Clustering')ax1.set_title('Original Image')
ax1.imshow(img_data)ax2.set_title('Compressed Image')
ax2.imshow(new_img_data.astype('uint8'))plt.show()

原图和压缩后的图片结果如下所示:

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

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

相关文章

小研究 - 一种复杂微服务系统异常行为分析与定位算法(一)

针对极端学生化偏差(Extreme Studentized &#…

3、Winform表单控件

在学习了布局控件之后,我们就该学习表单控件了。表单控件可以设置默认值,使用属性窗口或使用代码都是可以的。属性窗口最终也很转化成代码。 程序的本质=输入+处理+输出。在Winform程序角度,这里的输入输出就可以用我们的表单控件来实现。 表单控件大致可分为两类,文本控…

Python爬取IP归属地信息及各个地区天气信息

一、实现样式 二、核心点 1、语言:Python、HTML,CSS 2、python web框架 Flask 3、三方库:requests、xpath 4、爬取网站:https://ip138.com/ 5、文档结构 三、代码 ipquery.py import requests from lxml import etree # 请求…

前端html中让两个或者多个div在一行显示,用style给div加上css样式

文章目录 前言一、怎么让多个div在一行显示 前言 DIV是层叠样式表中的定位技术,全称DIVision,即为划分。有时可以称其为图层。DIV在编程中又叫做整除,即只得商的整数。 DIV元素是用来为HTML(标准通用标记语言下的一个应用&#x…

概念、框架简介--ruoyi学习(一)

开始进行ruoyi框架的学习,比起其他的前后端不分离的,这个起码看的清晰一些吧。 这一节主要是看了ruoyi的官方文档后,记录了以下不懂的概念,并且整理了ruoyi框架中的相关内容。 一些概念 前端 store store是状态管理库&#x…

数值线性代数: 共轭梯度法

本文总结线性方程组求解的相关算法,特别是共轭梯度法的原理及流程。 零、预修 0.1 LU分解 设,若对于,均有,则存在下三角矩阵和上三角矩阵,使得。 设,若对于,均有,则存在唯一的下三…

中科院放大招:FastSAM快速细分任何东西

FastSAM是一个用于图像分割的快速模型,它是对SAM(Segment Anything Model)模型的改进和优化。FastSAM模型的目标是提高计算效率,使得图像分割任务能够更快地完成。 FastSAM模型的优势主要体现在以下几个方面: 快速性…

【Linux进程篇】进程概念(1)

【Linux进程篇】进程概念(1) 目录 【Linux进程篇】进程概念(1)进程基本概念描述进程-PCBtask_struct-PCB的一种task_ struct内容分类 组织进程查看进程通过系统调用获取进程标示符通过系统调用创建进程——fork初识 作者&#xff…

【Docker】Docker应用部署之Docker容器安装Redis

目录 一、搜索Redis镜像 二、拉取Redis镜像 三、创建容器 四、测试使用 一、搜索Redis镜像 docker search redis 二、拉取Redis镜像 docker pull redis:版本号 # 拉取对应版本的redis镜像 eg: docker pull redis:5.0 三、创建容器 docker run -id --nameredis -p 6379:637…

Games101学习笔记 - 变换矩阵基础

二维空间下的变换 缩放矩阵 缩放变换: 假如一个点(X,Y)。x经过n倍缩放,y经过m倍缩放,得到的新点(X1,Y1);那么新点和远点有如下关系,X1 n*X, Y1 m*Y写成矩阵就是如下…

ChatGPT与高等教育变革:价值、影响及未来发展

最近一段时间,ChatGPT吸引了社会各界的目光,它可以撰写会议通知、新闻稿、新年贺信,还可以作诗、写文章,甚至可以撰写学术论文。比尔盖茨、马斯克等知名人物纷纷为此发声,谷歌、百度等知名企业纷纷宣布要提供类似产品。…

玩转Tomcat:从安装到部署

文章目录 一、什么是 Tomcat二、Tomcat 的安装与使用2.1 下载安装2.2 目录结构2.3 启动 Tomcat 三、部署程序到 Tomcat3.1 Windows环境3.2 Linux环境 一、什么是 Tomcat 一看到 Tomcat,我们一般会想到什么?没错,就是他,童年的回忆…

安全基础 --- html标签 + 编码

html标签 &#xff08;1&#xff09;detail标签 <details>标签用来折叠内容&#xff0c;浏览器会折叠显示该标签的内容。 <1> 含义&#xff1a; <details> 这是一段解释文本。 </details> 用户点击这段文本&#xff0c;折叠的文本就会展开&#x…

【云原生】Docker容器资源限制(CPU/内存/磁盘)

目录 ​编辑 1.限制容器对内存的使用 2.限制容器对CPU的使用 3.block IO权重 4.实现容器的底层技术 1.cgroup 1.查看容器的ID 2.在文件中查找 2.namespace 1.Mount 2.UTS 3.IPC 4.PID 5.Network 6.User 1.限制容器对内存的使用 ⼀个 docker host 上会运⾏若⼲容…

平面设计软件都有哪些?推荐这7款

优秀的平面广告设计可以给产品带来良好的效益&#xff0c;正确传播品牌的价值和色调&#xff0c;而功能强大、使用方便的平面广告设计软件是创造优秀平面广告设计的关键。本文推荐7款备受好评的平面广告设计软件&#xff0c;易于使用&#xff01; 1.即时设计 即时设计是国内一…

Bug记录: CUDA error_ device-side assert triggered

Bug记录&#xff1a; CUDA error: device-side assert triggered 在接触AIGC算法的过程中偶尔会遇到这样的bug&#xff1a;RuntimeError: CUDA error: device-side assert triggered return torch._C._cuda_synchronize() RuntimeError: CUDA error: device-side assert trig…

python在不同坐标系中绘制曲线

文章目录 平面直角坐标系空间直角坐标系极坐标地理坐标 平面直角坐标系 回顾我们的数据可视化的学习历程&#xff0c;其实始于笛卡尔坐标系的创建&#xff0c;并由此建立了数与形的对应关系。在笛卡尔坐标系中随便点上一点&#xff0c;这个点天生具备坐标&#xff0c;从而与数…

CloudDriver一款将各种网盘云盘挂在到电脑本地变成本地磁盘的工具 教程

平时我们的电脑可能由于大量的文件资料之类的导致存储空间可能不够&#xff0c;所以我们可以选择将网盘我们的本地磁盘用来存放东西。 CloudDrive 是一款可以将 115、阿里云盘、天翼云盘、沃家云盘、WebDAV 挂载到电脑中&#xff0c;成为本地硬盘的工具&#xff0c;支持 Window…

短视频平台视频怎么去掉水印?

短视频怎么去水印&#xff0c;困扰很多人&#xff0c;例如&#xff0c;有些logo水印&#xff0c;动态水印等等&#xff0c;分享操作经验&#xff1a; 抖音作为中国最受欢迎的社交娱乐应用程序之一&#xff0c;已成为许多人日常生活中不可或缺的一部分。在使用抖音过程中&#x…

数据结构--基础知识

数据结构是什么&#xff1f; 数据结构是计算机科学中研究数据组织、存储和管理的方法和原则。它涉及存储和操作数据的方式&#xff0c;以便能够高效地使用和访问数据。 相关内容 基本组成 数组&#xff08;Array&#xff09;&#xff1a;数组是一种线性数据结构&#xff0c;…