python - sklearn - scikit-learn: Encontrar las características que contribuyen a cada clúster de KMeans
plot k means python (4)
Puedes hacerlo de esta manera:
>>> import numpy as np
>>> import sklearn.cluster as cl
>>> data = np.array([99,1,2,103,44,63,56,110,89,7,12,37])
>>> k_means = cl.KMeans(init=''k-means++'', n_clusters=3, n_init=10)
>>> k_means.fit(data[:,np.newaxis]) # [:,np.newaxis] converts data from 1D to 2D
>>> k_means_labels = k_means.labels_
>>> k1,k2,k3 = [data[np.where(k_means_labels==i)] for i in range(3)] # range(3) because 3 clusters
>>> k1
array([44, 63, 56, 37])
>>> k2
array([ 99, 103, 110, 89])
>>> k3
array([ 1, 2, 7, 12])
Supongamos que tiene 10 funciones que está utilizando para crear 3 clústeres. ¿Hay alguna manera de ver el nivel de contribución que cada una de las características tiene para cada uno de los clusters?
Lo que quiero poder decir es que para el clúster k1, las características 1,4,6 fueron las características principales donde las características principales del cluster k2 eran 2,5,7.
Esta es la configuración básica de lo que estoy usando:
k_means = KMeans(init=''k-means++'', n_clusters=3, n_init=10)
k_means.fit(data_features)
k_means_labels = k_means.labels_
Supongo que al decir "una característica principal", quiere decir, tuvo el mayor impacto en la clase. Una buena exploración que puede hacer es observar las coordenadas de los centros de clúster. Por ejemplo, trazar para cada característica su coordenada en cada uno de los K centros.
Por supuesto, cualquier característica que sea a gran escala tendrá un efecto mucho mayor en la distancia entre las observaciones, por lo tanto, asegúrese de que sus datos estén bien escalados antes de realizar cualquier análisis.
Puedes usar
Principio de análisis de componentes (PCA)
PCA se puede hacer por descomposición de valores propios de una matriz de covarianza (o correlación) de datos o descomposición de valores singulares de una matriz de datos, generalmente después de centrar media (y normalizar o usar puntuaciones Z) la matriz de datos para cada atributo. Los resultados de un PCA generalmente se discuten en términos de puntajes de componentes, a veces denominados puntajes de factor (los valores variables transformados correspondientes a un punto de datos particular) y cargas (el peso por el cual cada variable original estandarizada debe multiplicarse para obtener el puntaje del componente) )
Algunos puntos esenciales:
- los valores propios reflejan la porción de la varianza explicada por el componente correspondiente . Digamos, tenemos 4 funciones con valores propios
1, 4, 1, 2
. Estas son las varianzas explicadas por el corresponsal. vectores. El segundo valor pertenece al primer componente principal ya que explica el 50% de la varianza total y el último valor pertenece al segundo componente principal que explica el 25% de la varianza total. - los autovectores son las combinaciones lineales del componente . Da los pesos para las características para que puedas saber qué característica tiene un impacto alto / bajo.
- use PCA basado en la matriz de correlación en lugar de la matriz de covarianza empírica, si los valores propios difieren fuertemente (magnitudes).
Enfoque de muestra
- hacer PCA en conjunto de datos completo (eso es lo que hace la función a continuación)
- tomar matriz con observaciones y características
- centrarlo en su promedio (promedio de valores de características entre todas las observaciones)
- calcular la matriz de covarianza empírica (por ejemplo,
np.cov
) o la correlación (ver arriba) - realizar la descomposición
- ordenar valores propios y vectores propios por valores propios para obtener componentes con el mayor impacto
- usar componentes en datos originales
- examinar los clusters en el conjunto de datos transformado. Al verificar su ubicación en cada componente, puede derivar las características de alto y bajo impacto en la distribución / varianza.
Función de muestra
Necesita import numpy as np
y scipy as sp
. Utiliza sp.linalg.eigh
para la descomposición. Es posible que desee comprobar también el módulo de descomposición scikit .
PCA se realiza en una matriz de datos con observaciones (objetos) en filas y características en columnas.
def dim_red_pca(X, d=0, corr=False):
r"""
Performs principal component analysis.
Parameters
----------
X : array, (n, d)
Original observations (n observations, d features)
d : int
Number of principal components (default is ``0`` => all components).
corr : bool
If true, the PCA is performed based on the correlation matrix.
Notes
-----
Always all eigenvalues and eigenvectors are returned,
independently of the desired number of components ``d``.
Returns
-------
Xred : array, (n, m or d)
Reduced data matrix
e_values : array, (m)
The eigenvalues, sorted in descending manner.
e_vectors : array, (n, m)
The eigenvectors, sorted corresponding to eigenvalues.
"""
# Center to average
X_ = X-X.mean(0)
# Compute correlation / covarianz matrix
if corr:
CO = np.corrcoef(X_.T)
else:
CO = np.cov(X_.T)
# Compute eigenvalues and eigenvectors
e_values, e_vectors = sp.linalg.eigh(CO)
# Sort the eigenvalues and the eigenvectors descending
idx = np.argsort(e_values)[::-1]
e_vectors = e_vectors[:, idx]
e_values = e_values[idx]
# Get the number of desired dimensions
d_e_vecs = e_vectors
if d > 0:
d_e_vecs = e_vectors[:, :d]
else:
d = None
# Map principal components to original data
LIN = np.dot(d_e_vecs, np.dot(d_e_vecs.T, X_.T)).T
return LIN[:, :d], e_values, e_vectors
Uso de muestra
Aquí hay una secuencia de comandos de muestra, que hace uso de la función dada y usa scipy.cluster.vq.kmeans2
para clustering. Tenga en cuenta que los resultados varían con cada ejecución. Esto se debe a que los conglomerados iniciales se inicializaron aleatoriamente.
import numpy as np
import scipy as sp
from scipy.cluster.vq import kmeans2
import matplotlib.pyplot as plt
SN = np.array([ [1.325, 1.000, 1.825, 1.750],
[2.000, 1.250, 2.675, 1.750],
[3.000, 3.250, 3.000, 2.750],
[1.075, 2.000, 1.675, 1.000],
[3.425, 2.000, 3.250, 2.750],
[1.900, 2.000, 2.400, 2.750],
[3.325, 2.500, 3.000, 2.000],
[3.000, 2.750, 3.075, 2.250],
[2.075, 1.250, 2.000, 2.250],
[2.500, 3.250, 3.075, 2.250],
[1.675, 2.500, 2.675, 1.250],
[2.075, 1.750, 1.900, 1.500],
[1.750, 2.000, 1.150, 1.250],
[2.500, 2.250, 2.425, 2.500],
[1.675, 2.750, 2.000, 1.250],
[3.675, 3.000, 3.325, 2.500],
[1.250, 1.500, 1.150, 1.000]], dtype=float)
clust,labels_ = kmeans2(SN,3) # cluster with 3 random initial clusters
# PCA on orig. dataset
# Xred will have only 2 columns, the first two princ. comps.
# evals has shape (4,) and evecs (4,4). We need all eigenvalues
# to determine the portion of variance
Xred, evals, evecs = dim_red_pca(SN,2)
xlab = ''1. PC - ExpVar = {:.2f} %''.format(evals[0]/sum(evals)*100) # determine variance portion
ylab = ''2. PC - ExpVar = {:.2f} %''.format(evals[1]/sum(evals)*100)
# plot the clusters, each set separately
plt.figure()
ax = plt.gca()
scatterHs = []
clr = [''r'', ''b'', ''k'']
for cluster in set(labels_):
scatterHs.append(ax.scatter(Xred[labels_ == cluster, 0], Xred[labels_ == cluster, 1],
color=clr[cluster], label=''Cluster {}''.format(cluster)))
plt.legend(handles=scatterHs,loc=4)
plt.setp(ax, title=''First and Second Principle Components'', xlabel=xlab, ylabel=ylab)
# plot also the eigenvectors for deriving the influence of each feature
fig, ax = plt.subplots(2,1)
ax[0].bar([1, 2, 3, 4],evecs[0])
plt.setp(ax[0], title="First and Second Component''s Eigenvectors ", ylabel=''Weight'')
ax[1].bar([1, 2, 3, 4],evecs[1])
plt.setp(ax[1], xlabel=''Features'', ylabel=''Weight'')
Salida
Los vectores propios muestran la ponderación de cada característica para el componente
Interpretación corta
Echemos un vistazo al clúster cero, el rojo. Nos interesará sobre todo el primer componente ya que explica aproximadamente 3/4 de la distribución. El grupo rojo está en el área superior del primer componente. Todas las observaciones arrojan valores bastante altos. Qué significa eso? Ahora, mirando a la combinación lineal del primer componente que vemos a primera vista, la segunda característica es bastante poco importante (para este componente). La primera y la cuarta característica son las más ponderadas y la tercera tiene una puntuación negativa. Esto significa que, como todos los vértices rojos tienen un puntaje bastante alto en la primera PC, estos vértices tendrán valores altos en la primera y última función, mientras que al mismo tiempo tienen puntuaciones bajas con respecto a la tercera característica.
En cuanto a la segunda característica, podemos echarle un vistazo a la segunda PC. Sin embargo, tenga en cuenta que el impacto general es mucho menor ya que este componente explica solo aproximadamente el 16% de la varianza en comparación con el ~ 74% de la primera PC.
Prueba esto,
estimator = KMeans ()
estimator.fit (X)
res = estimador .__ dict__
print res [''cluster_centers_'']
Obtendrás la matriz del clúster y los pesos característicos, de lo que puedes concluir, la función que tiene más peso toma la parte principal para contribuir al clúster.