數學模型:3.非監督學習--聚類分析 和K-means聚類
阿新 • • 發佈:2018-09-20
rand tar 聚類分析 復制 clust tle 降維算法 generator pro
1. 聚類分析
聚類分析(cluster analysis)是一組將研究對象分為相對同質的群組(clusters)的統計分析技術 ---->>
將觀測對象的群體按照相似性和相異性進行不同群組的劃分,劃分後每個群組內部各對象相似度很高,而不同群組之間的對象彼此相異度很高。
*** 回歸、分類、聚類的區別 :
有監督學習 --->> 回歸,分類 / 無監督學習 --->>聚類
回歸 -->>產生連續結果,可用於預測
分類 -->>產生連續結果,可用於預測
聚類 -->>產生一組集合,可用於降維。
本文主要介紹PCA主成分,K-means聚類
1.1 PCA主成分分析
1.2 PCA主成分的python實現方法
PCA主成分分析的python實現方法
最廣泛無監督算法 + 基礎的降維算法
通過線性變換將原始數據變換為一組各維度線性無關的表示,用於提取數據的主要特征分量 → 高維數據的降維
二維數據降維 / 多維數據降維
(1)二維數據降維
# 二維數據降維(二維降為一維只有1個特征值,2個特征向量) # 構建模型,分析主成分 from sklearn.decomposition import PCA # 加載主成分分析模塊PCApca = PCA(n_components = 1) # n_components = 1 → 降為1維 pca.fit(df) # 構建模型 # sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False) # n_components: PCA算法中所要保留的主成分個數n,也即保留下來的特征個數n # copy: True或者False,默認為True → 表示是否在運行算法時,將原始訓練數據復制一份 # fit(X,y=None) → 調用fit方法的對象本身。比如pca.fit(X),表示用X對pca這個對象進行訓練print(pca.explained_variance_) #特征值 [ 2.78300591] print(pca.components_)#特征向量 [[ 0.7788006 0.62727158]] print(pca.n_components) #主成分,成分的個數 1 #成分的結果值 = 2.78 * (0.77*x1 + 0.62 * x2) # components_:返回具有最大方差的成分。 # explained_variance_ratio_:返回 所保留的n個成分各自的方差百分比。 # n_components_:返回所保留的成分個數n。 # 這裏是shape(200,2)降為shape(200,1),只有1個特征值,對應2個特征向量 # 降維後主成分 A1 = 0.7788006 * X1 + 0.62727158 * X2 x_pca = pca.transform(df) x_pca x_pca = pca.transform(df) # 數據轉換 x_new = pca.inverse_transform(x_pca) # 將降維後的數據轉換成原始數據 print(‘original shape:‘,df.shape) print(‘transformed shape:‘,x_pca.shape) print(x_pca[:5]) print(‘-----‘) # 主成分分析,生成新的向量x_pca # fit_transform(X) → 用X來訓練PCA模型,同時返回降維後的數據,這裏x_pca就是降維後的數據 # inverse_transform() → 將降維後的數據轉換成原始數據
plt.scatter(df[‘X1‘],df[‘X2‘], alpha = 0.8, marker = ‘.‘) plt.scatter(x_new[:,0],x_new[:,1], alpha = 0.8, marker = ‘.‘,color = ‘r‘) plt.axis(‘equal‘) plt.grid() # # 生成圖表
(2)多維數據降維
# 多維數據降維 # 加載數據 from sklearn.datasets import load_digits digits = load_digits() print(digits .keys()) print(‘數據長度為:%i條‘ % len(digits[‘data‘])) print(‘數據形狀為:%i條‘,digits.data.shape) #總共1797條數據,每條數據有64個變量 print(digits.data[:2]) # 導入數據
# 多維數據降維 # 構建模型,分析主成分 pca = PCA(n_components = 2) # 降為2緯 projected = pca.fit_transform(digits.data) print(‘original shape:‘,digits.data.shape) print(‘transformed shape:‘,projected.shape) projected[:5]
print(pca.explained_variance_) # 輸出特征值 # print(pca.components_) # 輸出特征向量 ,64個特征向量 .shape是形狀 #print(projected) # 輸出解析後數據 # 降維後,得到2個成分,每個成分有64個特征向量 plt.scatter(projected[:,0],projected[:,1], c = digits.target, edgecolor = ‘none‘,alpha = 0.5, cmap = ‘Reds‘,s = 5) plt.axis(‘equal‘) plt.grid() plt.colorbar() # 二維數據制圖
# 多維數據降維 # 主成分篩選 pca = PCA(n_components = 10) # 降為10緯 projected = pca.fit_transform(digits.data) print(‘original shape:‘,digits.data.shape) print(‘transformed shape:‘,projected.shape) print(pca.explained_variance_) # 輸出特征值 print(pca.components_.shape) # 輸出特征向量形狀 #print(projected) # 輸出解析後數據 # 降維後,得到10個成分,每個成分有64個特征向量 c_s = pd.DataFrame({‘b‘:pca.explained_variance_, ‘b_sum‘:pca.explained_variance_.cumsum()/pca.explained_variance_.sum()}) print(c_s) # 做貢獻率累計求和 # 可以看到第7個成分時候,貢獻率超過85% → 選取前7個成分作為主成分
c_s[‘b_sum‘].plot(style = ‘--ko‘, figsize = (10,4)) plt.axhline(0.85,hold=None,color=‘r‘,linestyle="--",alpha=0.8) plt.text(6,c_s[‘b_sum‘].iloc[6]-0.08,‘第7個成分累計貢獻率超過85%‘,color = ‘r‘) plt.grid()
3. K-means聚類的python實現方法
最常用的機器學習聚類算法,且為典型的基於距離的聚類算法
K均值: 基於原型的、劃分的距離技術,它試圖發現用戶指定個數(K)的簇
以歐式距離作為相似度測度
# 創建數據 from sklearn.datasets.samples_generator import make_blobs # make_blobs聚類數據生成器 x,y_true = make_blobs(n_samples = 300, # 生成300條數據 centers = 4, # 四類數據 cluster_std = 0.5, # 方差一致,越小聚集越小,越大越分散 random_state = 0) print(x[:5]) print(y_true[:5]) # n_samples → 待生成的樣本的總數。 # n_features → 每個樣本的特征數。 # centers → 類別數 # cluster_std → 每個類別的方差,如多類數據不同方差,可設置為[1.0,3.0](這裏針對2類數據) # random_state → 隨機數種子 # x → 生成數據值, y → 生成數據對應的類別標簽 plt.scatter(x[:,0],x[:,1],s = 10,alpha = 0.8) plt.grid() # 繪制圖表
from sklearn.cluster import KMeans kmeans = KMeans(n_clusters = 4) kmeans.fit(x) y_kmeans = kmeans.predict(x) centroids = kmeans.cluster_centers_ # 構建模型,並預測出樣本的類別y_kmeans # kmeans.cluster_centers_:得到不同簇的中心點 plt.scatter(x[:, 0], x[:, 1], c = y_kmeans, cmap = ‘Dark2‘, s = 50, alpha = 0.5, marker = ‘x‘) plt.scatter(x[:,0],x[:,1],c = y_kmeans, cmap = ‘Dark2‘, s= 50,alpha = 0.5,marker=‘x‘) plt.scatter(centroids[:,0],centroids[:,1],c = [0,1,2,3], cmap = ‘Dark2‘,s= 70,marker=‘o‘) plt.title(‘K-means 300 points\n‘) plt.xlabel(‘Value1‘) plt.ylabel(‘Value2‘) plt.grid() # 繪制圖表 centroids
數學模型:3.非監督學習--聚類分析 和K-means聚類