)
Python实战用NumPy实现中智集隶属度函数的5种常见运算附代码在数据科学和机器学习领域模糊逻辑的应用越来越广泛。中智集作为模糊集理论的扩展能够更全面地描述现实世界中的不确定性。本文将带你用NumPy库实现中智集的五种核心运算从基础概念到代码实现让你快速掌握这一实用工具。1. 中智集基础与NumPy实现准备中智集(Neutrosophic Set)由Florentin Smarandache教授提出它扩展了传统模糊集和直觉模糊集的概念。一个中智数通常表示为三元组〈T, I, F〉其中T真隶属度(Truth-membership)I不确定度(Indeterminacy-membership)F假隶属度(Falsity-membership)在Python中我们可以用NumPy数组高效表示和操作中智集。首先确保你的环境已安装NumPyimport numpy as np定义单值中智数的数据结构class NeutrosophicNumber: def __init__(self, t, i, f): self.T t # 真隶属度 self.I i # 不确定度 self.F f # 假隶属度 def __repr__(self): return f〈{self.T}, {self.I}, {self.F}〉对于区间中智数我们可以使用NumPy的数组表示class IntervalNeutrosophicNumber: def __init__(self, t_range, i_range, f_range): self.T np.array(t_range) # 真隶属度区间 self.I np.array(i_range) # 不确定度区间 self.F np.array(f_range) # 假隶属度区间 def __repr__(self): return f〈[{self.T[0]}, {self.T[1]}], [{self.I[0]}, {self.I[1]}], [{self.F[0]}, {self.F[1]}]〉2. 单值中智集的基本运算实现2.1 加法运算中智集的加法运算定义为对应分量的最大值def neutrosophic_add(a, b): 单值中智数加法运算 new_T max(a.T, b.T) new_I min(a.I, b.I) new_F min(a.F, b.F) return NeutrosophicNumber(new_T, new_I, new_F)示例使用A NeutrosophicNumber(0.6, 0.2, 0.1) B NeutrosophicNumber(0.7, 0.1, 0.2) print(A B , neutrosophic_add(A, B)) # 输出: 〈0.7, 0.1, 0.1〉2.2 乘法运算乘法运算取对应分量的最小值def neutrosophic_multiply(a, b): 单值中智数乘法运算 new_T min(a.T, b.T) new_I max(a.I, b.I) new_F max(a.F, b.F) return NeutrosophicNumber(new_T, new_I, new_F)性能优化技巧对于大批量运算可以使用NumPy的向量化操作def batch_neutrosophic_multiply(numbers): 批量处理中智数乘法运算 t_values np.array([n.T for n in numbers]) i_values np.array([n.I for n in numbers]) f_values np.array([n.F for n in numbers]) result_T np.min(t_values) result_I np.max(i_values) result_F np.max(f_values) return NeutrosophicNumber(result_T, result_I, result_F)3. 区间中智集的运算实现区间中智集的运算需要考虑区间端点的各种组合情况。以下是区间加法的实现def interval_neutrosophic_add(a, b): 区间中智数加法运算 new_T_low max(a.T[0], b.T[0]) new_T_high max(a.T[1], b.T[1]) new_I_low min(a.I[0], b.I[0]) new_I_high min(a.I[1], b.I[1]) new_F_low min(a.F[0], b.F[0]) new_F_high min(a.F[1], b.F[1]) return IntervalNeutrosophicNumber( [new_T_low, new_T_high], [new_I_low, new_I_high], [new_F_low, new_F_high] )区间乘法运算def interval_neutrosophic_multiply(a, b): 区间中智数乘法运算 new_T_low min(a.T[0], b.T[0]) new_T_high min(a.T[1], b.T[1]) new_I_low max(a.I[0], b.I[0]) new_I_high max(a.I[1], b.I[1]) new_F_low max(a.F[0], b.F[0]) new_F_high max(a.F[1], b.F[1]) return IntervalNeutrosophicNumber( [new_T_low, new_T_high], [new_I_low, new_I_high], [new_F_low, new_F_high] )4. 中智集的加权平均运算加权平均是中智集决策分析中的核心运算。以下是单值中智加权平均的实现def neutrosophic_weighted_average(numbers, weights): 单值中智数加权平均运算 :param numbers: 中智数列表 :param weights: 权重列表(需归一化) :return: 加权平均结果 if len(numbers) ! len(weights): raise ValueError(中智数数量与权重数量不匹配) if not np.isclose(np.sum(weights), 1.0): raise ValueError(权重和不为1请先归一化) weighted_T sum(n.T * w for n, w in zip(numbers, weights)) weighted_I sum(n.I * w for n, w in zip(numbers, weights)) weighted_F sum(n.F * w for n, w in zip(numbers, weights)) return NeutrosophicNumber(weighted_T, weighted_I, weighted_F)对于区间中智集的加权平均运算更为复杂需要考虑区间运算def interval_neutrosophic_weighted_average(numbers, weights): 区间中智数加权平均运算 :param numbers: 区间中智数列表 :param weights: 权重列表(需归一化) :return: 加权平均结果 if len(numbers) ! len(weights): raise ValueError(中智数数量与权重数量不匹配) if not np.isclose(np.sum(weights), 1.0): raise ValueError(权重和不为1请先归一化) # 计算T的加权区间 t_low sum(n.T[0] * w for n, w in zip(numbers, weights)) t_high sum(n.T[1] * w for n, w in zip(numbers, weights)) # 计算I的加权区间 i_low sum(n.I[0] * w for n, w in zip(numbers, weights)) i_high sum(n.I[1] * w for n, w in zip(numbers, weights)) # 计算F的加权区间 f_low sum(n.F[0] * w for n, w in zip(numbers, weights)) f_high sum(n.F[1] * w for n, w in zip(numbers, weights)) return IntervalNeutrosophicNumber( [t_low, t_high], [i_low, i_high], [f_low, f_high] )5. 中智集运算的高级应用与优化5.1 批量运算的向量化实现对于大规模数据集使用循环效率较低。我们可以利用NumPy的向量化运算def vectorized_neutrosophic_add(numbers_list): 向量化实现中智数批量加法 :param numbers_list: 中智数的二维数组每行代表一个中智数集合 :return: 每行的加法结果 t_values np.array([[n.T for n in numbers] for numbers in numbers_list]) i_values np.array([[n.I for n in numbers] for numbers in numbers_list]) f_values np.array([[n.F for n in numbers] for numbers in numbers_list]) result_T np.max(t_values, axis1) result_I np.min(i_values, axis1) result_F np.min(f_values, axis1) return [NeutrosophicNumber(t, i, f) for t, i, f in zip(result_T, result_I, result_F)]5.2 中智集相似度计算相似度度量是中智集应用中的重要操作。以下是余弦相似度的实现def neutrosophic_cosine_similarity(a, b): 计算两个单值中智数的余弦相似度 dot_product a.T*b.T a.I*b.I a.F*b.F norm_a np.sqrt(a.T**2 a.I**2 a.F**2) norm_b np.sqrt(b.T**2 b.I**2 b.F**2) similarity dot_product / (norm_a * norm_b) return similarity对于区间中智集我们可以计算相似度的区间def interval_neutrosophic_cosine_similarity(a, b): 计算两个区间中智数的余弦相似度区间 # 计算可能的最小和最大点积 dot_min min(a.T[0]*b.T[0], a.T[0]*b.T[1], a.T[1]*b.T[0], a.T[1]*b.T[1]) \ min(a.I[0]*b.I[0], a.I[0]*b.I[1], a.I[1]*b.I[0], a.I[1]*b.I[1]) \ min(a.F[0]*b.F[0], a.F[0]*b.F[1], a.F[1]*b.F[0], a.F[1]*b.F[1]) dot_max max(a.T[0]*b.T[0], a.T[0]*b.T[1], a.T[1]*b.T[0], a.T[1]*b.T[1]) \ max(a.I[0]*b.I[0], a.I[0]*b.I[1], a.I[1]*b.I[0], a.I[1]*b.I[1]) \ max(a.F[0]*b.F[0], a.F[0]*b.F[1], a.F[1]*b.F[0], a.F[1]*b.F[1]) # 计算可能的范数组合 norm_a_min np.sqrt(min(a.T[0]**2, a.T[1]**2) min(a.I[0]**2, a.I[1]**2) min(a.F[0]**2, a.F[1]**2)) norm_a_max np.sqrt(max(a.T[0]**2, a.T[1]**2) max(a.I[0]**2, a.I[1]**2) max(a.F[0]**2, a.F[1]**2)) norm_b_min np.sqrt(min(b.T[0]**2, b.T[1]**2) min(b.I[0]**2, b.I[1]**2) min(b.F[0]**2, b.F[1]**2)) norm_b_max np.sqrt(max(b.T[0]**2, b.T[1]**2) max(b.I[0]**2, b.I[1]**2) max(b.F[0]**2, b.F[1]**2)) # 计算相似度的最小和最大值 sim_min dot_min / (norm_a_max * norm_b_max) sim_max dot_max / max(norm_a_min * norm_b_min, 1e-10) # 避免除以零 return np.clip(sim_min, 0, 1), np.clip(sim_max, 0, 1) # 确保结果在[0,1]区间5.3 中智集在决策分析中的应用中智集常用于多属性决策分析。以下是一个简单的决策函数实现def neutrosophic_decision_making(alternatives, criteria_weights): 基于中智集的多属性决策 :param alternatives: 各备选方案在各准则下的中智评价矩阵 :param criteria_weights: 各准则的权重 :return: 各备选方案的综合得分及排名 # 计算加权平均 weighted_scores [] for alt in alternatives: score neutrosophic_weighted_average(alt, criteria_weights) weighted_scores.append(score) # 计算得分函数 def score_function(n): return (n.T 1 - n.I 1 - n.F) / 3 scores [score_function(n) for n in weighted_scores] # 排名 ranked_indices np.argsort(scores)[::-1] # 从高到低排序 return scores, ranked_indices在实际项目中我发现中智集运算的性能瓶颈通常出现在大规模区间运算上。通过预计算可能的区间组合并使用NumPy的广播机制可以显著提升计算效率。