聚类指的是把集合,分组成多个类,每个类中的对象都是彼此相似的。K-means是聚类中最常用的方法之一,它是基于点与点距离的相似度来计算最佳类别归属。
在使用该方法前,要注意(1)对数据异常值的处理;(2)对数据标准化处理(x-min(x))/(max(x)-min(x));(3)每一个类别的数量要大体均等;(4)不同类别间的特质值应该差异较大
一、K-means聚类步骤:
(1)选择k个初始聚类中心
(2)计算每个对象与这k个中心各自的距离,按照最小距离原则分配到最邻近聚类
(3)使用每个聚类中的样本均值作为新的聚类中心
(4)重复步骤(2)和(3)直到聚类中心不再变化
(5)结束,得到k个聚类
二、聚类分析代码演算:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.datasets.samples_generator import make_blobs
#make_blobs聚类生成器
x,y_true=make_blobs(n_samples=300,#生成300条数据
centers=4, #4类
cluster_std=0.5,#方差一致,愈大各类别里面点的散度愈大
random_state=0)
print(x[:5])
print(y_true[:5])
#x生成数据值,y生成数据的对应类别标签
#random_state随机种子数
plt.scatter(x[:,0],x[:,1],marker='.')
plt.grid()
from sklearn.cluster import KMeans
#导入模块
kmeans=KMeans(n_clusters=4)
kmeans.fit(x)
y_kmeans=kmeans.predict(x)
cen=kmeans.cluster_centers_#得到不同族的中心点
print(cen)
plt.scatter(x[:,0],x[:,1],c=y_kmeans,cmap='Dark2',s=50,marker='x')
plt.scatter(cen[:,0],cen[:,1],c=[0,1,2,3],cmap='Dark2',s=70,marker='o')
plt.title('K-means 300 points')
plt.xlabel('values1')
plt.ylabel('values2')
运行结果:
三、利用K-means聚类做图像压缩:
from skimage import io
from sklearn.cluster import KMeans
import numpy as np
image=io.imread('dogg.jpg')
io.imshow(image)
io.show()
rows=image.shape[0]
cols=image.shape[1]
image=image.reshape(image.shape[0]*image.shape[1],3)
kmeans=KMeans(n_clusters=128)
kmeans.fit(image)
cluster=np.asarray(kmeans.cluster_centers_,dtype=np.unit8)
labels=np.asarray(kmeans.labels_,dtype=np.uint8)
labels=labels.reshape(rows,cols)
print(clusters.shape)
np.save('IMG_6439copy.npy',clusters)
io.imsave('dog_copy.jpg',labels)
image=io.imread('IMG_6439copy.jpg')
io.imshow(image)
io.show()