無監督學習-主成分分析和聚類分析


聚類分析(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')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM