python+sklearn实现K均值算法(聚类第一篇)

本文所用文件的链接

链接: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):x1x2=(x1x2)2 p(x1,y1)p(x2,y2):(x1x2)2+(y1y2)2 p(x1,y1,z1)p(x2,y2,z2):(x1x2)2+(y1y2)2+(z1z2)2

K均值算法

第一步: 随机选择K个样本作为K个聚类中心, 计算每个样本到各个聚类中心的欧式距离, 将该样本分配到与之距离最近的聚类中心所在的类别中.

第二步: 根据第一步得到的聚类划分, 分别计算每个聚类所有样本的几何中心, 将几何中心作为新的聚类中心,重复第一步. 直到计算所得几何中心与聚类中心重合或接近重合为止.

注意:

  1. 聚类数K必须事先已知. 可以借助某些指标,选择最好的K.
  2. 聚类中心的初始选择会影响到最终的聚类划分的结果. 初始重新样本尽量选择距离较远的样本.

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()

如图:第一张为原图灰度图,第二张为量化后的图像,相当于按照亮度提取了图像中的高亮信息。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值