python计算机视觉学习———图像聚类

6.1 K-means聚类

K-means 是一种将输入数据划分成 k 个簇的简单的聚类算法。K-means 反复提炼初始评估的类中心。
k-means算法中的k代表类簇个数,means代表类簇内数据对象的均值(这种均值是一种对类簇中心的描述),因此,k-means算法又称为k-均值算法。k-means算法是一种基于划分的聚类算法,以距离作为数据对象间相似性度量的标准,即数据对象间的距离越小,则它们的相似性越高,则它们越有可能在同一个类簇。
距离的度量:聚类简单理解就是把相似的东西聚到一起,如何判断两个样本点是不是相似的呢,这个就要根据距离做判断,最常见的计算方式就是欧几里得距离(直接算两个点的欧式距离)和余弦相似度(先标准化),当使用欧式距离的时候,先要对数据进行标准化,
什么是标准化:比如现在有两个维度,x轴,y轴,x轴数据0.01,0.02,0.04,y轴数据100,200,300,当计算相似度的时候,x轴的差异无论怎么算都比较小,y轴的差异无论怎么算都比较大,那样我们潜意识里就认为相似度主要由y轴决定,实际算出来也是这样,所以说,在使用距离的度量的时候,基本情况下,都要对所有数据进行标准化,比如让x轴取值范围在0到1之间,y轴取值范围在0到1之间,让数据x和y基本在一个比较小的范围内浮动,比如说都是0到1,或者-1到1。

先把数据做标准化,然后再用距离的度量看一下什么样的两个样本点是相似的,再把相似的分到一簇。

步骤如下:
(1) 以随机或猜测的方式初始化类中心 ui,i=1…k;
(2) 将每个数据点归并到离它距离最近的类中心所属的类 ci;
(3) 对所有属于该类的数据点求平均,将平均值作为新的类中心;
(4) 重复步骤(2)和步骤(3)直到收敛。

K-means 试图使类内总方差最小:
在这里插入图片描述

xj 是输入数据,并且是矢量。该算法是启发式提炼算法,在很多情形下都适用,但
是并不能保证得到最优的结果。为了避免初始化类中心时没选取好类中心初值所造
成的影响,该算法通常会初始化不同的类中心进行多次运算,然后选择方差 V 最小
的结果。

6.1.1 SciPy 聚类包

SciPy 矢量量化包scipy.cluster.vq 中有 K-means 的实现。
首先,生成简单二维数据,再令K=2,对这些数据进行聚类。最后可视化

from scipy.cluster.vq import *
from pylab import *

class1 = 1.5 * randn(100,2)
class2 = randn(100,2) + array([5,5])
features = vstack((class1,class2))

centroids,variance = kmeans(features,2)
code,distance = vq(features,centroids)

figure()
ndx = where(code==0)[0]
plot(features[ndx,0],features[ndx,1],'*')
ndx = where(code==1)[0]
plot(features[ndx,0],features[ndx,1],'r.')
plot(centroids[:,0],centroids[:,1],'go')
axis('off')
show()

在这里插入图片描述
一个对二维数据用 K-means 进行聚类的示例。类中心标记为绿色大圆环,预测出的
类分别标记为蓝色星号和红色点。

6.1.2 图像聚类

用 K-means 对字体图像进行聚类。

# -*-coding:utf-8 -*-
from PCV.tools import imtools
import pickle
from scipy.cluster.vq import *
from numpy import *
from PIL import Image
from pylab import *
# 获取 selected-fontimages 文件下图像文件名,并保存在列表中
imlist = imtools.get_imlist('D:\\project\\a_selected_thumbs\\')
imnbr = len(imlist)
# 载入模型文件
with open('a_pca_modes.pkl','rb') as f:
 immean = pickle.load(f)
 V = pickle.load(f)
# 创建矩阵,存储所有拉成一组形式后的图像
immatrix = array([array(Image.open(im)).flatten()
 for im in imlist],'f')
# 投影到前 40 个主成分上
immean = immean.flatten()
projected = array([dot(V[:40],immatrix[i]-immean) for i in range(imnbr)])
# 进行 k-means 聚类
projected = whiten(projected)
centroids,distortion = kmeans(projected,4)
code,distance = vq(projected,centroids)
for k in range(4):
 ind = where(code==k)[0]
 figure()
 gray()
 for i in range(minimum(len(ind),40)):
  subplot(4,10,i+1)
  imshow(immatrix[ind[i]].reshape((25,25)))
  axis('off')
 show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.1.3 在主成分上可视化图像

为了便于观察上面是如何利用主成分进行聚类的,我们可以在一对主成分方向的坐标上可视化这些图像。

# -*- coding: utf-8 -*-
from PCV.tools import imtools, pca
fr
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值