day 27 打卡

# 绘制评估指标图,增加点论文中的工作量
plt.figure(figsize=(15, 10))
#轮廓系数图
plt.subplot(2, 2, 1)
for min_samples in min_samples_range:
    subset=results_df[results_df['min_samples']==min_samples]
    plt.plot(subset['eps'],subset['ch_score'],marker='o',label=f'min_samples={min_samples}')
plt.legend()
plt.title('轮廓系数图')
plt.xlabel('eps')
plt.ylabel('轮廓系数')
plt.legend()
plt.grid(True)


#CH指数图
plt.subplot(2, 2, 2)
for min_samples in min_samples_range:
    subset=results_df[results_df['min_samples']==min_samples]
    plt.plot(subset['eps'],subset['n_clusters'],label=f'min_samples={min_samples}')
plt.legend()
plt.title('CH指数图')
plt.xlabel('eps')
plt.ylabel('CH指数')
plt.legend()
plt.grid(True)


# db指数图
plt.subplot(2,2,3)
for min_samples in min_samples_range:
    subset=results_df[results_df['min_samples']==min_samples]
    plt.plot(subset['eps'],subset['db_score'],label=f'min_samples={min_samples}')
plt.legend()
plt.title('db指数图')
plt.xlabel('eps')
plt.ylabel('db指数')
plt.legend()
plt.grid(True)


#簇数图
plt.subplot(2,2,4)
for min_samples in min_samples_range:
    subset=results_df[results_df['min_samples']==min_samples]
    plt.plot(subset['eps'],subset['n_clusters'],label=f'min_samples={min_samples}')
plt.legend()
plt.title('簇数图')
plt.xlabel('eps')
plt.ylabel('簇数')
plt.legend()
plt.grid(True)

plt.tight_layout()
plt.show()
# 选择 eps 和min_samples 值
selected_eps=0.6
selected_min_samples=6
#使用选择的参数进行DBSCAN聚类
dbscan=DBSCAN(eps=selected_eps,min_samples=selected_min_samples)
dbscan_labels=dbscan.fit_predict(X_scaled)
X['DBSCAN_Cluster']=dbscan_labels
# 使用pca 降维到 2d 进行可视化
pca=PCA(n_components=2)
X_pca=pca.fit_transform(X_scaled)
# DBSCAN 聚类结果可视化
plt.figure(figsize=(6, 5))
sns.scatterplot(x=X_pca[:, 0], y=X_pca[:, 1], hue=dbscan_labels, palette='viridis')
plt.title(f'DBSCAN Clustering with eps={selected_eps}, min_samples={selected_min_samples} (PCA Visualization)')
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')
plt.show()
# 打印DBscan 聚类结果
print(f'DBSCAN Cluster labels (eps={selected_eps}, min_samples={selected_min_samples}) added to X:')
print(X[['DBSCAN_Cluster']].value_counts()) 
层次聚类
agglomerative clustering 是一种自底向上的层次聚类方法,初始时每个样本时一个簇,然后逐步合并最相似的簇。直到达到指定的簇数量或者满足停止条件。由于它需要指定簇数量(类似于KMeans)我将通过测试不同的簇数量n_clusters 来评估聚类效果,并使用轮廓系数,ch指数,和 db 指数作为评估指标。
import  numpy as np 
import pandas as pd
from sklearn.cluster import AgglomerativeClustering
from sklearn.preprocessing import StandardScaler 
from  sklearn.decomposition import PCA
from  sklearn.metrics import silhouette_score,calinski_harabasz_score,davies_bouldin_score
import matplotlib.pyplot as plt
import seaborn as  sns 
# 标准化
sclearn=StandardScaler()
X_scaled=sclearn.fit_transform(X)
# 评估不同的n_clusters
n_clusters_range=range(2,11)
silhouette_scores=[]
ch_scores=[]
db_scores=[]
for  n_clusters in n_clusters_range:
    agglo=AgglomerativeClustering(n_clusters=n_clusters,linkage='ward')  
    agglo_labels=agglo.fit_predict(X_scaled)

    # 计算评估指标
    silhouette_scores.append(silhouette_score(X_scaled,agglo_labels))
    ch_scores.append(calinski_harabasz_score(X_scaled,agglo_labels))
    db_scores.append(davies_bouldin_score(X_scaled,agglo_labels))
    si=silhouette_score(X_scaled,agglo_labels)
    ch=calinski_harabasz_score(X_scaled,agglo_labels)
    db=davies_bouldin_score(X_scaled,agglo_labels)
    print(f'聚类数为{n_clusters}时,轮廓系数为{si:.4f},CH指数为{ch:.4f},DB指数为{db:.4f}')

# 绘制评估指标图
plt.figure(figsize=(15, 5))
# 轮廓系数图
plt.subplot(1, 3, 1)
plt.plot(n_clusters_range, silhouette_scores, marker='o')
plt.title('轮廓系数图')
plt.xlabel('聚类数')
plt.ylabel('轮廓系数')
plt.grid(True)


# ch 指数图
plt.subplot(1,3,2)
plt.plot(n_clusters_range,ch_scores,marker='o')
plt.title('CH指数图')
plt.xlabel('聚类数')
plt.ylabel('CH指数')
plt.grid(True)

# db 指数图
plt.subplot(1,3,3)
plt.plot(n_clusters_range,db_scores,marker='o')
plt.title('DB指数图')
plt.xlabel('聚类数')
plt.ylabel('DB指数')
plt.grid(True)


plt.tight_layout()
plt.show()
# 提示用户选择n_clusters 值
select_n_clusters=10
# 使用选择的簇数进行agglomerative clustering
agglo=AgglomerativeClustering(n_clusters=select_n_clusters,linkage='ward')
agglo_labels=agglo.fit_predict(X_scaled)
X['Agglo_Cluster']=agglo_labels

# 使用pca 降维到2d 进行可视化
pca=PCA(n_components=2)
X_pca=pca.fit_transform(X_scaled)
# agglomerative clustering 可视化
plt.figure(figsize=(6, 5))
sns.scatterplot(x=X_pca[:, 0], y=X_pca[:, 1], hue=agglo_labels, palette='viridis')
plt.title(f'Agglomerative Clustering with n_clusters={select_n_clusters} (PCA Visualization)')
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')
plt.show()
# 打印agglomerative clustering 聚类结果
print(f"Agglomerative Clustering with n_clusters={select_n_clusters} (PCA Visualization)")
print(X[['Agglo_Cluster']].value_counts())
# 层次聚类的树状图可视化
from scipy.cluster import hierarchy
import matplotlib.pyplot as plt
# 假设x_scaled 是标准化后的特征矩阵
# 计算层次聚类的链接矩阵
Z=hierarchy.linkage(X_scaled,method='ward')
plt.figure(figsize=(10, 6))
hierarchy.dendrogram(Z,truncate_mode='level',p=3)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample Index')
plt.ylabel('Distance')
plt.show()

@浙大疏锦行

你可能感兴趣的:(AI学习笔记,python,人工智能,数据分析)