Files
Stomach_Cancer_Pytorch/test_fuzzy_clustering.py

163 lines
5.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
測試 Fuzzy C-means 聚類功能
"""
import os
import sys
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# 添加當前目錄到 Python 路徑
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
# 導入我們的函數
from Density_Peak_Algorithm import (
compute_decision_graph,
fuzzy_c_means,
determine_optimal_clusters,
extract_superpixel_features
)
def test_fuzzy_clustering():
"""
測試 Fuzzy C-means 聚類功能
"""
print("🧪 開始測試 Fuzzy C-means 聚類功能...")
# 測試圖像路徑
test_image_path = "example_images/sample_image_1.png"
if not os.path.exists(test_image_path):
print(f"❌ 測試圖像不存在: {test_image_path}")
return False
# 創建測試輸出目錄
test_output_dir = "test_clustering_output"
os.makedirs(test_output_dir, exist_ok=True)
try:
print(f"📸 測試圖像: {test_image_path}")
# 執行完整的密度峰值分析 + Fuzzy C-means 聚類
result = compute_decision_graph(
test_image_path,
test_output_dir,
use_superpixels=True,
save_regions=True,
max_regions=30 # 限制區域數量以加快測試
)
print(f"\n✅ 測試成功完成!")
print(f"📊 結果摘要:")
print(f" - 超像素數量: {result['n_superpixels']}")
print(f" - 最佳聚類數: {result['optimal_clusters']}")
print(f" - 聚類迭代次數: {result['clustering_iterations']}")
print(f" - 目標函數值: {result['clustering_objective']:.4f}")
print(f" - 壓縮比例: {result['compression_ratio']:.6f}")
# 驗證結果的完整性
required_keys = [
'rho', 'delta', 'gamma', 'n', 'segments', 'superpixel_features',
'optimal_clusters', 'cluster_centers', 'membership_matrix',
'cluster_labels', 'cluster_stats'
]
missing_keys = [key for key in required_keys if key not in result]
if missing_keys:
print(f"⚠️ 警告: 缺少以下結果鍵: {missing_keys}")
else:
print(f"✅ 所有必要的結果鍵都存在")
# 驗證聚類結果的合理性
n_clusters = result['optimal_clusters']
cluster_labels = result['cluster_labels']
membership_matrix = result['membership_matrix']
# 檢查聚類標籤範圍
unique_labels = np.unique(cluster_labels)
if len(unique_labels) == n_clusters and np.min(unique_labels) >= 0 and np.max(unique_labels) < n_clusters:
print(f"✅ 聚類標籤範圍正確: {len(unique_labels)} 個聚類")
else:
print(f"⚠️ 聚類標籤範圍異常: 期望 {n_clusters} 個聚類,實際 {len(unique_labels)}")
# 檢查隸屬度矩陣
membership_sums = np.sum(membership_matrix, axis=1)
if np.allclose(membership_sums, 1.0, atol=1e-6):
print(f"✅ 隸屬度矩陣正確: 每行和為 1")
else:
print(f"⚠️ 隸屬度矩陣異常: 行和範圍 [{np.min(membership_sums):.6f}, {np.max(membership_sums):.6f}]")
print(f"\n📁 測試結果保存在: {test_output_dir}")
return True
except Exception as e:
print(f"❌ 測試失敗: {e}")
import traceback
traceback.print_exc()
return False
def test_individual_functions():
"""
測試個別函數
"""
print(f"\n🔬 測試個別函數...")
# 創建測試數據
np.random.seed(42)
test_data = np.random.rand(50, 5) # 50個樣本5個特徵
try:
# 測試 fuzzy_c_means 函數
print(f"🧪 測試 fuzzy_c_means 函數...")
centers, membership, labels, objective, n_iter = fuzzy_c_means(
test_data, n_clusters=3, m=2.0, max_iter=50, random_state=42
)
print(f" - 聚類中心形狀: {centers.shape}")
print(f" - 隸屬度矩陣形狀: {membership.shape}")
print(f" - 標籤形狀: {labels.shape}")
print(f" - 目標函數值: {objective:.4f}")
print(f" - 迭代次數: {n_iter}")
# 測試 determine_optimal_clusters 函數
print(f"🧪 測試 determine_optimal_clusters 函數...")
gamma_values = np.random.exponential(2, 50) # 模擬 gamma 值
optimal_k, scores = determine_optimal_clusters(
test_data, gamma_values, max_clusters=6, min_clusters=2
)
print(f" - 最佳聚類數: {optimal_k}")
print(f" - 測試的聚類數: {list(scores.keys())}")
print(f"✅ 個別函數測試成功!")
return True
except Exception as e:
print(f"❌ 個別函數測試失敗: {e}")
import traceback
traceback.print_exc()
return False
if __name__ == "__main__":
print("🚀 開始 Fuzzy C-means 聚類功能測試")
print("="*60)
# 測試個別函數
individual_test_success = test_individual_functions()
print("\n" + "="*60)
# 測試完整流程
full_test_success = test_fuzzy_clustering()
print("\n" + "="*60)
print("📋 測試結果摘要:")
print(f" - 個別函數測試: {'✅ 通過' if individual_test_success else '❌ 失敗'}")
print(f" - 完整流程測試: {'✅ 通過' if full_test_success else '❌ 失敗'}")
if individual_test_success and full_test_success:
print(f"\n🎉 所有測試通過! Fuzzy C-means 聚類功能正常工作")
else:
print(f"\n⚠️ 部分測試失敗,請檢查代碼")