聚類分析代碼總結


代碼

1.自創數據集進行聚類

import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import calinski_harabaz_score


# 創建數據集
# X為樣本特征,Y為樣本簇類別, 共1000個樣本,每個樣本4個特征,共4個簇,
# 簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分別為[0.4, 0.2, 0.2, 0.2]
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
                  cluster_std=[0.4, 0.2, 0.2, 0.2],
                  random_state=9)

# 數據集可視化
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()

y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(X)
# 分別嘗試n_cluses=2\3\4,然后查看聚類效果
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

# 用Calinski-Harabasz Index評估的聚類分數
print(calinski_harabaz_score(X, y_pred))

  1. 相關系數
  • 皮爾遜相關系數
from scipy.stats import pearsonr


x1 = [12.5, 15.3, 23.2, 26.4, 33.5, 34.4, 39.4, 45.2, 55.4, 60.9]
x2 = [21.2, 23.9, 32.9, 34.1, 42.5, 43.2, 49.0, 52.8, 59.4, 63.5]

print(pearsonr(x1, x2))
  • 斯皮爾曼相關系數
from scipy.stats import spearmanr


x1 = [12.5, 15.3, 23.2, 26.4, 33.5, 34.4, 39.4, 45.2, 55.4, 60.9]
x2 = [21.2, 23.9, 32.9, 34.1, 42.5, 43.2, 49.0, 52.8, 59.4, 63.5]

print(spearmanr(x1, x2))
  1. PCA代碼
from sklearn.decomposition import PCA


def pca_demo():
    """
    對數據進行PCA降維
    :return: None
    """
    data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]

    # 1、實例化PCA, 小數-保留多少信息
    transfer = PCA(n_components=0.9)
    # 2、調用fit_transform
    data1 = transfer.fit_transform(data)

    print("保留90%的信息,降維結果為:\n", data1)

    # 1、實例化PCA, 整數——指定降維到的維數
    transfer2 = PCA(n_components=3)
    # 2、調用fit_transform
    data2 = transfer2.fit_transform(data)
    print("降維到3維的結果:\n", data2)

    return None


if __name__ == '__main__':
    pca_demo()

  1. example-探究用戶對物品類別的喜好細分降維
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score


# 1.獲取數據
order_product = pd.read_csv("./data/instacart/order_products__prior.csv")
products = pd.read_csv("./data/instacart/products.csv")
orders = pd.read_csv("./data/instacart/orders.csv")
aisles = pd.read_csv("./data/instacart/aisles.csv")

# 2 數據基本處理
table1 = pd.merge(order_product, products, on=["product_id", "product_id"])
table2 = pd.merge(table1, orders, on=["order_id", "order_id"])
table = pd.merge(table2, aisles, on=["aisle_id", "aisle_id"])

table = pd.crosstab(table["user_id"], table["aisle"])

table = table[:1000]

# 3.特征工程
transfer = PCA(n_components=0.9)
data = transfer.fit_transform(table)

# 實例化K-means
estimator = KMeans(n_clusters=8, random_state=22)
y_predict = estimator.fit_predict(data)

# 模型評估
print(silhouette_score(data, y_predict))
相關數據集聯系郵箱yawei_sia@yeah.net獲取

特殊知識點

  • K-means聚類步驟

    • 隨機設置K個特征空間內的點作為初始的聚類中心
    • 2、對於其他每個點計算到K個中心的距離,未知的點選擇最近的一個聚類中心點作為標記類別
    • 3、接着對着標記的聚類中心之后,重新計算出每個聚類的新中心點(平均值)
    • 4、如果計算得出的新中心點與原中心點一樣(質心不再移動),那么結束,否則重新進行第二步過程
  • “肘”方法 (Elbow method) — K值確定

    1. 對於n個點的數據集,迭代計算k from 1 to n,每次聚類完成后計算每個點到其所屬的簇中心的距離的平方和;

    2. 平方和是會逐漸變小的,直到k==n時平方和為0,因為每個點都是它所在的簇中心本身。

    3. 在這個平方和變化過程中,會出現一個拐點也即“肘”點,下降率突然變緩時即認為是最佳的k值

      • 在決定什么時候停止訓練時,肘形判據同樣有效,數據通常有更多的噪音,在增加分類無法帶來更多回報時,我們停止增加類別。
  • k-means算法小結

    • 優點:
      1.原理簡單(靠近中心點),實現容易
      2.聚類效果中上(依賴K的選擇)
      3.空間復雜度o(\(N\)),時間復雜度o(\(IKN\)) (\(N\)為樣本點個數,\(K\)為中心點個數,\(I\)為迭代次數).
    • 缺點:
      1.對離群點,噪聲敏感 (中心點易偏移)
      2.很難發現大小差別很大的簇及進行增量計算
      3.結果不一定是全局最優,只能保證局部最優(與K的個數及初值選取有關)
  • 優化算法總結

優化方法 思路
Canopy+kmeans Canopy粗聚類配合kmeans
kmeans++ 距離越遠越容易成為新的質心
二分k-means 拆除SSE最大的簇
k-medoids 和kmeans選取中心點的方式不同
kernel kmeans 映射到高維空間
ISODATA 動態聚類
Mini-batch K-Means 大數據集分批聚類

有關數據文件,請聯系郵箱:yqwei_sia@yeah.net


免責聲明!

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



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