文章目錄
- 案例實戰:聚類演算法用于降維,KMeans的矢量量化應用
- 1、匯入相關庫
- 2、讀取資料
- 3、資料處理
- 4、對資料進行KMeans的矢量量化
- 5、對資料進行隨機矢量量化
- 6、畫圖,查看結果
案例實戰:聚類演算法用于降維,KMeans的矢量量化應用
1、匯入相關庫
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin
from sklearn.datasets import load_sample_image
from sklearn.utils import shuffle
2、讀取資料
flower=load_sample_image('flower.jpg')
plt.imshow(flower)

3、資料處理
w,h,d=flower.shape
flower_array=np.reshape(flower,(w*h,d))
flower_array

圖片資料為三維資料,第三維資料為像素資訊,將其轉化為二維資料,帶入模型
4、對資料進行KMeans的矢量量化
image_array_sample=shuffle(flower_array,random_state=0)[:1000]
kms=KMeans(n_clusters=k,random_state=0).fit(image_array_sample)
label=kms.predict(flower_array)
image_kmeans=flower_array.copy()
for i in range(w*h):
image_kmeans[i]=kms.cluster_centers_[label[i]]
pd.DataFrame(image_kmeans).drop_duplicates().shape
image_kmeans=image_kmeans.reshape(w,h,d)
shuffle:該函式是將圖片二維資料隨機排序,類似于洗牌,取出前1000個色素資訊,訓練模型,確定質心,然后利用已知質心再去分類所有的二維圖片色素資訊,分為k類,然后將這k類中的質心色素代替新的圖片色素資訊,再將二維資料改為三維,成為圖片格式,
5、對資料進行隨機矢量量化
random_sample=shuffle(flower_array,random_state=0)[:k]
labels_random=pairwise_distances_argmin(random_sample,flower_array,axis=0)
image_random=flower_array.copy()
for i in range(w*h):
image_random[i]=random_sample[labels_random[i]]
image_random=image_random.reshape(w,h,d)
隨機取出k個色素資料
pairwise_distances_argmin(x,y)
回傳和y一樣的結構,該結構中是從x中找出y每個元素到x歐式距離最小樣本的索引,和上面的label類似
6、畫圖,查看結果
plt.figure(figsize=(10,10))
plt.axis('off')
plt.title('original')
plt.imshow(flower)

plt.figure(figsize=(10,10))
plt.axis('off')
plt.title('KMeans')
plt.imshow(image_kmeans)

plt.figure(figsize=(10,10))
plt.axis('off')
plt.title('Random')
plt.imshow(image_random)

由上圖可以看出用KMeans壓縮的圖片和原圖片差不多,因為KMeans是將所有色素資訊聚類,不同類的色素資訊用該類的中心點代替,所以顏色并沒有什么缺失
然而隨機取出的色素來代替,顏色會有缺失,因為隨機選取色素的程序中喪失了主要的色素資訊,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/254543.html
標籤:python
上一篇:【每日藍橋】16、一三年省賽Java組真題“幸運數”
下一篇:c#雙擊設計器生成的代碼怎么洗掉
