04聚類演算法-程式碼案例一-K-means聚類

白爾摩斯發表於2018-12-08

03 聚類演算法 – K-means聚類

本案例資料來源:基於scikit包中的建立模擬資料的API建立聚類資料。

100個樣本,2個特徵,3個聚簇中心點,標準差=1.0,樣本取值範圍(-10,10)

使用__K-means演算法__對資料進行分類操作,並獲得聚類中心點以及總的樣本簇中心點距離和值。
引入包:from sklearn.cluster import KMeans
相關API:https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

用KMeans進行聚類分析


常規操作:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import sklearn.datasets as ds
import matplotlib.colors
from sklearn.cluster import KMeans#引入kmeans

## 設定屬性防止中文亂碼
mpl.rcParams[`font.sans-serif`] = [u`SimHei`]
mpl.rcParams[`axes.unicode_minus`] = False
一、產生模擬資料:

我們用make_blobs方法生成了2組資料:(data,y) 和 (data2,y2)

N = 1500 # 1500個樣本
centers = 4 # 4個聚簇中心點
data,y = ds.make_blobs(N, n_features=2, centers=centers, random_state=28)
data2,y2 = ds.make_blobs(N, n_features=2, centers=centers,  random_state=28)

data3 = np.vstack((data[y == 0][:200], data[y == 1][:100],
     data[y == 2][:10], data[y == 3][:50]))
y3 = np.array([0] * 200 + [1] * 100 + [2] * 10 + [3] * 50)
二、資料前期處理跟前面模型是一樣

這裡由於資料是自己生成的,所以不做資料預處理了

三、模型的構建

n_clusters就是K值,也是聚類值,本例中定義了centers = 4;
init初始化方法,可以是kmeans++,隨機,或者自定義的ndarray

km = KMeans(n_clusters=centers, init=`random`,random_state=28)
km.fit(data, y)

y_hat = km.predict(data)
print ("所有樣本距離聚簇中心點的總距離和:", km.inertia_)
print ("距離聚簇中心點的平均距離:", (km.inertia_ / N))
cluster_centers = km.cluster_centers_
print ("聚簇中心點:", cluster_centers)

y_hat2 = km.fit_predict(data2)
y_hat3 = km.fit_predict(data3)
四、畫圖
def expandBorder(a, b):
    d = (b - a) * 0.1
    return a-d, b+d
cm = mpl.colors.ListedColormap(list(`rgbmyc`))
plt.figure(figsize=(15, 9), facecolor=`w`)
1、原始資料
plt.subplot(241)
plt.scatter(data[:, 0], data[:, 1], c=y, s=30, cmap=cm, edgecolors=`none`)

x1_min, x2_min = np.min(data, axis=0)
x1_max, x2_max = np.max(data, axis=0)
x1_min, x1_max = expandBorder(x1_min, x1_max)
x2_min, x2_max = expandBorder(x2_min, x2_max)
plt.xlim((x1_min, x1_max))
plt.ylim((x2_min, x2_max))
plt.title(u`原始資料`)
plt.grid(True)
2、K-Means演算法聚類結果
plt.subplot(242)
plt.scatter(data[:, 0], data[:, 1], c=y_hat, s=30, cmap=cm, edgecolors=`none`)
plt.xlim((x1_min, x1_max))
plt.ylim((x2_min, x2_max))
plt.title(u`K-Means演算法聚類結果`)
plt.grid(True)

m = np.array(((1, 1), (0.5, 5)))
data_r = data.dot(m)
y_r_hat = km.fit_predict(data_r)
3、資料旋轉後原始資料圖
plt.subplot(243)
plt.scatter(data_r[:, 0], data_r[:, 1], c=y, s=30, cmap=cm, edgecolors=`none`)

x1_min, x2_min = np.min(data_r, axis=0)
x1_max, x2_max = np.max(data_r, axis=0)
x1_min, x1_max = expandBorder(x1_min, x1_max)
x2_min, x2_max = expandBorder(x2_min, x2_max)

plt.xlim((x1_min, x1_max))
plt.ylim((x2_min, x2_max))
plt.title(u`資料旋轉後原始資料圖`)
plt.grid(True)
4、資料旋轉後預測圖
plt.subplot(244)
plt.scatter(data_r[:, 0], data_r[:, 1], c=y_r_hat, s=30, cmap=cm, edgecolors=`none`)
plt.xlim((x1_min, x1_max))
plt.ylim((x2_min, x2_max))
plt.title(u`資料旋轉後預測圖`)
plt.grid(True)
5、不同方差的原始資料
plt.subplot(245)
plt.scatter(data2[:, 0], data2[:, 1], c=y2, s=30, cmap=cm, edgecolors=`none`)
x1_min, x2_min = np.min(data2, axis=0)
x1_max, x2_max = np.max(data2, axis=0)
x1_min, x1_max = expandBorder(x1_min, x1_max)
x2_min, x2_max = expandBorder(x2_min, x2_max)
plt.xlim((x1_min, x1_max))
plt.ylim((x2_min, x2_max))
plt.title(u`不同方差的原始資料`)
plt.grid(True)
6、不同方差簇資料的K-Means演算法聚類結果
plt.subplot(246)
plt.scatter(data2[:, 0], data2[:, 1], c=y_hat2, s=30, cmap=cm, edgecolors=`none`)
plt.xlim((x1_min, x1_max))
plt.ylim((x2_min, x2_max))
plt.title(u`不同方差簇資料的K-Means演算法聚類結果`)
plt.grid(True)
7、不同簇樣本數量原始資料圖
plt.subplot(247)
plt.scatter(data3[:, 0], data3[:, 1], c=y3, s=30, cmap=cm, edgecolors=`none`)
x1_min, x2_min = np.min(data3, axis=0)
x1_max, x2_max = np.max(data3, axis=0)
x1_min, x1_max = expandBorder(x1_min, x1_max)
x2_min, x2_max = expandBorder(x2_min, x2_max)
plt.xlim((x1_min, x1_max))
plt.ylim((x2_min, x2_max))
plt.title(u`不同簇樣本數量原始資料圖`)
plt.grid(True)
8、不同簇樣本數量的K-Means演算法聚類結果
plt.subplot(248)
plt.scatter(data3[:, 0], data3[:, 1], c=y_hat3, s=30, cmap=cm, edgecolors=`none`)
plt.xlim((x1_min, x1_max))
plt.ylim((x2_min, x2_max))
plt.title(u`不同簇樣本數量的K-Means演算法聚類結果`)
plt.grid(True)
plt.tight_layout(2, rect=(0, 0, 1, 0.97))
plt.suptitle(u`資料分佈對KMeans聚類的影響`, fontsize=18)
plt.show()

05 聚類演算法 – 二分K-Means、K-Means++、K-Means||、Canopy、Mini Batch K-Means演算法


相關文章