kmeans学习笔记轮廓系数以及使用KMeans做矢量量化

kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第1张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第2张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第3张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第4张图片

from sklearn.cluster import KMeans
cluster=KMeans(n_clusters=3,random_state=0).fit(X)
y_pred=cluster.labels_
color=["red","pink","orange","gray"]
#根据聚类结果画图
fig,ax1=plt.subplots(1)
for i in range(3):
    ax1.scatter(X[y_pred==i,0],X[y_pred==i,1]
               ,marker='o'
               ,s=8,
               c=color[i])
 
ax1.scatter(cluster.cluster_centers_[:,0],cluster.cluster_centers_[:,1]
           ,marker="x"
           ,s=20,
            c="black"
        )
plt.show()  

kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第5张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第6张图片
在这里插入图片描述

kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第7张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第8张图片
在这里插入图片描述

#聚类算法的模型评估指标
#轮廓系数是对每一个样本而言的,不是针对某一簇而言
from sklearn.metrics import silhouette_samples
from sklearn.metrics import silhouette_score
cluster=KMeans(n_clusters=4,random_state=0).fit(X)
y_pred=cluster.labels_
silhouette_score(X,y_pred)

kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第9张图片
在这里插入图片描述

kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第10张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第11张图片
在这里插入图片描述
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第12张图片
在这里插入图片描述

#通过轮廓系数来选择最佳的n_clusters,之所以不选择学习曲线是因为它不能很好的展示分类结果
#sklearn中的kmeans使用的是欧式距离
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm#colormap用来画图
#自己创建数据集
X,y=make_blobs(n_samples=500,n_features=2,centers=4,random_state=0)
n_clusters=4
#创建一个画布,画布上有2个子图对象
fig,(ax1,ax2)=plt.subplots(1,2)
#设置画布的尺寸
fig.set_size_inches(18,7)
#第一个图是轮廓系数图像,由每个样本的轮廓系数作为横坐标
#横向条形图,纵坐标是每个样本,并且要求同一簇内的放在一起,同样的颜色,
ax1.set_xlim([-0.1,1])
ax1.set_ylim([0,X.shape[0]+(n_clusters+1)*10])
#开始建模
clusterer=KMeans(n_clusters=n_clusters,random_state=10).fit(X)
silhouette_avg=silhouette_score(X,clusterer.labels_)#整体的轮廓系数
print("FOR n_clusters=",n_clusters,"the average silhouette_score is ",silhouette_avg)
#返回每个样本的轮廓系数作为横坐标,并且把横坐标进行排序
sample_silhouette_values=silhouette_samples(X,clusterer.labels_)
#设定y轴上的初始取值
y_lower=10
#接下来对每一个簇进行循环
for i in range(n_clusters):
    ith_cluster_silhouette_values=sample_silhouette_values[clusterer.labels_==i]
    ith_cluster_silhouette_values.sort()
    #得出该簇中的样本总数
    size_cluster_i=ith_cluster_silhouette_values.shape[0]
    #这一簇的纵坐标就是y_lower+样本总数
    y_upper=y_lower+size_cluster_i
    #colormap使用小数来调用颜色的函数
    #nipy_spectral(输入任意小数代表一个颜色)(i)
    color=cm.nipy_spectral(float(i)/n_clusters)
    #开始填充图像
    #fill_between是填充曲线与直角之间空间的函数
    #fill_betweenx的直角实在纵坐标上,定义曲线点的横坐标,纵坐标,颜色
    #fill_betweeny的直角实在横坐标上
    ax1.fill_betweenx(np.arange(y_lower,y_upper)
                     ,ith_cluster_silhouette_values
                     ,facecolor=color
                     ,alpha=0.7)
    ax1.text(-0.05,y_lower+0.5*size_cluster_i,str(i))
    y_lower=y_upper+10
ax1.set_title("The silhouette plot for the various clusters.")
ax1.set_xlabel("The silhouette coefficient values")
ax1.set_ylabel("Cluster label")
ax1.axvline(x=silhouette_avg, color="red", linestyle="--")#设置一条均线
ax1.set_yticks([])
ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])
colors = cm.nipy_spectral(clusterer.labels_.astype(float) / n_clusters)
ax2.scatter(X[:,0],X[:,1]
           ,c=colors,
           marker="o",
           s=8)
centers=clusterer.cluster_centers_
ax2.scatter(centers[:,0],centers[:,1]
           ,marker="x"
           ,s=15,
           c="black")
plt.show()
    

kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第13张图片

for n_clusters in [2,3,4,5,6,7]:
    #创建一个画布,画布上有2个子图对象
    fig,(ax1,ax2)=plt.subplots(1,2)
    #设置画布的尺寸
    fig.set_size_inches(18,7)
    #第一个图是轮廓系数图像,由每个样本的轮廓系数作为横坐标
    #横向条形图,纵坐标是每个样本,并且要求同一簇内的放在一起,同样的颜色,
    ax1.set_xlim([-0.1,1])
    ax1.set_ylim([0,X.shape[0]+(n_clusters+1)*10])
    #开始建模
    clusterer=KMeans(n_clusters=n_clusters,random_state=10).fit(X)
    silhouette_avg=silhouette_score(X,clusterer.labels_)#整体的轮廓系数
    print("FOR n_clusters=",n_clusters,"the average silhouette_score is ",silhouette_avg)
    #返回每个样本的轮廓系数作为横坐标,并且把横坐标进行排序
    sample_silhouette_values=silhouette_samples(X,clusterer.labels_)
    #设定y轴上的初始取值
    y_lower=10
    #接下来对每一个簇进行循环
    for i in range(n_clusters):
        ith_cluster_silhouette_values=sample_silhouette_values[clusterer.labels_==i]
        ith_cluster_silhouette_values.sort()
        #得出该簇中的样本总数
        size_cluster_i=ith_cluster_silhouette_values.shape[0]
        #这一簇的纵坐标就是y_lower+样本总数
        y_upper=y_lower+size_cluster_i
        #colormap使用小数来调用颜色的函数
        #nipy_spectral(输入任意小数代表一个颜色)(i)
        color=cm.nipy_spectral(float(i)/n_clusters)
        #开始填充图像
        #fill_between是填充曲线与直角之间空间的函数
        #fill_betweenx的直角实在纵坐标上,定义曲线点的横坐标,纵坐标,颜色
        #fill_betweeny的直角实在横坐标上
        ax1.fill_betweenx(np.arange(y_lower,y_upper)
                         ,ith_cluster_silhouette_values
                         ,facecolor=color
                         ,alpha=0.7)
        ax1.text(-0.05,y_lower+0.5*size_cluster_i,str(i))
        y_lower=y_upper+10
    ax1.set_title("The silhouette plot for the various clusters.")
    ax1.set_xlabel("The silhouette coefficient values")
    ax1.set_ylabel("Cluster label")
    ax1.axvline(x=silhouette_avg, color="red", linestyle="--")#设置一条均线
    ax1.set_yticks([])
    ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])
    colors = cm.nipy_spectral(clusterer.labels_.astype(float) / n_clusters)
    ax2.scatter(X[:,0],X[:,1]
               ,c=colors,
               marker="o",
               s=8)
    centers=clusterer.cluster_centers_
    ax2.scatter(centers[:,0],centers[:,1]
               ,marker="x"
               ,s=15,
               c="black")
    plt.show()
    

kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第14张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第15张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第16张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第17张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第18张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第19张图片
并不是选择轮廓系数最高的,而是根据业务需求进行选择

矢量量化
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第20张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第21张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第22张图片

#使用kmeans做矢量量化
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
#打乱一个有序的序列,用来洗牌等
china=load_sample_image("china.jpg")#图片一般是三维数据
china

kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第23张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第24张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第25张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第26张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第27张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第28张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第29张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第30张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第31张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第32张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第33张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第34张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第35张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第36张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第37张图片
kmeans学习笔记轮廓系数以及使用KMeans做矢量量化_第38张图片

你可能感兴趣的:(kmeans学习笔记轮廓系数以及使用KMeans做矢量量化)