聚類分析(cluster analysis)是將一組研究對象分為相對同質的群組(clusters)的統計分析技術,即將觀測對象的群體按照相似性和相異性進行不同群組的划分,划分后每個群組內部各對象相似度很高,而不同群組之間的對象彼此相異度很高。
回歸、分類、聚類的區別 :
- 有監督學習 --->> 回歸、分類 / 無監督學習 --->>聚類
- 回歸 -->>產生連續結果,可用於預測
- 分類 -->>產生連續結果,可用於預測
- 聚類 -->>產生一組集合,可用於降維
一、PCA主成分分析
二、PCA主成分的python實現方法
通過sklearn的PCA類實現,from sklearn.decomposition import PCA
pca = PCA(n_components=1) # n_components參數表示最終維度
pca.fit(data) #創建模型
data_pca = pca.transform(data) #降維,創建模型和降維可通過一步實現fit_transform
data_inverse = pca.inverse_transform(data_pca) #根據降維結果反算原始數據
1.二維數據降維
rng = np.random.RandomState(8) data = np.dot(rng.rand(2,2),rng.randn(2,200)).T #矩陣相乘 df = pd.DataFrame({'X1':data[:,0],'X2':data[:,1]}) print(df.shape) print(df.head()) plt.scatter(df['X1'],df['X2'],alpha = 0.8,marker = '.') plt.axis('equal') #坐標軸每個單位表示的刻度相同 # (200, 2) # X1 X2 # 0 -1.174787 -1.404131 # 1 -1.374449 -1.294660 # 2 -2.316007 -2.166109 # 3 0.947847 1.460480 # 4 1.762375 1.640622
from sklearn.decomposition import PCA pca = PCA(n_components=1) # n_components參數表示最終維度 pca.fit(df) print(pca.explained_variance_) print(pca.components_) # print(pca.n_components) #返回保留的成分個數 # print(pca.explained_variance_ratio_) # 結果降為幾個維度,就有幾個特征值;原始數據有幾個維度,就有幾個特征向量 # explained_variance_:特征值 # components_:返回具有最大方差的成分,即特征向量 # 這里是shape(200,2)降為shape(200,1),只有1個特征值,對應2個特征向量 # 降維后主成分 A1 = 0.7788006 * X1 + 0.62727158 * X2 # 成分的結果值 = 2.80 * (-0.77*x1 -0.62 * x2) #通過這個來篩選它的主成分 df_pca = pca.transform(df) # 數據轉換,將原始二維數據轉換為降維后的一維數據 df_inverse = pca.inverse_transform(df_pca) # 數據轉換,將降維后的一維數據轉換成原始的二維數據 print('original shape:',df.shape) print('transformed shape:',df_pca.shape) print(df.head(10)) print(df_pca[:10]) print(df_inverse[:10])
plt.scatter(df['X1'],df['X2'], alpha = 0.8, marker = '.') #原始數據散點; plt.scatter(x_inverse[:,0],x_inverse[:,1], alpha = 0.8, marker = '.',color = 'r') #轉換之后的散點,紅色的就是最后的特征數據 plt.axis('equal')
2.多維數據降維
多維數據降維,使用自帶的圖像數據進行測試。
from sklearn.datasets import load_digits digits = load_digits() print(type(digits)) print(digits.data[:2]) print('數據長度為:%i條' % len(digits['data'])) print('數據形狀為:',digits.data.shape) #總共1797條數據,每條數據有64個變量 print('字段:',digits.keys()) print('分類(數值):',digits.target) print('分類(名稱):',digits.target_names)
將上述數據由64維降為2維,降維后的2個維度肯定都是主成分。
pca = PCA(n_components=2) #降為2維 projected = pca.fit_transform(digits.data) #相當於先fit構建模型,再transform進行轉換 projected[:2] print('original shape:',digits.data.shape) print('transformed shape:',projected.shape) print('特征值',pca.explained_variance_) #2個特征值 print('特征向量',pca.components_.shape) #2個成分,每個成分都有64個特征向量 # original shape: (1797, 64) # transformed shape: (1797, 2) # 特征值 [179.0069301 163.71774688] # 特征向量 (2, 64)
plt.scatter(projected[:,0],projected[:,1],s = 10,c = digits.target, cmap='Reds',edgecolor = 'none',alpha = 0.5) plt.colorbar()
將上述數據降為10維,並求主要成分。
pca = PCA(n_components=10) #降為10維 projected = pca.fit_transform(digits.data) #相當於先fit構建模型,再transform進行轉換 projected[:2] print('original shape:',digits.data.shape) print('transformed shape:',projected.shape) print(pca.explained_variance_) # 輸出特征值 ;10個特征值 print(pca.components_.shape) # 輸出特征向量形狀 s = pca.explained_variance_ c_s = pd.DataFrame({'x':s,'x_cumsum':s.cumsum()/s.sum()}) print(c_s) c_s['x_cumsum'].plot(style = '--ko', figsize = (10,4)) plt.axhline(0.85,color='r',linestyle="--",alpha=0.8) plt.text(6,c_s['x_cumsum'].iloc[6]-0.1,'第7個成分累計貢獻率超過85%',color = 'r') plt.grid()
三、K-means聚類的python實現方法
K-means聚類是最常用的機器學習聚類算法,且為典型的基於距離的聚類算法。主要步驟為:
kmeans = KMeans(n_clusters=4) #創建模型
kmeans.fit(x) #導入數據
y_kmeans = kmeans.predict(x) #預測每個數據屬於哪個類
centroids = kmeans.cluster_centers_ #每個類的中心點
先使用sklearn自帶的生成器生成數據
from sklearn.datasets.samples_generator import make_blobs # make_blobs聚類數據生成器 x,y_true = make_blobs(n_samples=300,centers=4,cluster_std=0.5,random_state=0) print(x[:5]) print(y_true[:5]) # n_samples 生成的樣本總數 # centers 類別數 # cluster_std 每個類別的方差,如果多類數據不同方差可設置為[std1,std2,...stdn] # random_state 隨機數種子 # x 生成的數據,y 數據對應的類別 # n_features 每個樣本的特征數 plt.scatter(x[:,0],x[:,1],s=10,alpha=0.8)
通過sklearn的KMeans進行聚類分析
from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=4) #創建模型 kmeans.fit(x) #導入數據 y_kmeans = kmeans.predict(x) #預測每個數據屬於哪個類 centroids = kmeans.cluster_centers_ #每個類的中心點 plt.scatter(x[:,0],x[:,1],s=30,c=y_kmeans,cmap = 'Dark2',alpha=0.5,marker='x') plt.scatter(centroids[:,0],centroids[:,1],s=70,c=[0,1,2,3],cmap = 'Dark2',marker='o') plt.title('K-means 300 points') plt.xlabel('value1') plt.ylabel('value2')