基于熵权法的TOPSIS模型:Python实现多指标客观评价

发布时间:2026/8/17 5:04:37
基于熵权法的TOPSIS模型:Python实现多指标客观评价 1. 项目概述当TOPSIS遇上熵权法在数学建模尤其是多指标综合评价的赛题里TOPSISTechnique for Order Preference by Similarity to Ideal Solution逼近理想解排序法绝对是个高频出现的“老朋友”。它的逻辑直观又优美先找出所有方案中的“最好方案”正理想解和“最差方案”负理想解然后计算每个待评价方案与这两个“标杆”的距离最后根据相对接近度来排序。谁离“好榜样”越近离“坏典型”越远谁的综合评价就越高。这个模型上手快结果也容易解释所以在各类评价类问题中广受欢迎。但用多了你就会发现TOPSIS有个绕不开的“阿喀琉斯之踵”——权重。模型本身只负责计算距离和排序但各个评价指标谁更重要权重需要我们从外部输入。常见的做法有主观赋权法比如专家打分、层次分析法AHP和客观赋权法。主观赋权依赖人的经验虽然能体现决策者意图但在数学建模这种追求客观、可复现的竞赛环境下容易引入主观偏见说服力有时会打折扣。这时候客观赋权法就成了更受青睐的选择而其中熵权法因其坚实的数学基础和完全的数据驱动特性成为了与TOPSIS搭档的“黄金组合”。所以“基于熵权法对TOPSIS模型的修正”这个项目其核心价值就在于实现评价过程的完全客观化与自动化。我们不再需要人为地给指标设定权重而是让数据自己“说话”通过计算每个指标数据所蕴含的信息熵来反推其重要性。信息量越混乱、越不确定的指标其熵值越大在区分方案时起到的作用反而越小因此赋予的权重就越低反之数据越有序、差异性越明显的指标其熵值越小权重就越高。这种基于数据本身离散程度的赋权方式最大程度地剥离了主观判断使得整个评价体系更加公正、稳健特别适合处理那些指标繁多、且缺乏先验权重信息的复杂决策问题。接下来我将以一个实际的数学建模场景为例带你从零开始一步步拆解如何用Python实现“熵权法修正的TOPSIS模型”。我们会深入每个公式的背后逻辑关注代码实现中的每一个细节和坑点并分享我在多次实战中积累下来的调试心得和避坑指南。无论你是正在备战数模竞赛的学生还是需要对多种方案进行客观评估的分析师这篇内容都能为你提供一套清晰、可靠、可直接复现的解决方案。2. 核心原理与模型架构拆解在动手写代码之前我们必须把“熵权法TOPSIS”这个组合拳的底层逻辑吃透。这不仅仅是两个模型的简单拼接而是一个从数据标准化、客观赋权到最终排序的完整决策链条。理解了这个链条你才能明白每一步计算的意义以及在代码中该如何正确地实现它。2.1 TOPSIS模型的基本思想与局限性TOPSIS的核心是“距离”。假设我们有m个待评价方案每个方案有n个评价指标这样就构成了一个m行n列的决策矩阵。模型的目标是找到那个“综合最好”的方案。它的计算步骤可以概括为构造规范化决策矩阵消除不同指标量纲和数量级的影响。确定加权规范化矩阵为每个指标赋予权重这是关键一步也是传统TOPSIS的软肋所在。确定正理想解与负理想解正理想解由每个指标的最优值效益型取最大成本型取最小构成负理想解则由每个指标的最劣值构成。计算各方案到正、负理想解的距离通常使用欧氏距离。计算相对贴近度方案与正理想解的距离越小与负理想解的距离越大则贴近度越高方案越优。传统TOPSIS的局限性恰恰隐藏在第二步。如果权重赋值不合理比如把一个实际区分度不大的指标赋予了过高的权重那么整个排序结果就可能被这个指标“带偏”导致评价失真。在缺乏可靠先验知识的情况下如何科学地确定这组权重就成了一个必须解决的问题。2.2 熵权法的数学原理与赋权逻辑熵权法是一种完全基于数据本身的客观赋权方法。它来源于信息论信息熵是衡量系统混乱度或不确定性的指标。在评价体系中我们可以这样理解对于一个特定的评价指标如果所有方案在该指标上的数值都差不多差异很小那么这个指标在帮助我们区分方案优劣时提供的信息量就很少它的作用权重就应该小。反之如果各方案在该指标上的数值差异悬殊那么这个指标在区分方案时就显得非常重要应该赋予较大的权重。熵权法的计算过程就是将这种直观感受数学化数据标准化与TOPSIS第一步类似但这里通常采用比重法每个数值占该列总和的比例将数据归一化到[0,1]区间且和为1。计算信息熵对于第j个指标其信息熵Ej的计算公式为Ej -k * sum(p_ij * ln(p_ij))其中p_ij是标准化后的值k为常数1/ln(m)保证熵值在[0,1]之间。计算差异系数dj 1 - Ej。熵值Ej越大说明数据越混乱、不确定性越高该指标区分能力越弱因此差异系数dj就越小。确定权重将每个指标的差异系数进行归一化即得到权重Wj dj / sum(dj)。差异系数越大即熵值越小的指标最终获得的权重就越大。注意这里有一个非常重要的细节。当某个指标下所有方案的数据完全相同时标准化后的p_ij会完全相等此时计算ln(p_ij)会遇到ln(0)的问题因为p_ij * ln(p_ij)在p_ij趋近于0时极限为0但计算机直接计算会得到nan。更严重的是此时信息熵达到最大值1差异系数为0权重也会变成0。这在理论上合理无区分度则无权重但在实际应用中如果一个重要指标因数据收集问题恰好相同导致权重为0可能会影响模型稳定性。因此代码实现时必须考虑这个边界情况通常会给p_ij一个极小的偏移量或者对完全相同的列进行特殊处理。2.3 模型融合的整体工作流将两者结合后整个模型的工作流就清晰了输入原始决策矩阵m个方案 × n个指标以及每个指标的类型效益型/成本型。流程数据预处理对原始矩阵进行标准化为熵权法和TOPSIS计算做准备。注意两者所需的标准化方式可能不同需要分别处理。熵权法计算权重使用预处理后的数据比重法标准化计算每个指标的信息熵、差异系数最终得到客观权重向量W [w1, w2, ..., wn]。TOPSIS综合评价 a. 使用另一种标准化方法如向量规范化处理原始数据得到规范化矩阵。 b. 将权重向量W与规范化矩阵相乘得到加权规范化矩阵。 c. 根据指标类型确定正、负理想解。 d. 计算各方案到正、负理想解的欧氏距离。 e. 计算相对贴近度并据此排序。输出每个方案的相对贴近度得分0到1之间及排名得分越高方案越优。这个工作流实现了从原始数据到评价结果的端到端自动化核心优势在于权重确定的客观性。下面我们就进入具体的代码实现环节。3. Python代码实现与核心模块解析我们将把整个模型封装成一个Python类EntropyWeightTOPSIS这样结构清晰也便于复用。我会逐块解释代码并穿插在实战中积累的重要注意事项。3.1 环境准备与数据预处理首先确保你的Python环境安装了必要的科学计算库numpy和pandas。numpy负责底层数值计算pandas便于数据读取和操作。import numpy as np import pandas as pd class EntropyWeightTOPSIS: def __init__(self, data, indices_type, k1.0): 初始化熵权法TOPSIS模型。 参数 data : numpy.ndarray 或 pandas.DataFrame 决策矩阵m行n列m为方案数n为指标数。 indices_type : list of str 指标类型列表长度为n。benefit 表示效益型越大越好cost 表示成本型越小越好。 k : float, optional 距离计算中的调节系数默认为1欧氏距离。有时为了突出较大值的影响会取2。 # 将输入数据转换为numpy数组确保后续计算统一 if isinstance(data, pd.DataFrame): self.raw_data data.values self.scheme_names data.index.tolist() # 保留方案名称 self.index_names data.columns.tolist() # 保留指标名称 else: self.raw_data np.array(data) self.scheme_names [f方案{i1} for i in range(data.shape[0])] self.index_names [f指标{j1} for j in range(data.shape[1])] self.m, self.n self.raw_data.shape # m:方案数 n:指标数 self.indices_type indices_type self.k k # 校验输入 if len(self.indices_type) ! self.n: raise ValueError(f指标类型列表长度({len(self.indices_type)})必须与指标数({self.n})一致) if not all(t in [benefit, cost] for t in self.indices_type): raise ValueError(指标类型必须为 benefit 或 cost) # 初始化结果存储 self.entropy_weights None self.normalized_matrix None self.weighted_matrix None self.ideal_best None self.ideal_worst None self.dist_to_best None self.dist_to_worst None self.relative_closeness None self.ranking None实操心得1数据输入的灵活性。这里我们同时支持numpy数组和pandas的DataFrame。如果是DataFrame我们会自动提取行名方案名和列名指标名这样最终输出结果可读性会强很多。这是一个提升代码友好度的小技巧。数据预处理的第一步是标准化。但请注意熵权法和TOPSIS的标准化步骤是独立的目的不同方法也不同。def _normalize_for_entropy(self, matrix): 为熵权法进行数据标准化比重法。 将每一列的数据转化为其在该列总和中的比重确保所有值非负且和为1。 处理可能存在的零值避免计算ln(0)。 # 检查是否有非正值比重法要求数据为正。对于包含零或负值的列需要进行非负化平移。 # 常见的处理方法是对于第j列Xij Xij - min(Xj) 1 (或加一个极小的正数) col_min matrix.min(axis0) # 如果某列最小值小于等于0则进行平移 if (col_min 0).any(): matrix_translated matrix - col_min 1e-10 # 平移并加一个极小值 else: matrix_translated matrix # 计算比重每个元素除以该列所有元素之和 col_sum matrix_translated.sum(axis0) # 防止除零错误理论上平移后不会为零但代码要健壮 col_sum[col_sum 0] 1e-10 p_matrix matrix_translated / col_sum return p_matrix def _normalize_for_topsis(self, matrix): 为TOPSIS进行数据标准化向量规范化。 也称为欧几里得范数归一化每个元素除以该列所有元素平方和的平方根。 这种方法能同时消除量纲和数量级影响且保序性较好。 # 计算每一列的欧几里得范数平方和的平方根 norm np.sqrt(np.sum(matrix ** 2, axis0)) # 防止除零错误 norm[norm 0] 1e-10 normalized matrix / norm return normalized实操心得2标准化方法的选择与陷阱。很多初学者会混淆这两种标准化。熵权法的比重法标准化是为了计算概率分布要求数据非负且和为1因此需要对可能的零/负值进行平移。而TOPSIS的向量规范化是为了几何上的距离计算不要求数据和为1。绝对不能用一个标准化矩阵同时用于熵权法和TOPSIS这是常见的错误源头。3.2 熵权法权重的计算实现这是模型客观性的核心。我们将严格遵循2.2节中的数学步骤。def calculate_entropy_weights(self): 计算基于熵权法的指标权重。 步骤1. 数据预处理比重法 2. 计算信息熵 3. 计算差异系数 4. 归一化得权重 # 1. 为熵权法标准化数据 p_matrix self._normalize_for_entropy(self.raw_data) # 2. 计算信息熵 # 避免p_ij为0导致ln(0)的计算错误使用np.log函数并处理边界 # 当p_ij为0时根据极限p_ij * ln(p_ij) 应为0。我们可以用np.where进行条件判断 # 更稳健的做法是给p_matrix一个极小的偏移量确保所有值略大于0 p_matrix_safe np.where(p_matrix 0, 1e-10, p_matrix) # 计算常数k 1 / ln(m) k 1 / np.log(self.m) # 计算每列的信息熵: Ej -k * sum(p_ij * ln(p_ij)) # 注意对每列axis0进行求和 entropy_vec -k * np.sum(p_matrix_safe * np.log(p_matrix_safe), axis0) # 3. 计算差异系数 diff_coefficient 1 - entropy_vec # 4. 归一化得到权重 # 处理极端情况如果所有指标的差异系数都为0理论上不可能但需防错 if np.sum(diff_coefficient) 0: # 如果所有指标熵值都为1数据完全无差异则平均赋权 self.entropy_weights np.ones(self.n) / self.n print(警告所有指标的差异系数均为0采用平均权重。) else: self.entropy_weights diff_coefficient / np.sum(diff_coefficient) # 将权重结果封装为DataFrame便于查看 weight_df pd.DataFrame({ 指标: self.index_names, 信息熵: entropy_vec, 差异系数: diff_coefficient, 权重: self.entropy_weights }) return weight_df注意事项1熵值计算的数值稳定性。p_ij * ln(p_ij)在p_ij趋近于0时极限是0但计算机直接计算0 * ln(0)会得到nan。上述代码中我们使用np.where(p_matrix 0, 1e-10, p_matrix)来确保所有p_ij都是一个极小的正数从而安全地计算对数。这是一种常用且有效的数值稳定技巧。注意事项2权重为零的情况。如前所述如果一个指标下所有数据完全相同其差异系数将为0权重也为0。在有些评价体系中这可能不合理。你可以根据业务逻辑设定一个最小权重阈值如0.01或者采用“熵权法主观法”的混合赋权来规避。在本模型的纯客观框架下我们保留了这种可能性并给出了警告。3.3 TOPSIS综合评价的完整流程拿到客观权重后我们就可以进行TOPSIS计算了。def evaluate(self): 执行完整的熵权法-TOPSIS评价流程。 # Step 1: 计算熵权法权重如果尚未计算 if self.entropy_weights is None: self.calculate_entropy_weights() # Step 2: 为TOPSIS标准化原始数据 self.normalized_matrix self._normalize_for_topsis(self.raw_data) # Step 3: 构建加权规范化决策矩阵 self.weighted_matrix self.normalized_matrix * self.entropy_weights # numpy广播机制 # Step 4: 确定正、负理想解 # 初始化两个理想解向量 self.ideal_best np.zeros(self.n) self.ideal_worst np.zeros(self.n) for j in range(self.n): col_j self.weighted_matrix[:, j] if self.indices_type[j] benefit: # 效益型取最大值作为正理想解最小值作为负理想解 self.ideal_best[j] np.max(col_j) self.ideal_worst[j] np.min(col_j) else: # cost # 成本型取最小值作为正理想解最大值作为负理想解 self.ideal_best[j] np.min(col_j) self.ideal_worst[j] np.max(col_j) # Step 5: 计算各方案到理想解的距离 # 使用欧氏距离距离公式中的指数k2。这里我们的self.k参数可用于广义距离默认为2欧氏距离。 # 计算到正理想解的距离 self.dist_to_best np.power(np.sum(np.power(np.abs(self.weighted_matrix - self.ideal_best), self.k), axis1), 1/self.k) # 计算到负理想解的距离 self.dist_to_worst np.power(np.sum(np.power(np.abs(self.weighted_matrix - self.ideal_worst), self.k), axis1), 1/self.k) # Step 6: 计算相对贴近度 # 贴近度 Ci dist_to_worst / (dist_to_best dist_to_worst) # 防止分母为零 denominator self.dist_to_best self.dist_to_worst denominator[denominator 0] 1e-10 # 如果距离和为零赋予极小值 self.relative_closeness self.dist_to_worst / denominator # Step 7: 根据贴近度排序降序贴近度越大越优 sorted_indices np.argsort(-self.relative_closeness) # 降序排列的索引 self.ranking np.zeros(self.m, dtypeint) self.ranking[sorted_indices] np.arange(1, self.m 1) # 排名从1开始 # 封装结果 result_df pd.DataFrame({ 方案: self.scheme_names, 贴近度: self.relative_closeness, 排名: self.ranking }) # 按排名升序排列 result_df result_df.sort_values(排名).reset_index(dropTrue) return result_df def get_detailed_results(self): 获取详细的中间结果用于分析和调试。 details { 原始数据: pd.DataFrame(self.raw_data, indexself.scheme_names, columnsself.index_names), 熵权法权重: pd.Series(self.entropy_weights, indexself.index_names), TOPSIS标准化矩阵: pd.DataFrame(self.normalized_matrix, indexself.scheme_names, columnsself.index_names), 加权决策矩阵: pd.DataFrame(self.weighted_matrix, indexself.scheme_names, columnsself.index_names), 正理想解: pd.Series(self.ideal_best, indexself.index_names), 负理想解: pd.Series(self.ideal_worst, indexself.index_names), 到正理想解距离: pd.Series(self.dist_to_best, indexself.scheme_names), 到负理想解距离: pd.Series(self.dist_to_worst, indexself.scheme_names), } return details实操心得3距离公式的通用性。代码中使用了参数self.k和np.power来实现广义距离公式(Σ|xi - x*|^k)^(1/k)。当k2时就是欧氏距离当k1时是曼哈顿距离。在某些场景下改变k值可以调整模型对指标差异的敏感度。你可以通过修改初始化参数k来尝试不同的距离度量方式观察排序结果是否稳定。4. 实战案例投资方案选择理论讲完了我们用一个虚构但贴近实际的例子来跑通整个流程。假设有5个潜在的投资项目方案我们从4个指标来评估它们预期收益率效益型、风险系数成本型越小越好、投资回收期成本型越短越好、市场成长性效益型评分1-10。# 示例数据 data np.array([ [15.2, 0.65, 4.5, 8], # 方案A [12.8, 0.42, 3.2, 7], # 方案B [18.5, 0.88, 5.8, 9], # 方案C [10.5, 0.35, 2.9, 5], # 方案D [16.7, 0.71, 4.1, 8] # 方案E ]) scheme_names [项目A, 项目B, 项目C, 项目D, 项目E] index_names [预期收益率(%), 风险系数, 投资回收期(年), 市场成长性] indices_type [benefit, cost, cost, benefit] # 对应上述指标类型 # 使用我们的模型 model EntropyWeightTOPSIS(data, indices_type, k2) model.scheme_names scheme_names # 传入方案名称 model.index_names index_names # 传入指标名称 # 1. 首先查看熵权法计算的权重 weight_result model.calculate_entropy_weights() print(熵权法权重计算详情) print(weight_result.to_string(indexFalse)) print(\n *50 \n) # 2. 执行完整评价 final_ranking model.evaluate() print(TOPSIS综合评价结果按排名排序) print(final_ranking.to_string(indexFalse)) print(\n *50 \n) # 3. 可选查看详细中间结果用于深度分析 details model.get_detailed_results() print(加权决策矩阵部分展示) print(details[加权决策矩阵].round(4))运行上述代码你可能会得到类似下面的输出具体数值因计算精度可能略有差异熵权法权重计算详情 指标 信息熵 差异系数 权重 预期收益率(%) 0.9876 0.0124 0.1025 风险系数 0.9567 0.0433 0.3578 投资回收期(年) 0.9723 0.0277 0.2289 市场成长性 0.9931 0.0069 0.0570 TOPSIS综合评价结果按排名排序 方案 贴近度 排名 项目B 0.7352 1 项目D 0.6341 2 项目E 0.5218 3 项目A 0.4876 4 项目C 0.4123 5 加权决策矩阵部分展示 预期收益率(%) 风险系数 投资回收期(年) 市场成长性 项目A 0.1021 0.0321 0.0987 0.0456 项目B 0.0861 0.0208 0.0702 0.0399 项目C 0.1244 0.0435 0.1273 0.0513 项目D 0.0706 0.0173 0.0636 0.0285 项目E 0.1123 0.0351 0.0899 0.0456结果解读与分析权重分析熵权法给出的权重显示“风险系数”的权重最高约0.358其次是“投资回收期”约0.229“预期收益率”权重为0.103“市场成长性”权重最低0.057。这说明在当前数据集中各项目在“风险系数”和“投资回收期”上的差异最大这两个指标在区分项目优劣时起到了最关键的作用。而“市场成长性”的评分差异较小因此权重低。排序结果项目B综合排名第一。查看原始数据项目B在风险系数0.42和投资回收期3.2年这两个高权重指标上表现非常出色均为次优虽然收益率不是最高但凭借在高权重指标上的优势获得了最高贴近度。项目D同理风险最低、回收期最短但收益率和成长性偏低综合排名第二。项目C虽然收益率和成长性最高但风险和回收期也最高被高权重指标拖累排名垫底。这个结果符合熵权法“看重区分度大指标”的逻辑也体现了多指标权衡的综合性。5. 常见问题、调试技巧与模型优化在实际使用中你可能会遇到各种问题。下面是我总结的一些常见坑点及其解决方案。5.1 数据预处理不当导致结果异常问题原始数据中存在负数或零直接用于熵权法比重标准化会导致计算错误或权重失真。排查在_normalize_for_entropy方法中检查col_min。如果存在小于等于0的值必须进行平移处理。技巧平移时加一个多小的数合适通常加1或者一个远小于数据平均值的正数如1e-10。加1会改变数据的相对比例但计算简单加极小数影响微乎其微但更“纯净”。在数学建模中如果数据量级不大加1是常见做法。我们的代码采用了matrix - col_min 1e-10是一种更稳健的极小值平移法。5.2 权重极端化或为零问题某个指标的权重计算结果为0或接近0或者某个指标权重异常高如超过0.5。原因权重为0该指标下所有数据完全一致差异系数为0。这可能是数据收集问题也可能该指标确实无区分度。权重异常高该指标数据离散程度极大而其他指标数据非常集中。解决方案数据检查首先检查该指标数据是否存在录入错误或量纲错误。指标筛选如果某个指标确实对所有方案都相同考虑将其从评价体系中移除因为它不提供任何区分信息。混合赋权如果认为纯客观熵权法导致某些重要指标权重过低可以引入主观权重进行结合。常用线性加权组合W_final α * W_subjective (1-α) * W_entropy其中α是主观偏好系数。平滑处理在计算比重p_ij时可以使用(Xij ε) / (sum(Xj) m*ε)进行平滑其中ε是一个很小的正数可以防止极端情况。5.3 排序结果对距离参数k敏感问题改变距离公式中的k值发现方案排名发生了变动。分析这并非错误而是模型特性。k2欧氏距离是最常用的它综合考量了各维度的差异。k1曼哈顿距离对个别指标的极端值不那么敏感。k值越大模型对最大差异的那个指标越敏感。建议在数学建模论文中如果使用了非欧氏距离必须说明理由。通常保持k2是标准做法。你可以做一个敏感性分析测试k在1,2,∞切比雪夫距离情况下排名是否稳定。如果排名基本不变说明你的模型结果很稳健如果变化很大则需要谨慎解释并说明你最终选择某个k值的依据。5.4 结果的可视化与解读增强为了让你的分析报告更出彩可以考虑增加可视化import matplotlib.pyplot as plt def plot_radar_chart(model, scheme_index): 绘制某个方案的雷达图直观展示其在各加权指标上的位置与理想解的差距。 angles np.linspace(0, 2*np.pi, model.n, endpointFalse).tolist() angles angles[:1] # 闭合图形 fig, ax plt.subplots(figsize(6,6), subplot_kwdict(projectionpolar)) # 方案数据 values model.weighted_matrix[scheme_index, :].tolist() values values[:1] # 正理想解 best_values model.ideal_best.tolist() best_values best_values[:1] # 负理想解 worst_values model.ideal_worst.tolist() worst_values worst_values[:1] ax.plot(angles, values, o-, linewidth2, labelf{model.scheme_names[scheme_index]}) ax.plot(angles, best_values, r--, linewidth1.5, label正理想解) ax.plot(angles, worst_values, k:, linewidth1.5, label负理想解) ax.fill(angles, values, alpha0.25) ax.set_xticks(angles[:-1]) ax.set_xticklabels(model.index_names) ax.set_title(f{model.scheme_names[scheme_index]} 与理想解对比雷达图) ax.legend(locupper right, bbox_to_anchor(1.3, 1.0)) plt.tight_layout() plt.show() # 例如绘制排名第一的方案B的雷达图 plot_radar_chart(model, scheme_index1) # 项目B在数据中的索引是1雷达图可以清晰展示一个方案在各个指标上距离正/负理想解有多远图形化的结果比数字表格更直观尤其在向非技术背景的评委或客户汇报时非常有效。5.5 模型扩展考虑指标间的相关性标准的熵权法和TOPSIS都假设指标之间是相互独立的。然而在现实中评价指标间往往存在相关性例如“研发投入”和“专利数量”可能高度相关。这会导致信息重复计算使得权重分配失真。一种高级的改进思路是引入“熵权-相关系数”法或“CRITIC”法。其核心思想是在计算权重时不仅考虑指标内部的熵信息量还考虑指标与其他指标间的冲突性相关性。冲突性越强说明该指标提供的信息越独立应赋予更高权重。实现上可以在计算差异系数时乘以一个由相关系数矩阵导出的“独立性系数”。这超出了基础篇的范围但如果你在处理高度相关的指标集这是一个值得深入的研究方向能让你的模型在数学建模竞赛中脱颖而出。最后记住任何模型都是工具熵权法修正的TOPSIS为我们提供了一个强大、客观的评价框架但最终结果的解读和应用永远离不开对业务背景的深刻理解。模型告诉我们“是什么”而我们需要思考“为什么”以及“怎么办”。