本文所用文件的链接
链接:https://pan.baidu.com/s/1RWNVHuXMQleOrEi5vig_bQ
提取码:p57s
聚类
分类(class) 与 聚类 (cluster) 不同, 分类属于有监督学习, 聚类属于无监督学习模型. 聚类讲究使用一些算法把样本划分为n个群落. 一般情况下,这种算法都需要计算欧氏距离.
欧氏距离(欧几里得距离):
P
(
x
1
)
−
P
(
x
2
)
:
∣
x
1
−
x
2
∣
=
(
x
1
−
x
2
)
2
p
(
x
1
,
y
1
)
−
p
(
x
2
,
y
2
)
:
(
x
1
−
x
2
)
2
+
(
y
1
−
y
2
)
2
p
(
x
1
,
y
1
,
z
1
)
−
p
(
x
2
,
y
2
,
z
2
)
:
(
x
1
−
x
2
)
2
+
(
y
1
−
y
2
)
2
+
(
z
1
−
z
2
)
2
P(x_1)-P(x_2): |x_1-x_2| = \sqrt{(x_1-x_2)^2}\\ p(x_1,y_1)-p(x_2,y_2): \sqrt{(x_1-x_2)^2 + (y_1-y_2)^2} \\ p(x_1,y_1,z_1)-p(x_2,y_2,z_2): \sqrt{(x_1-x_2)^2 + (y_1-y_2)^2 + (z_1-z_2)^2}
P(x1)−P(x2):∣x1−x2∣=(x1−x2)2p(x1,y1)−p(x2,y2):(x1−x2)2+(y1−y2)2p(x1,y1,z1)−p(x2,y2,z2):(x1−x2)2+(y1−y2)2+(z1−z2)2
K均值算法
第一步: 随机选择K个样本作为K个聚类中心, 计算每个样本到各个聚类中心的欧式距离, 将该样本分配到与之距离最近的聚类中心所在的类别中.
第二步: 根据第一步得到的聚类划分, 分别计算每个聚类所有样本的几何中心, 将几何中心作为新的聚类中心,重复第一步. 直到计算所得几何中心与聚类中心重合或接近重合为止.
注意:
- 聚类数K必须事先已知. 可以借助某些指标,选择最好的K.
- 聚类中心的初始选择会影响到最终的聚类划分的结果. 初始重新样本尽量选择距离较远的样本.
K均值算法相关API:
import sklearn.cluster as sc
#n_clusters: 聚类数
model = sc.KMeans(n_clusters=3)
model.fit(x)
# 获取聚类中心
centers = model.cluster_centers_
案例:
"""
k均值算法
"""
import numpy as np
import sklearn.cluster as sc
import matplotlib.pyplot as mp
x = np.loadtxt('../ml_data/multiple3.txt',
delimiter=',')
# KMeans聚类
model = sc.KMeans(n_clusters=4)
model.fit(x)
centers = model.cluster_centers_
print(centers)
pred_y = model.predict(x)
# 划分聚类边界
l, r = x[:, 0].min()-1, x[:, 0].max()+1
b, t = x[:, 1].min()-1, x[:, 1].max()+1
n = 500
grid_x, grid_y = np.meshgrid(
np.linspace(l, r, n),
np.linspace(b, t, n))
mesh_x = np.column_stack((grid_x.ravel(),
grid_y.ravel()))
pred_mesh_y = model.predict(mesh_x)
grid_z = pred_mesh_y.reshape(grid_x.shape)
mp.figure('Kmeans', facecolor='lightgray')
mp.title('Kmeans', fontsize=16)
mp.xlabel('X',fontsize=14)
mp.ylabel('Y',fontsize=14)
mp.tick_params(labelsize=10)
mp.pcolormesh(grid_x,grid_y,grid_z,cmap='gray')
mp.scatter(x[:,0], x[:,1], c=pred_y, cmap='jet',
label='points')
# 绘制聚类中心点
mp.scatter(centers[:,0], centers[:,1],
marker='+', s=230, c='orangered')
mp.legend()
mp.show()
图像量化
Kmeans聚类算法可以应用于图像量化领域. 通过KMeans算法可以把一张图像所包含的颜色值进行聚类划分. 得到划分后的聚类中心后, 把靠近某个聚类中的点的亮度值改为聚类中心值, 由此生成新的图片. 达到图像降维的目的. 这个过程称为图像量化. 。
图像量化可以很好的保存图像的轮廓, 降低机器识别的难度.
案例: lily.jpg
"""
图像量化 KMeans聚类
"""
import numpy as np
import scipy.misc as sm
import scipy.ndimage as sn
import sklearn.cluster as sc
import matplotlib.pyplot as mp
img = sm.imread('../ml_data/lily.jpg', True)
# 图像量化
x = img.reshape(-1, 1)
model = sc.KMeans(n_clusters=4)
model.fit(x)
y = model.labels_
print(y.shape)
# 把每个亮度值修改为相应的聚类中心值
centers = model.cluster_centers_.ravel()
print(centers.shape, centers)
# 使用numpy的掩码操作 修改y数组的每个值
result = centers[y].reshape(img.shape)
mp.figure('Image')
mp.subplot(121)
mp.xticks([])
mp.yticks([])
mp.imshow(img, cmap='gray')
mp.subplot(122)
mp.xticks([])
mp.yticks([])
mp.imshow(result, cmap='gray')
mp.tight_layout()
mp.show()
如图:第一张为原图灰度图,第二张为量化后的图像,相当于按照亮度提取了图像中的高亮信息。