4.K均值算法--应用

1. 应用K-means算法进行图片压缩

读取一张图片

观察图片文件大小,占内存大小,图片数据结构,线性化

用kmeans对图片像素颜色进行聚类

获取每个像素的颜色类别,每个类别的颜色

压缩图片生成:以聚类中收替代原像素颜色,还原为二维

观察压缩图片的文件大小,占内存大小

from sklearn.datasets import load_sample_image
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from pylab import mpl
import sys
import numpy as np
import matplotlib.image as img
import PIL
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示
china = img.imread('duolajiang.jpg')      # 读取图片
img.imsave('duolajiang.jpg', china)      # 保存图片
print("原图内存为", sys.getsizeof(china))
print("原图数据结构为", china.shape)
plt.imshow(china)
plt.show()

image = china[::3, ::3]
print("处理后数据结构为", image.shape)
X = image.reshape(-1, 3)    # 线性化处理
print("线性化后数据结构为", X.shape)
n_colors = 64
model = KMeans(n_colors)          # 聚类为64个聚类中心
labels = model.fit_predict(X)     #一维数组,30602个元素的类别
colors = model.cluster_centers_   # 二维数组(64,3)
new_image = colors[labels]        # 聚类中心代替
new_image = new_image.reshape(image.shape)  # 还原为二维数组
print("压缩后图片内存为", sys.getsizeof(new_image))
plt.imshow(new_image.astype(np.uint8))
plt.show()
img.imsave('new.jpg', new_image)   # 保存图片

结果:

未压缩:

 

 压缩后:

 

 

 

 2.可以根据患者的指标进行癌症患者的分类

import scipy
import scipy.cluster.hierarchy as sch
from scipy.cluster.vq import vq,kmeans,whiten
import numpy as np
import matplotlib.pylab as plt
#待聚类的数据点,cancer.csv有653行数据,每行数据有11维:
dataset = np.loadtxt('cancer.csv', delimiter=",")
#np数据从0开始计算,第0维维序号排除,第10维为标签排除,所以为1到9
points = dataset[:,1:9]
cancer_label = dataset[:,10]
print("points:\n",points)
print("cancer_label:\n",cancer_label)
# k-means聚类
#将原始数据做归一化处理
data=whiten(points)
#使用kmeans函数进行聚类,输入第一维为数据,第二维为聚类个数k.
#有些时候我们可能不知道最终究竟聚成多少类,一个办法是用层次聚类的结果进行初始化.当然也可以直接输入某个数值.
#k-means最后输出的结果其实是两维的,第一维是聚类中心,第二维是损失distortion,我们在这里只取第一维,所以最后有个[0]
#centroid = kmeans(data,max(cluster))[0]
centroid = kmeans(data,2)[0]
print(centroid)
#使用vq函数根据聚类中心对所有数据进行分类,vq的输出也是两维的,[0]表示的是所有数据的label
label=vq(data,centroid)[0]
num = [0,0]
for i in label:
    if(i == 0):
        num[0] = num[0] + 1
    else:
        num[1] = num[1] + 1
print('num =',num)
#np.savetxt('file.csv',label)
print("Final clustering by k-means:\n",label)
result = np.subtract(label,cancer_label)
print("result:\n",result)
count = [0,0]
for i in result:
    if(i == 0):
        count[0] = count[0] + 1
    else:
        count[1] = count[1] + 1
print(count)
print(float(count[1])/(count[0]+count[1]))

 

posted @ 2020-04-20 00:17  土块  阅读(168)  评论(0编辑  收藏  举报