【发布时间】:2021-05-26 22:42:57
【问题描述】:
我尝试使用 k-means 对每个使用过的应用程序类别的用户进行聚类(例如:通信、游戏)。 我得到了4个集群如下:
我如何解释集群?例如,我试图让集群 1 比集群 3 使用更多的通信和社交媒体。 有没有办法分别可视化每个集群?
【问题讨论】:
标签: python machine-learning cluster-analysis k-means
我尝试使用 k-means 对每个使用过的应用程序类别的用户进行聚类(例如:通信、游戏)。 我得到了4个集群如下:
我如何解释集群?例如,我试图让集群 1 比集群 3 使用更多的通信和社交媒体。 有没有办法分别可视化每个集群?
【问题讨论】:
标签: python machine-learning cluster-analysis k-means
您的陈述是...我如何解释集群?我将其解释为您想打印出集群的详细信息。那正确吗?您没有在此处发布任何示例代码,但请查看下面的代码,该代码非常动态(它会自动从 Yahoo Finance 导入股票数据)。我将在下面为您提供一些设置步骤,然后解决,我认为您的问题,就在最后,在“结果:”一词下方。
from math import sqrt
from sklearn.cluster import MiniBatchKMeans
import pandas_datareader as dr
from matplotlib import pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.cm as cm
import seaborn as sns
from scipy.cluster.vq import kmeans,vq
from sklearn.cluster import KMeans
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
start = '2019-1-1'
end = '2020-1-1'
tickers = ['AXP','AAPL','BA','CAT','CSCO','CVX','XOM','GS','HD','IBM','INTC','JNJ','KO','JPM','MCD', 'MMM', 'MRK', 'MSFT', 'NKE','PFE','PG','TRV','UNH','RTX','VZ','V','WBA','WMT','DIS','DOW']
prices_list = []
for ticker in tickers:
try:
prices = dr.DataReader(ticker,'yahoo',start)['Adj Close']
prices = pd.DataFrame(prices)
prices.columns = [ticker]
prices_list.append(prices)
except:
pass
prices_df = pd.concat(prices_list,axis=1)
prices_df.sort_index(inplace=True)
prices_df.head()
#Calculate average annual percentage return and volatilities over a theoretical one year period
returns = prices_df.pct_change().mean() * 252
returns = pd.DataFrame(returns)
returns.columns = ['Returns']
returns['Volatility'] = prices_df.pct_change().std() * sqrt(252)
#format the data as a numpy array to feed into the K-Means algorithm
data = np.asarray([np.asarray(returns['Returns']),np.asarray(returns['Volatility'])]).T
X = data
distorsions = []
for k in range(2, 20):
k_means = KMeans(n_clusters=k)
k_means.fit(X)
distorsions.append(k_means.inertia_)
fig = plt.figure(figsize=(15, 5))
plt.plot(range(2, 20), distorsions)
plt.grid(True)
plt.title('Elbow curve')
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=5)
kmeans.fit(X)
# 3D Plot of KMeans
km = KMeans(n_clusters=5)
km.fit(X)
km.predict(X)
labels = km.labels_#Plotting
fig = plt.figure(1, figsize=(7,7))
ax = Axes3D(fig, rect=[0, 0, 0.95, 1], elev=48, azim=134)
ax.scatter(X[:, 0], X[:, 1],
c=labels.astype(np.float), edgecolor="k", s=50)
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.set_zlabel("Z-axis")
plt.title("K Means", fontsize=14)
# Plot KMeans with Centroids
#K-Means
returns = prices_df.pct_change().mean() * 252
returns = pd.DataFrame(returns)
returns.columns = ['Returns']
returns['Volatility'] = prices_df.pct_change().std() * sqrt(252)
#format the data as a numpy array to feed into the K-Means algorithm
data = np.asarray([np.asarray(returns['Returns']),np.asarray(returns['Volatility'])]).T
X = data
kmeans = KMeans(n_clusters=5).fit(X)
labels = kmeans.predict(X)
centers = kmeans.cluster_centers_
plt.scatter(data[:,0],data[:,1],c=labels)
plt.scatter(centers[:,0],centers[:,1],c='red',s=100,marker='x')
plt.show()
# KMeans with annotations
# Hierarchial Clustering of Stocks
#labels = prices_df.columns.tolist()
plt.subplots_adjust(bottom = 0.1)
plt.scatter(data[:, 0], data[:, 1], c=kmeans.labels_, cmap='rainbow')
for label, x, y in zip(labels, data[:, 0], data[:, 1]):
plt.annotate(
label,
xy=(x, y), xytext=(-20, 20),
textcoords='offset points', ha='right', va='bottom',
bbox=dict(boxstyle='round,pad=0.5', fc='red', alpha=0.5),
arrowprops=dict(arrowstyle = '->', connectionstyle='arc3,rad=0'))
plt.show()
# List of tickers and cluter IDs
details = [(name,cluster) for name, cluster in zip(returns.index,labels)]
for detail in details:
print(detail)
结果:
('AXP', 0)
('AAPL', 3)
('BA', 4)
('CAT', 0)
('CSCO', 1)
('CVX', 1)
('XOM', 1)
('GS', 0)
('HD', 2)
('IBM', 1)
('INTC', 0)
('JNJ', 2)
('KO', 1)
('JPM', 0)
('MCD', 2)
('MMM', 1)
('MRK', 1)
('MSFT', 3)
('NKE', 0)
('PFE', 1)
('PG', 2)
('TRV', 2)
('UNH', 2)
('RTX', 2)
('VZ', 1)
('V', 2)
('WBA', 1)
('WMT', 2)
('DIS', 0)
('DOW', 0)
有关详细信息,请参阅下面的链接。
【讨论】: