【问题标题】:How to interpret clusters? [closed]如何解释集群? [关闭]
【发布时间】:2021-05-26 22:42:57
【问题描述】:

我尝试使用 k-means 对每个使用过的应用程序类别的用户进行聚类(例如:通信、游戏)。 我得到了4个集群如下:

我如何解释集群?例如,我试图让集群 1 比集群 3 使用更多的通信和社交媒体。 有没有办法分别可视化每个集群?

【问题讨论】:

    标签: python machine-learning cluster-analysis k-means


    【解决方案1】:

    您的陈述是...我如何解释集群?我将其解释为您想打印出集群的详细信息。那正确吗?您没有在此处发布任何示例代码,但请查看下面的代码,该代码非常动态(它会自动从 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)
    

    有关详细信息,请参阅下面的链接。

    https://github.com/ASH-WICUS/Notebooks/blob/master/Clustering%20-%20Historical%20Stock%20Prices.ipynb

    【讨论】:

      猜你喜欢
      • 2019-05-28
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      • 2022-07-12
      • 2020-05-24
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多