Resumen de agrupamiento de k-medias

1. Información general

Los algoritmos de agrupamiento, también conocidos como "aprendizaje no supervisado", tienen como objetivo dividir los datos en grupos (o agrupaciones) significativos o útiles.
Por favor agregue una descripción de la imagen

2.K significa

Conceptos clave: conglomerados y centroides
El algoritmo KMeans divide la matriz de características X de un conjunto de N muestras en K conglomerados sin intersección. Intuitivamente, un conglomerado es un grupo de datos reunidos. Los datos de un conglomerado se consideran del misma clase. Los clústeres son el resultado de la agrupación.
La media de todos los datos en un grupo a menudo se conoce como los "centroides" del grupo. En un plano bidimensional, la abscisa del centroide de un grupo de puntos de datos es la media de la abscisa del grupo de puntos de datos, y la ordenada del centroide es la media de la ordenada del grupo de puntos de datos. El mismo principio se puede extender al
espacio de alta dimensión.

3. La definición y solución de la suma de errores cuadráticos dentro del conglomerado

Creemos que los datos clasificados en un mismo clúster son similares, pero los datos en diferentes clústeres son diferentes, por lo que perseguimos "pequeñas diferencias dentro de los grupos y grandes diferencias entre grupos". El algoritmo de agrupamiento también tiene el mismo propósito: buscamos "pequeñas diferencias dentro del grupo y grandes diferencias fuera del grupo". Y esta "diferencia" se mide por la distancia desde el punto de muestra hasta el centroide de su grupo. Para un conglomerado, cuanto menor sea la suma de las distancias desde todos los puntos de muestra hasta el centroide, más similares serán las muestras en este conglomerado y menores serán las diferencias dentro del conglomerado.
Por favor agregue una descripción de la imagen
n representa el número de características para cada muestra, x representa la muestra y miu representa el centroide en el grupo.
Por favor agregue una descripción de la imagen
Entre ellos, m es el número de muestras en un conglomerado y j es el número de cada muestra. Esta fórmula se llama cluster sum of squares (cluster Sum of Square), también conocida como Inercia.
La suma total de cuadrados (Total Cluster Sum of Square), también llamada inercia total, se obtiene sumando la suma de cuadrados intra-cluster de todos los clusters en un conjunto de datos . Cuanto menor sea la inercia total, más similares serán las muestras en cada grupo y mejor será el efecto de agrupación. Por tanto, lo que persigue KMeans es resolver el centroide que pueda minimizar la Inercia.

4.sklearn.cluster.KMeans

4.1 Parámetro importante n_clusters

n_clusters es k en KMeans, lo que significa que le decimos al modelo cuántas categorías queremos dividir. Este es el único parámetro requerido en KMeans. El valor predeterminado es 8 categorías, pero generalmente nuestro resultado de agrupación será un resultado inferior a 8.
agrupamiento simple

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

#首先简单的进行一次聚类
'''
步骤如下:
1。首先使用sklearn中的方法来自定义自己的数据
2。画出散点图,顺带画出已经分好簇的散点图,使用plot,同时也对原始的数据已经分好簇的数据进行画图描述使用四种颜色
3。基于这个分布,使用kmeans来进行聚类,需要导入聚类中的kmeans
    设置要分好的类别,然后对其进行拟合,预测的结果使用label可以看到预测出来的结果.
    使用sluster_centers_可以输出每一个簇的分类点的位置
    使用inertia_可以查看总的欧氏距离是多少
4。分别猜测其中有3456四个簇,通过簇内平方和来判断哪一个数目是最好的。
'''

#自己创建数据集,生成的数据大小是500*2500个数据,每一个数据有两个特征,分别对应的是x1,x2
X,Y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)


fig,ax1 = plt.subplots(1)
ax1.scatter(
    X[:,0],
    X[:,1],
    marker = 'o',
    s=8
)
color = ['red','pink','orange','gray']
# fig,ax2 = plt.subplots(1)
# for i in range(4):
#     ax2.scatter(
#         X[Y==i,0],
#         X[Y==i,1],
#         s=8,
#         c=color[i]
#     )
plt.show()

from sklearn.cluster import KMeans
n_clusters = 3
cluster = KMeans(n_clusters=n_clusters,random_state=0).fit(X)
n_clusters = 4
cluster = KMeans(n_clusters=n_clusters,random_state=0).fit(X)
n_clusters = 5
cluster = KMeans(n_clusters=n_clusters,random_state=0).fit(X)
n_clusters = 6
cluster = KMeans(n_clusters=n_clusters,random_state=0).fit(X)
y_pred = cluster.labels_#聚类之后分好的类别。
print(y_pred)
pre = cluster.fit_predict(X)
#print(pre == y_pred)
inertia = cluster.inertia_
centroid = cluster.cluster_centers_
print(inertia)
color = ['red','pink','orange','gray','green','yellow']
fig , ax3 = plt.subplots()

for i in range(n_clusters):
    ax3.scatter(X[y_pred==i,0],X[y_pred==i,1]
                ,marker='o'
                ,s=8
                ,c=color[i]
                )
ax3.scatter(centroid[:,0]
            ,centroid[:,1]
            ,marker='x'
            ,s=15
            ,c='black')
plt.show()

4.2 Índice de evaluación del modelo del algoritmo de agrupamiento

A diferencia de los modelos de clasificación y la regresión, la evaluación de modelos para algoritmos de agrupamiento no es un asunto simple.
1. En la clasificación, hay una salida de resultado directo (etiqueta), y el resultado de la clasificación se puede dividir en correcto e incorrecto, por lo que usamos precisión de predicción, matriz de confusión, curva ROC y otros indicadores para evaluar, pero no importa cómo evaluar, es la capacidad del modelo para encontrar la respuesta correcta.
2. En la regresión, debido a la necesidad de ajustar los datos, tenemos el error cuadrático medio SSE y una función de pérdida para medir el grado de ajuste del modelo. Pero ninguna de estas métricas se puede utilizar para la agrupación.

4.3.1 Cuando se conoce la verdadera etiqueta

Preferimos usar algoritmos de clasificación si tenemos etiquetas reales. Pero no descarta la posibilidad de que todavía podamos usar algoritmos de agrupamiento. Si tenemos los datos de la situación de agrupamiento real de la muestra, podemos medir el efecto del agrupamiento en los resultados del algoritmo de agrupamiento y los resultados reales. Los siguientes tres métodos se usan comúnmente:
Puntaje de información mutua: cuanto más cerca esté el rango de valores a 1 en (0,1); mejor será el efecto de agrupación; 0 puntos se generan bajo agrupación aleatoria uniforme;
V-meature: el rango de valores es en Cuanto más cerca de 1 entre (0,1), cuanto más cerca de 1, mejor será el efecto de agrupamiento
Ajuste el coeficiente Rand: cuanto más cerca esté el rango de valores de 1 entre (0,1), cuanto más cerca de 1, mejor

4.3.2 Cuando se desconoce la etiqueta verdadera: Coeficientes de silueta

Entre ellos, el coeficiente de silueta es el índice de evaluación más utilizado para los algoritmos de agrupamiento. Se define para cada muestra y puede medir simultáneamente:
1) la similitud a de la muestra con otras muestras en su propio conglomerado, que es igual a la distancia promedio entre la muestra y todos los demás puntos en el mismo conglomerado 2)
la relación entre la muestra y La similitud b de muestras en otros conglomerados es igual a la distancia promedio entre la muestra y todos los puntos en el siguiente conglomerado más cercano. De acuerdo con
los requisitos del conglomerado, "la diferencia dentro del conglomerado es pequeña y la diferencia fuera del grupo es grande", esperamos que b siempre sea mayor que a , y cuanto mayor sea, mejor.
Por favor agregue una descripción de la imagen
Es fácil entender que el rango del coeficiente de la silueta es (-1,1), y cuanto más cercano es el valor a 1, la muestra es muy similar a la muestra en su propio conglomerado, y no es similar a las muestras en otros conglomerados Cuando el punto de muestra es similar a la muestra fuera del conglomerado Cuando es más similar, el coeficiente de silueta es negativo. Cuando el coeficiente de silueta es 0, significa que las muestras en los dos conglomerados tienen la misma similitud y los dos conglomerados deben ser un solo conglomerado. Se puede concluir que cuanto más cerca esté el coeficiente de silueta de 1, mejor, y los números negativos indican que el efecto de agrupamiento es muy pobre.

Si la mayoría de las muestras en un conglomerado tienen coeficientes de silueta relativamente altos, el conglomerado tendrá un coeficiente de silueta general más alto y cuanto mayor sea el coeficiente de silueta promedio para todo el conjunto de datos, la agrupación será adecuada. Si muchos puntos de muestra tienen coeficientes de silueta bajos o incluso valores negativos, la agrupación es inapropiada y el hiperparámetro K de agrupación puede establecerse demasiado grande o demasiado pequeño.

4.3.3 Cuando se desconoce la etiqueta real: Índice de Calinski-Harabaz

Además del coeficiente de silueta que es el más utilizado, también tenemos el Índice de Calinski-Harabaz (CHI para abreviar, también conocido como estándar de la relación de varianza), el Índice de Davies-Bouldin (Davies-Bouldin) y la matriz de contingencia (Contingency Matriz) se puede utilizar.

Aquí nos enfocamos en entender el índice de Kalinske-Harabas. Cuanto mayor sea el índice de Calinski-Harabaz, mejor. Para un conglomerado con k conglomerados, el índice de Calinski-Harabaz s(k) se escribe de la siguiente manera:
Por favor agregue una descripción de la imagen

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
from sklearn.datasets import make_blobs
n_clusters = 5
X,Y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)

fig, (ax1, ax2) = plt.subplots(1, 2)
fig.set_size_inches(18, 7)#是用来设置生成图片大小的
ax1.set_xlim([-0.1, 1])#设置x坐标轴的
ax1.set_ylim([0, X.shape[0] + (n_clusters + 1) * 10])
clusterer = KMeans(n_clusters=n_clusters, random_state=10).fit(X)
cluster_labels = clusterer.labels_#分出来的类别
silhouette_avg = silhouette_score(X, cluster_labels)
print("For n_clusters =", n_clusters,"The average silhouette_score is :", silhouette_avg)
sample_silhouette_values = silhouette_samples(X, cluster_labels)
y_lower = 10
for i in range(n_clusters):
    ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]
    ith_cluster_silhouette_values.sort()#这里是为了能够从小到大向上排列
    size_cluster_i = ith_cluster_silhouette_values.shape[0]
    y_upper = y_lower + size_cluster_i#这里是留出来上下的空间
    color = cm.nipy_spectral(float(i)/n_clusters)#设置颜色使用的。
    '''
    进行颜色的填充。只不过是填充的方向不同。
fill_between是进行y轴方向上的填充,也就是竖直方向的填充
fill_betweenx是进行x轴方向上的填充,也就是水平方向的填充
    '''
    # 第一个参数是范围
    # 第二个参数表示填充的上界
    # 第三个参数表示填充的下界,默认0
    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.axvline设置一条中轴线。所有样本的轮廓系数。
ax1.set_yticks([])
ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])
colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters)
ax2.scatter(X[:, 0], X[:, 1] ,marker='o',s=8,c=colors )
centers = clusterer.cluster_centers_
# Draw white circles at cluster centers在簇中画出来质心
ax2.scatter(centers[:, 0], centers[:, 1], marker='x',
c="red", alpha=1, s=200)
ax2.set_title("The visualization of the clustered data.")
ax2.set_xlabel("Feature space for the 1st feature")
ax2.set_ylabel("Feature space for the 2nd feature")
plt.suptitle(("Silhouette analysis for KMeans clustering on sample data ""with n_clusters = %d" % n_clusters), fontsize=14, fontweight='bold')
plt.show()

4.3 Parámetros importantes init & random_state & n_init: ¿Cómo colocar el centroide inicial?

Un enlace importante en K-Means es colocar el centroide inicial. Dado el tiempo suficiente, las medias K definitivamente convergerán, pero la inercia puede converger a un mínimo local. Si puede converger al mínimo verdadero depende en gran medida de la inicialización de los centroides. init es el parámetro utilizado para ayudarnos a decidir cómo inicializar.

init: Puede ingresar "k-means++", "random" o una matriz n-dimensional. Así es como se inicializan los centroides, por defecto "k-means++". Escriba "kmeans ++": una forma inteligente de elegir los centros de clúster iniciales para la agrupación de K-means para acelerar la convergencia.
random_state: controla la semilla de número aleatorio de cada inicialización aleatoria de centroide
n_init: entero, predeterminado 10, el número de veces para ejecutar el algoritmo k-means con diferentes semillas de inicialización aleatoria de centroide.

4.4 Parámetros importantes max_iter & tol: deja que la iteración se detenga

Cuando el centroide ya no se mueve, el algoritmo Kmeans se detiene. Pero antes de la convergencia total, también podemos usar max_iter, el número máximo de iteraciones, o tol, la cantidad de caída de inercia entre dos iteraciones, estos dos parámetros para detener la iteración antes de tiempo.

max_iter: entero, predeterminado 300, el número máximo de iteraciones del algoritmo k-means para una sola ejecución
tol: número de coma flotante, predeterminado 1e-4, la cantidad de caída de inercia entre dos iteraciones, si el valor de la caída de inercia entre dos iteraciones es menor que tol El valor establecido, la iteración
se detendrá

random = KMeans(n_clusters = 10,init="random",max_iter=10,random_state=420).fit(X)
y_pred_max10 = random.labels_
silhouette_score(X,y_pred_max10)
random = KMeans(n_clusters = 10,init="random",max_iter=20,random_state=420).fit(X)
y_pred_max20 = random.labels_
silhouette_score(X,y_pred_max20)

5. Algoritmo de agrupamiento para reducción de dimensionalidad, aplicación de cuantización vectorial de KMeans

Supongo que te gusta

Origin blog.csdn.net/guoguozgw/article/details/129240604#comments_25380299
Recomendado
Clasificación