163 lines
5.7 KiB
Python
163 lines
5.7 KiB
Python
#!/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⚠️ 部分測試失敗,請檢查代碼") |