我的gtda版本为0.6.2,然后豆包给我的一个实验代码是:报错为TypeError: Projection.__init__() got an unexpected keyword argument 'func'import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.decomposition import PCA
from sklearn.datasets import make_circles, make_swiss_roll
from gtda.mapper import (
Projection,
CubicalCover,
make_mapper_pipeline,
plot_static_mapper_graph,
plot_interactive_mapper_graph
)
import networkx as nx
# 确保中文显示正常
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
class MapperWithGiotto:
def __init__(self, filter_func, n_intervals=10, overlap_frac=0.3,
clusterer=DBSCAN(eps=0.3, min_samples=5)):
"""
基于giotto-tda 0.6.2的Mapper算法实现
参数:
filter_func: 透镜函数(输入高维数据X,输出低维投影F)
n_intervals: 区间数量
overlap_frac: 区间重叠比例(0-1)
clusterer: 聚类器(默认DBSCAN)
"""
self.filter_func = filter_func
self.n_intervals = n_intervals
self.overlap_frac = overlap_frac
self.clusterer = clusterer
self.pipeline = self._build_pipeline() # 构建流水线
self.graph = None # 存储拓扑图
self.X = None # 存储输入数据
def _build_pipeline(self):
"""构建Mapper流水线(适配0.6.2版本)"""
# 1. 透镜函数(Projection类在0.6.2中用func参数指定投影函数)
projection = Projection(func=self.filter_func)
# 2. 区间覆盖(立方覆盖)
cover = CubicalCover(n_intervals=self.n_intervals, overlap_frac=self.overlap_frac)
# 3. 构建完整流水线
pipeline = make_mapper_pipeline(
projection=projection,
cover=cover,
clusterer=self.clusterer,
verbose=False # 关闭详细输出
)
return pipeline
def fit(self, X):
"""拟合数据并生成拓扑图"""
self.X = X
self.graph = self.pipeline.fit_transform(X)
return self.graph
def plot_static(self, title="Mapper静态可视化"):
"""静态可视化(基于matplotlib)"""
if self.graph is None or self.X is None:
raise ValueError("请先调用fit()方法拟合数据")
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
# 原始数据可视化(2D)
if self.X.shape[1] > 2:
X_vis = PCA(n_components=2).fit_transform(self.X)
else:
X_vis = self.X
ax1.scatter(X_vis[:, 0], X_vis[:, 1], c="steelblue", s=20, alpha=0.7)
ax1.set_title("原始数据(2D可视化)")
ax1.set_xlabel("维度1")
ax1.set_ylabel("维度2")
# Mapper拓扑图(静态)
plot_static_mapper_graph(
self.graph,
ax=ax2, # 指定子图轴
layout="spring",
node_size=30,
node_color="coral",
edge_color="gray",
title="Mapper拓扑图"
)
plt.suptitle(title, fontsize=14)
plt.tight_layout(rect=[0, 0, 1, 0.96]) # 预留suptitle空间
plt.show()
def plot_interactive(self, title="Mapper交互式可视化"):
"""交互式可视化(基于plotly,0.6.2版本兼容)"""
if self.graph is None or self.X is None:
raise ValueError("请先调用fit()方法拟合数据")
# 生成交互式图
fig = plot_interactive_mapper_graph(
self.graph,
X=self.X,
layout="spring",
node_size=30,
node_color="coral",
edge_color="gray",
title=title
)
fig.show()
# 定义常用透镜函数(适配0.6.2版本的输入输出要求)
def lens_pca_1d(X):
"""PCA第一主成分作为1D透镜"""
return PCA(n_components=1).fit_transform(X)
def lens_feature_0(X):
"""使用数据的第0个特征作为透镜"""
return X[:, [0]] # 保持二维结构(n_samples, 1)
def lens_mean(X):
"""样本各特征的均值作为透镜"""
return np.mean(X, axis=1).reshape(-1, 1) # 确保输出为(n_samples, 1)
# 测试代码(使用环形数据验证)
if __name__ == "__main__":
# 生成带噪声的环形数据(典型拓扑结构:含孔洞)
X, y = make_circles(n_samples=800, noise=0.12, factor=0.4, random_state=42)
# 初始化Mapper算法(使用PCA透镜)
mapper = MapperWithGiotto(
filter_func=lens_pca_1d, # 透镜函数
n_intervals=12, # 区间数量
overlap_frac=0.35, # 重叠比例
clusterer=DBSCAN(eps=0.25, min_samples=6) # 聚类参数
)
# 拟合数据
mapper.fit(X)
# 静态可视化(必选,matplotlib基础支持)
mapper.plot_static(title="环形数据的Mapper分析(giotto-tda 0.6.2)")
# 交互式可视化(可选,需plotly支持,若报错可注释)
# mapper.plot_interactive(title="环形数据的交互式Mapper分析")
最新发布