数据挖掘与机器学习 实验:聚类算法

实验六:聚类算法

一、实验名称

实验:聚类算法

二、实验目的

1.了解聚类算法理论基础

2.平台实现算法

3.编程实现聚类算法

三、实验原理

聚类分析的目标就是在相似的基础上收集数据来分类。聚类源于很多领域,包括数学,计算机科学,统计学,生物学和经济学。

四、实验步骤

1、使用聚类算法对图像进行压缩,其核心思想是通过聚类将颜色表示数量减少。读取图片,设置图片的压缩率,求聚类数量。

# 引包
import numpy as np
from scipy import misc
from sklearn import cluster
import matplotlib.pyplot as plt
# 读取图片
input_file = "D:/数据挖掘/实验/flower.jpg"
# 设置图片的压缩比例
num_bits = 2
# 判断图片的压缩比例是否在1-8之间,不在时会触发类型错误
if not 1 <= num_bits <= 8:
    raise TypeError('Number of bits should be between 1 and 8')
# 使用power()函数计算num_bits的二进制中可能的聚类数量
# np.power(2, num_bits)表示将2的num_bits次方
num_clusters = np.power(2, num_bits)
num_clusters
# 计算压缩的比例,保留两位小数,即压缩后图像的大小与原始图像大小之间的比值
compression_rate = round(100 * (8.0 - num_bits) / 8.0,2)
# 图片压缩的因子,即原始图像大小与压缩后图像大小之间的比例
print ("\nThe size of the image will be reduced by a factor of", 8.0 / num_bits)
print ("\nCompression rate = " + str(compression_rate) + "%")

2、计算图片的压缩比例,加载需要压缩的图片,输出原始图像。

# 加载需要压缩的图片
from PIL import Image
# Image.open()打开指定路径的图片文件,.convert('L')将其转换为灰度图像
# dtype=np.uint8参数表示数组的数据类型是无符号8位整数
input_image = np.array(Image.open(input_file).convert('L'), dtype=np.uint8)
# 查看结果
# input_image
# 原始图像的输出
# input_image.min()获取图像的最小值,用于设置图像显示的颜色范围
vmin = input_image.min()
# input_image.max()获取图像的最大值,用于设置图像显示的颜色范围
vmax = input_image.max()
plt.figure()
# 设置图像标题
plt.title('Original image')
# 绘制图像
# cmap=plt.cm.gray表示使用灰色映射,vmin和vmax参数设置颜色范围
plt.imshow(input_image, cmap=plt.cm.gray, vmin=vmin, vmax=vmax)

3、实现图片压缩功能,思想是将每个像素作为一个元素进行聚类,然后使用每个类别的质心数值替换原像素数据,以此减少其颜色个数。将图片结构进行转换即每个像素作为一个元素,使之能符合聚类算法数据输入的要求。完成后创建KMeans聚类模型并进行训练。分别获取每个数据聚类后的标签label,以及每个label的质心的值cluster_centers_.squeeze,使用squeeze()函数将质心数组的维度从1降为0。使用质心的数值代替原数据的label值,使用numpy的choose函数进行质心值的代替,reshape函数将新生成的图像恢复到原图像的数据结构,那么我们将获得一个新的图像,输出压缩后的图像。

# 图片压缩将每个像素作为一个元素进行聚类,以此减少其颜色个数
# 将图片结构进行转换,即每个像素作为一个元素,使之能符合聚类算法数据输入的要求
# 使用reshape()函数将图像从二维数组形式转换为一维列向量形式
X = input_image.reshape((-1,1))
# KMeans聚类模型
# n_clusters参数指定聚类的数量,n_init参数指定每个聚类中心的初始化次数,random_state参数指定随机数种子
kmeans = cluster.KMeans(n_clusters=num_clusters, n_init=4, random_state=5)
# 模型训练
kmeans.fit(X)
# 获取每个数据KMeans聚类后的标签label
labels = kmeans.labels_
# 获取KMeans聚类模型的质心,并使用squeeze()函数将质心数组的维度从1降为0
centroids = kmeans.cluster_centers_.squeeze()
# 使用质心的数值代替原数据的label值,获得一个新的图像。
# 使用numpy的choose函数进行质心值的代替,reshape函数将新生成的图像恢复到原图像的数据结构,并返回结果
input_image_compressed = np.choose(labels, centroids).reshape(input_image.shape)
# 查看结果
# input_image_compressed
# 压缩后的图像输出
# input_image_compressed.min()获取图像的最小值,用于设置图像显示的颜色范围
vmin = input_image_compressed.min()
# input_image_compressed.max()获取图像的最大值,用于设置图像显示的颜色范围
vmax = input_image_compressed.max()
plt.figure()
# 设置图像标题
plt.title('Compressed image')
# 绘制图像
# cmap=plt.cm.gray表示使用灰色映射,vmin和vmax参数设置颜色范围
print('Compressed image; compression rate = ' + str(compression_rate) + '%')
plt.imshow(input_image_compressed, cmap=plt.cm.gray, vmin=vmin, vmax=vmax)

五、实验总结

通过本次的KMeans聚类实验对图像进行压缩,从而对聚类算法的应用有更深的了解。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值