數學模型:3.非監督學習--聚類分析 和K-means聚類


 1. 聚類分析

聚類分析(cluster analysis)是一組將研究對象分為相對同質的群組(clusters)的統計分析技術 ---->>

將觀測對象的群體按照相似性和相異性進行不同群組的划分,划分后每個群組內部各對象相似度很高,而不同群組之間的對象彼此相異度很高。

*** 回歸、分類、聚類的區別 :

  有監督學習 --->> 回歸,分類    /   無監督學習  --->>聚類

  回歸 -->>產生連續結果,可用於預測

  分類 -->>產生連續結果,可用於預測

  聚類 -->>產生一組集合,可用於降維。

本文主要介紹PCA主成分,K-means聚類

1.1 PCA主成分分析

 

 

1.2 PCA主成分的python實現方法

PCA主成分分析的python實現方法

最廣泛無監督算法 + 基礎的降維算法
通過線性變換將原始數據變換為一組各維度線性無關的表示,用於提取數據的主要特征分量 → 高維數據的降維

二維數據降維 / 多維數據降維

 (1)二維數據降維

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline
# 二維數據降維
# 數據創建
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.head())
print(df.shape)

plt.scatter(df['X1'],df['X2'], alpha = 0.8, marker = '.')
plt.axis('equal')
plt.grid()
# 生成圖表

 

# 二維數據降維(二維降為一維只有1個特征值,2個特征向量
# 構建模型,分析主成分

from sklearn.decomposition import PCA  
# 加載主成分分析模塊PCA

pca = 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) #得到主成分A1的值;
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_)  # 輸出特征值 ;降了2個維度 ,所以它的特征值只顯178.9和163.6,貢獻率算的話這兩個肯定都屬於主成分。
# print(pca.components_)  # 輸出特征向量 ,64個特征向量  .shape是形狀  ; 2個維度要把其中的64個都給算出來
#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_)  # 輸出特征值 ;10個特征值
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,  # 方差一致,越小聚集越小,越大越分散;也可以分散地寫 [0.2,0.2,0.3,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)  #4個類別,這里寫它一共有多少個簇;
kmeans.fit(x)  #加載構建數據
y_kmeans = kmeans.predict(x) #生成聚類之后的一個類別值,分好類的數據標簽
centroids = kmeans.cluster_centers_  #生成4個類的中心點
# 構建模型,並預測出樣本的類別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

 


免責聲明!

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



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