聚类算法_案例实战:聚类实战

K-MEANS算法

标准化:将数据的值按比例值缩放,归一化到0~1范围内,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。

 

 K-means算法对随机选取 K个初始点作为初始值是很敏感的,结果非常依赖初始值

使用Kmeans进行图像压缩:

# -*- coding: utf-8 -*-

from skimage import io
from sklearn.cluster import KMeans
import numpy as np

image = io.imread('test2.jpg')
io.imshow(image)
io.show()

#查看像素点
rows = image.shape[0]#行数h
cols = image.shape[1]#列数w
#c指的是颜色通道 
image = image.reshape(image.shape[0]*image.shape[1],3)#彩色图像三维:h*w*c    reshape成2维:h*w,c
kmeans = KMeans(n_clusters = 128, n_init=10, max_iter=200)#n_clusters指的是簇的个数,别的可以不用管,也可以不指定
kmeans.fit(image)#fit数据

clusters = np.asarray(kmeans.cluster_centers_,dtype=np.uint8) 
labels = np.asarray(kmeans.labels_,dtype=np.uint8 )  
labels = labels.reshape(rows,cols);#reshape回去,变成二维图像(灰度图)

print (clusters.shape)
np.save('codebook_test.npy',clusters)    
io.imsave('compressed_test.jpg',labels)#压缩后的图像,原来的三通道变为1通道,原来的取值0-265,现在只能为0-128
test2.jpg:

(128, 3)
image = io.imread('compressed_test.jpg')
io.imshow(image)
io.show()

 

 

 DBSCAN聚类使用到一个k-距离的概念,k-距离是指:给定数据集P={p(i); i=0,1,…n},对于任意点P(i),计算点P(i)到集合D的子集S={p(1), p(2), …, p(i-1), p(i+1), …, p(n)}中所有点之间的距离,距离按照从小到大的顺序排序,假设排序后的距离集合为D={d(1), d(2), …, d(k-1), d(k), d(k+1), …,d(n)},则d(k)就被称为k-距离。也就是说,k-距离是点p(i)到所有点(除了p(i)点)之间距离第k近的距离。对待聚类集合中每个点p(i)都计算k-距离,最后得到所有点的k-距离集合E={e(1), e(2), …, e(n)}。

根据经验计算最少点的数量MinPts:确定MinPts的大小,实际上也是确定k-距离中k的值,如DBSCAN算法取k=4,则MinPts=4。

离群点如果想多一点,可以减小半径r和MinPts。

MinPts设置大了,簇的个数会变少。

 

 

 

  

 

posted @ 2018-06-12 10:25  耐烦不急  阅读(1389)  评论(0编辑  收藏  举报