跳到主要内容
xray.top
博客/在家翻肚皮/ism/解释结构模型例子(修改中)
知识小组同库第 1

解释结构模型例子(修改中)

发布 2026/01/13 14:08更新 2026/01/14 11:22313618 阅读

📎基于ISM模型的线上教学效果影响因素研究_马嘉营.pdf

该研究通过从定性分析到定量建模的完整流程,构建了解释结构模型(ISM)。

以下是该研究的具体实施过程总结:

1.确定研究对象与影响因素(定性阶段)

研究通过文献资料法和访谈调查法,确定了线上教学效果的评价维度和具体指标。

确立维度: 研究将影响因素划分为四个主要层面:学生层面、教师层面、课程层面、平台层面

筛选因子: 归纳出12个主要影响因素(编号S1S12,包括教学风格、教学素养、教学水平、学习动机、学习方法、课程类型、课程时长、互动程度、平台类型、平台设计、使用体验、互动方式

2.数据收集与关系判定

问卷调查: 以河北农业大学的258名本科生为调查对象发放问卷 。

二元关系判定: 让调查对象评判这12个要素之间的相互关系(即判断因素A是否直接影响因素B) 。

建立邻接矩阵: 根据调查数据,建立邻接矩阵(Adjacency Matrix),用1表示有直接影响,用0表示无直接影响。

3.构建ISM模型(定量计算阶段)

利用矩阵运算将复杂的因素关系结构化:

计算可达矩阵: 在邻接矩阵的基础上,通过布尔代数运算推导出可达矩阵(Reachability Matrix),确定任意要素的“可达集” R(Si)(该要素能影响到的集合)和“先行集” A(Si)(能影响该要素的集合) 。

计算骨架矩阵:

层级划分: 依据 R(Si) = R(Si)并A(Si)的条件,自上而下进行层级抽取,将12个因素划分为四个层级:

说明:L1 为最顶层(结果层),L_Max 为最底层(原因层)

Level 1: S1(教学风格), S4(学习动机), S5(学习方法), S8(互动程度), S10(平台设计), S11(使用体验)

Level 2: S3(教学水平), S7(课程时长), S12(互动方式)

Level 3: S2(教学素养), S9(平台类型)

Level 4: S6(课程类型)

4.模型可视化与分析

绘制递阶结构图: 根据计算出的骨架矩阵和层级关系,绘制出多层递接结构模型图(有向拓扑图),直观展示各因素间的逻辑链条。

路径分析:

分析出学习动机互动程度等是直接影响教学效果的表层因素 。

指出“教学水平”和“教学素养”是间接影响因素,它们通过激发学习兴趣来提升效果。

明确课程类型处于最底层,说明线上教学模式的选择需基于课程的根本性质(如理论课与实验课的区别)。

5.提出对策建议

基于模型分析结果,从三个方面提出了改进策略:

师生能力: 加强教师线上教学素养及学生自主学习能力的培养

教学技能 强化互动训练,利用幽默感、小测验等控制节奏

资源整合: 根据课程性质(根源因素)灵活选择直播或录播形式,并完善教材和考勤制度。

代码实现

import numpy as np
import pandas as pd

# ================= 配置与初始化 =================
# 设置pandas显示选项,确保中文对齐和显示完整
pd.set_option('display.max_columns', 20)
pd.set_option('display.width', 1000)
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
pd.set_option('display.max_rows', None)

# 定义因素字典 (带中文含义)
factors_dict = {
    'S1': '教学风格', 'S2': '教学素养', 'S3': '教学水平', 'S4': '学习动机',
    'S5': '学习方法', 'S6': '课程类型', 'S7': '课程时长', 'S8': '互动程度',
    'S9': '平台类型', 'S10': '平台设计', 'S11': '使用体验', 'S12': '互动方式'
}
codes = list(factors_dict.keys())
labels = [f"{k}" for k in factors_dict.keys()] # 简化显示,只显示代号,表头不易乱
full_labels = [f"{k}({v})" for k, v in factors_dict.items()] # 完整标签用于最终报告
n = len(codes)

# 定义SSIM关系 (基于之前的分析)
# 格式: (Row_Index, Col_Index, Type)
# V: Row->Col, A: Col->Row
relationships = [
    (0, 6, 'A'),  # S1-S7: A
    (1, 2, 'V'),  # S2-S3: V
    (2, 3, 'V'),  # S3-S4: V
    (4, 5, 'A'),  # S5-S6: A
    (4, 6, 'A'),  # S5-S7: A
    (5, 6, 'V'),  # S6-S7: V
    (5, 8, 'V'),  # S6-S9: V
    (5, 9, 'V'),  # S6-S10: V
    (7, 11, 'A'), # S8-S12: A
    (8, 9, 'V'),  # S9-S10: V
    (8, 10, 'V'), # S9-S11: V
    (8, 11, 'V'), # S9-S12: V
    (10, 11, 'A') # S11-S12: A
]

# ================= 核心计算函数 =================

def calc_adjacency(n, rels):
    """计算邻接矩阵"""
    adj = np.zeros((n, n), dtype=int)
    for r, c, t in rels:
        if t == 'V': adj[r, c] = 1
        elif t == 'A': adj[c, r] = 1
    return adj

def calc_reachability(adj):
    """计算可达矩阵 (A+I)^k"""
    n = adj.shape[0]
    identity = np.eye(n, dtype=int)
    reach = (adj + identity > 0).astype(int)
    while True:
        new_reach = (np.matmul(reach, reach) > 0).astype(int)
        if np.array_equal(new_reach, reach):
            return reach
        reach = new_reach

def calc_skeleton(reach):
    """计算骨架矩阵 (去除传递性冗余边)"""
    n = reach.shape[0]
    skeleton = reach.copy()
    np.fill_diagonal(skeleton, 0) # 去除自回路
    
    # 核心算法: 如果 i->k->j 存在,则移除 i->j
    # 优化算法: 直接矩阵运算 S = R - (R-I)^2 - I (并不完全通用,建议用循环校验法)
    for i in range(n):
        for j in range(n):
            if i == j or skeleton[i, j] == 0: continue
            # 检查中间点
            for k in range(n):
                if k != i and k != j:
                    if reach[i, k] == 1 and reach[k, j] == 1:
                        skeleton[i, j] = 0 # 移除直接连接
                        break
    return skeleton

def calc_levels(reach):
    """层级划分 (Level Partition)"""
    # 转换为DataFrame方便操作
    df = pd.DataFrame(reach, index=np.arange(n), columns=np.arange(n))
    active_nodes = list(df.index)
    levels = {}
    current_level = 1
    
    while active_nodes:
        level_nodes = []
        # 对当前剩余的每一个节点进行判断
        for node in active_nodes:
            # R(Si): 可达集 (这一行是1的列)
            reach_set = set(df.columns[df.loc[node] == 1]) & set(active_nodes)
            # A(Si): 先行集 (这一列是1的行)
            ante_set = set(df.index[df.loc[:, node] == 1]) & set(active_nodes)
            # 交集
            intersection = reach_set.intersection(ante_set)
            
            # ISM层级判据: R(Si) == R(Si) ∩ A(Si)
            if reach_set == intersection:
                level_nodes.append(node)
        
        if not level_nodes:
            break # 防止死循环(如果有环路可能导致此情况)
            
        levels[current_level] = level_nodes
        # 从剩余节点中移除已分层的节点
        for node in level_nodes:
            active_nodes.remove(node)
        current_level += 1
        
    return levels

def generate_report(adj, reach, skel, levels):
    """生成综合分析报告"""
    
    # 1. 邻接矩阵
    print(f"\n{'='*25} 1. 邻接矩阵 (Adjacency Matrix) {'='*25}")
    df_adj = pd.DataFrame(adj, index=labels, columns=labels)
    print(df_adj)
    
    # 2. 可达矩阵与 MICMAC 分析
    print(f"\n{'='*25} 2. 可达矩阵与驱动力/依赖力 (MICMAC) {'='*25}")
    df_reach = pd.DataFrame(reach, index=labels, columns=labels)
    
    # 计算驱动力 (行和) 和 依赖力 (列和)
    driving_power = df_reach.sum(axis=1)
    dependence_power = df_reach.sum(axis=0)
    
    # 添加到表格显示
    df_display = df_reach.copy()
    df_display['驱动力'] = driving_power
    # 添加依赖力行 (需要转置处理一下再转回来,或者直接打印)
    print(df_display)
    print("-" * 60)
    print(f"各因素依赖力 (列和):\n{dependence_power.to_dict()}")

    # 3. 层级划分结果
    print(f"\n{'='*25} 3. 层级划分结果 (Level Partition) {'='*25}")
    print("说明:L1 为最顶层(结果层),L_Max 为最底层(原因层)")
    for lvl, nodes in levels.items():
        node_names = [full_labels[i] for i in nodes]
        print(f"Level {lvl}: {', '.join(node_names)}")

    # 4. 骨架矩阵
    print(f"\n{'='*25} 4. 骨架矩阵 (Skeleton Matrix - 用于绘图) {'='*25}")
    df_skel = pd.DataFrame(skel, index=labels, columns=labels)
    print(df_skel)

    # 5. 生成 Mermaid 代码
    print(f"\n{'='*25} 5. Mermaid 可视化代码 {'='*25}")
    print("将以下代码复制到 Markdown 编辑器即可直接生成层级图:\n")
    mermaid_code = ["```mermaid", "graph BT"]
    mermaid_code.append("    %% 节点定义")
    for i in range(n):
        # Mermaid 不接受嵌套括号,统一用方括号包裹文本
        mermaid_code.append(f"    {codes[i]}[\"{full_labels[i]}\"]")
    
    mermaid_code.append("\n    %% 边关系 (基于骨架矩阵)")
    rows, cols = skel.shape
    for r in range(rows):
        for c in range(cols):
            if skel[r, c] == 1:
                mermaid_code.append(f"    {codes[r]} --> {codes[c]}")
                
    # 为了好看,按照层级添加子图 (Optional)
    mermaid_code.append("\n    %% 层级样式优化")
    for lvl, nodes in levels.items():
        nodes_str = ",".join([codes[i] for i in nodes])
        # 给每一层的节点设置特定颜色
        mermaid_code.append(f"    class {nodes_str} level{lvl};")

    # 定义颜色类
    mermaid_code.append("\n    classDef level1 fill:#f9d5e5,stroke:#333;")
    mermaid_code.append("    classDef level2 fill:#eeac99,stroke:#333;")
    mermaid_code.append("    classDef level3 fill:#e06377,stroke:#333,color:#fff;")
    mermaid_code.append("    classDef level4 fill:#c83349,stroke:#333,color:#fff;")
    mermaid_code.append("```")
    
    print("\n".join(mermaid_code))

# ================= 执行计算 =================

# 1. 计算
adj_mat = calc_adjacency(n, relationships)
reach_mat = calc_reachability(adj_mat)
skel_mat = calc_skeleton(reach_mat)
levels_dict = calc_levels(reach_mat)

# 2. 输出报告
generate_report(adj_mat, reach_mat, skel_mat, levels_dict)

使用说明

macOS Homebrew 的 PEP 668 限制,不能直接往系统 Python 装包。最稳妥是用虚拟环境

python3 -m venv .venv
source .venv/bin/activate
python -m pip install numpy pandas
python main.py

输出

source /Users/lushi78778/python/code/.venv/bin/activate
lushi78778@lushi78778deMac-mini code % source /Users/lushi78778/python/code/.venv/bin/activate
(.venv) lushi78778@lushi78778deMac-mini code % python main.py                                         

========================= 1. 邻接矩阵 (Adjacency Matrix) =========================
     S1  S2  S3  S4  S5  S6  S7  S8  S9  S10  S11  S12
S1    0   0   0   0   0   0   0   0   0    0    0    0
S2    0   0   1   0   0   0   0   0   0    0    0    0
S3    0   0   0   1   0   0   0   0   0    0    0    0
S4    0   0   0   0   0   0   0   0   0    0    0    0
S5    0   0   0   0   0   0   0   0   0    0    0    0
S6    0   0   0   0   1   0   1   0   1    1    0    0
S7    1   0   0   0   1   0   0   0   0    0    0    0
S8    0   0   0   0   0   0   0   0   0    0    0    0
S9    0   0   0   0   0   0   0   0   0    1    1    1
S10   0   0   0   0   0   0   0   0   0    0    0    0
S11   0   0   0   0   0   0   0   0   0    0    0    0
S12   0   0   0   0   0   0   0   1   0    0    1    0

========================= 2. 可达矩阵与驱动力/依赖力 (MICMAC) =========================
     S1  S2  S3  S4  S5  S6  S7  S8  S9  S10  S11  S12  驱动力
S1    1   0   0   0   0   0   0   0   0    0    0    0       1
S2    0   1   1   1   0   0   0   0   0    0    0    0       3
S3    0   0   1   1   0   0   0   0   0    0    0    0       2
S4    0   0   0   1   0   0   0   0   0    0    0    0       1
S5    0   0   0   0   1   0   0   0   0    0    0    0       1
S6    1   0   0   0   1   1   1   1   1    1    1    1       9
S7    1   0   0   0   1   0   1   0   0    0    0    0       3
S8    0   0   0   0   0   0   0   1   0    0    0    0       1
S9    0   0   0   0   0   0   0   1   1    1    1    1       5
S10   0   0   0   0   0   0   0   0   0    1    0    0       1
S11   0   0   0   0   0   0   0   0   0    0    1    0       1
S12   0   0   0   0   0   0   0   1   0    0    1    1       3
------------------------------------------------------------
各因素依赖力 (列和):
{'S1': 3, 'S2': 1, 'S3': 2, 'S4': 3, 'S5': 3, 'S6': 1, 'S7': 2, 'S8': 4, 'S9': 2, 'S10': 3, 'S11': 4, 'S12': 3}

========================= 3. 层级划分结果 (Level Partition) =========================
说明:L1 为最顶层(结果层),L_Max 为最底层(原因层)
Level 1: S1(教学风格), S4(学习动机), S5(学习方法), S8(互动程度), S10(平台设计), S11(使用体验)
Level 2: S3(教学水平), S7(课程时长), S12(互动方式)
Level 3: S2(教学素养), S9(平台类型)
Level 4: S6(课程类型)

========================= 4. 骨架矩阵 (Skeleton Matrix - 用于绘图) =========================
     S1  S2  S3  S4  S5  S6  S7  S8  S9  S10  S11  S12
S1    0   0   0   0   0   0   0   0   0    0    0    0
S2    0   0   1   0   0   0   0   0   0    0    0    0
S3    0   0   0   1   0   0   0   0   0    0    0    0
S4    0   0   0   0   0   0   0   0   0    0    0    0
S5    0   0   0   0   0   0   0   0   0    0    0    0
S6    0   0   0   0   0   0   1   0   1    0    0    0
S7    1   0   0   0   1   0   0   0   0    0    0    0
S8    0   0   0   0   0   0   0   0   0    0    0    0
S9    0   0   0   0   0   0   0   0   0    1    0    1
S10   0   0   0   0   0   0   0   0   0    0    0    0
S11   0   0   0   0   0   0   0   0   0    0    0    0
S12   0   0   0   0   0   0   0   1   0    0    1    0

========================= 5. Mermaid 可视化代码 =========================
将以下代码复制到 Markdown 编辑器即可直接生成层级图:

```mermaid
graph BT
    %% 节点定义
    S1["S1(教学风格)"]
    S2["S2(教学素养)"]
    S3["S3(教学水平)"]
    S4["S4(学习动机)"]
    S5["S5(学习方法)"]
    S6["S6(课程类型)"]
    S7["S7(课程时长)"]
    S8["S8(互动程度)"]
    S9["S9(平台类型)"]
    S10["S10(平台设计)"]
    S11["S11(使用体验)"]
    S12["S12(互动方式)"]

    %% 边关系 (基于骨架矩阵)
    S2 --> S3
    S3 --> S4
    S6 --> S7
    S6 --> S9
    S7 --> S1
    S7 --> S5
    S9 --> S10
    S9 --> S12
    S12 --> S8
    S12 --> S11

    %% 层级样式优化
    class S1,S4,S5,S8,S10,S11 level1;
    class S3,S7,S12 level2;
    class S2,S9 level3;
    class S6 level4;

    classDef level1 fill:#f9d5e5,stroke:#333;
    classDef level2 fill:#eeac99,stroke:#333;
    classDef level3 fill:#e06377,stroke:#333,color:#fff;
    classDef level4 fill:#c83349,stroke:#333,color:#fff;
```
(.venv) lushi78778@lushi78778deMac-mini code 
更新 2026/01/13 13:48