
专家系统是人工智能领域中最活跃和最有成效的一个分支,其发展历程可以追溯到 20 世纪 60 年代。1965 年,斯坦福大学的费根鲍姆教授开发了世界上第一个专家系统 DENDRAL,用于分析有机化合物的分子结构。此后,专家系统在医疗、地质、工程等多个领域得到了广泛应用和发展。
专家系统的发展大致经历了以下几个阶段:
专家系统是一种具有专门知识和经验的计算机智能程序系统,它能运用领域专家多年积累的经验和专门知识,模拟领域专家的思维过程,解决该领域中需要专家才能解决的复杂问题。
类型 | 特点 | 应用领域 |
|---|---|---|
解释型 | 对数据进行分析,给出解释 | 地质勘探、图像分析 |
诊断型 | 找出问题所在并提出解决方案 | 医疗诊断、设备故障诊断 |
设计型 | 根据要求设计满足需要的系统 | 工程设计、电路设计 |
规划型 | 制定行动计划 | 机器人规划、交通调度 |
控制型 | 对系统进行控制 | 工业控制、生产过程控制 |
专家系统已广泛应用于医疗、金融、工业、农业、教育等多个领域。例如:

图 1:专家系统概念思维导图
专家系统的一般结构主要包括以下几个部分:
知识库是专家系统的核心组成部分,用于存储领域专家的专业知识。知识可以表示为规则、框架、语义网络等形式。
推理机是专家系统的 "思维" 机构,是构成专家系统的核心部分。它的功能是模拟领域专家的思维过程,控制并执行对问题的求解。
综合数据库又称动态数据库或工作存储器,用于存储问题的初始数据、中间结果和最终结果等。
知识获取机构是专家系统中负责知识获取的部分,它的主要功能是接受来自专家的知识,并将其转化为知识库中的知识表示形式。
人机接口是专家系统与用户之间进行交互的界面,它负责将用户的输入信息转换为系统可以处理的形式,同时将系统的输出信息转换为用户可以理解的形式。
解释机构负责回答用户关于系统的问题,解释系统的推理过程,使用户能够理解系统的行为。

图 2:专家系统工作原理流程图
下面是一个简单的专家系统示例,用于诊断宠物的健康问题:
class ExpertSystem:
def __init__(self):
# 知识库:使用字典存储规则,键为症状,值为可能的疾病
self.knowledge_base = {
"咳嗽": ["感冒", "支气管炎"],
"打喷嚏": ["感冒", "过敏"],
"食欲不振": ["消化不良", "肠胃炎"],
"发热": ["感染", "炎症"],
"呼吸困难": ["肺炎", "哮喘"],
"腹泻": ["肠胃炎", "食物中毒"]
}
# 综合数据库:存储用户输入的症状和推理结果
self.database = {
"symptoms": [],
"diagnosis": []
}
def get_user_input(self):
"""获取用户输入的症状"""
print("请输入宠物的症状(输入'结束'完成输入):")
while True:
symptom = input("症状: ")
if symptom == "结束":
break
self.database["symptoms"].append(symptom)
print(f"已记录症状: {symptom}")
def infer(self):
"""推理机:根据症状推断可能的疾病"""
if not self.database["symptoms"]:
print("没有输入症状,无法进行诊断")
return
print("\n正在分析症状...")
possible_diseases = set()
# 遍历知识库,查找与症状匹配的疾病
for symptom in self.database["symptoms"]:
if symptom in self.knowledge_base:
possible_diseases.update(self.knowledge_base[symptom])
if possible_diseases:
self.database["diagnosis"] = list(possible_diseases)
print(f"可能的疾病: {', '.join(self.database['diagnosis'])}")
else:
print("根据现有知识,无法确定可能的疾病")
def explain(self):
"""解释机构:解释推理过程"""
if not self.database["diagnosis"]:
return
print("\n诊断依据:")
for disease in self.database["diagnosis"]:
matching_symptoms = []
for symptom in self.database["symptoms"]:
if symptom in self.knowledge_base and disease in self.knowledge_base[symptom]:
matching_symptoms.append(symptom)
if matching_symptoms:
print(f"{disease}: 与症状 {', '.join(matching_symptoms)} 相关")
def run(self):
"""运行专家系统"""
print("宠物健康诊断专家系统")
print("=" * 30)
self.get_user_input()
self.infer()
self.explain()
print("\n=" * 30)
print("诊断结束")
# 运行专家系统
if __name__ == "__main__":
es = ExpertSystem()
es.run()
上面的代码实现了一个简单的专家系统,包含了知识库、推理机、综合数据库和解释机构等核心组件。用户可以输入宠物的症状,系统会根据知识库中的规则进行推理,给出可能的疾病诊断,并解释诊断依据。
知识获取是专家系统开发中的关键环节,其主要过程包括:
知识获取的模式主要有以下几种:
机器学习是人工智能的核心领域之一,它研究如何让计算机从数据中学习规律,并利用这些规律进行预测或决策。机器学习的目标是使计算机具有像人类一样的学习能力,能够从经验中不断改进性能。
机器学习可以按照不同的标准进行分类,常见的分类方式包括:
监督学习是指利用有标签的数据进行学习,学习的目标是建立输入到输出的映射关系。常见的监督学习算法包括:
无监督学习是指利用无标签的数据进行学习,学习的目标是发现数据中的内在结构和模式。常见的无监督学习算法包括:
弱监督学习是介于监督学习和无监督学习之间的一种学习方式,它使用的是弱标签数据,如不完整标签、不准确标签或间接标签。常见的弱监督学习方法包括:
机械式学习是最简单的机器学习方式,它直接记忆训练数据,在需要时直接检索记忆的内容。例如,查表法就是一种典型的机械式学习。
指导式学习是指从专家或其他信息源获取指导信息,并将其转换为可执行的知识。这种学习方式需要人类专家的指导,但不需要大量的训练数据。
示例学习是指从具体的示例中学习一般规律。它是机器学习中最常见的学习方式之一,监督学习中的大多数算法都属于示例学习。
深度学习是机器学习的一个分支,它使用多层神经网络来学习数据的抽象表示。深度学习在图像识别、语音识别、自然语言处理等领域取得了显著的成果。

图 3:机器学习分类思维导图
下面是几个常见机器学习算法的 Python 实现示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.decomposition import PCA
from sklearn.metrics import accuracy_score
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 监督学习:逻辑回归示例
def logistic_regression_example():
"""逻辑回归分类示例"""
print("=== 逻辑回归分类示例 ===")
# 生成简单的二维分类数据
np.random.seed(42)
X = np.random.randn(100, 2)
y = (X[:, 0] + X[:, 1] > 0).astype(int)
# 创建并训练逻辑回归模型
model = LogisticRegression()
model.fit(X, y)
# 预测并计算准确率
y_pred = model.predict(X)
accuracy = accuracy_score(y, y_pred)
print(f"模型准确率: {accuracy:.4f}")
# 可视化分类结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', edgecolors='k')
# 绘制决策边界
h = 0.02
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3, cmap='viridis')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.title('逻辑回归分类结果')
plt.savefig('logistic_regression.png')
plt.close()
# 2. 无监督学习:K-means聚类示例
def kmeans_clustering_example():
"""K-means聚类示例"""
print("=== K-means聚类示例 ===")
# 生成聚类数据
np.random.seed(42)
X = np.vstack([
np.random.randn(50, 2) + np.array([2, 2]),
np.random.randn(50, 2) + np.array([-2, -2]),
np.random.randn(50, 2) + np.array([2, -2])
])
# 创建并训练K-means模型
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)
labels = kmeans.predict(X)
centroids = kmeans.cluster_centers_
# 可视化聚类结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', edgecolors='k')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='x', s=200)
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.title('K-means聚类结果')
plt.savefig('kmeans_clustering.png')
plt.close()
# 3. 无监督学习:PCA降维示例
def pca_example():
"""PCA降维示例"""
print("=== PCA降维示例 ===")
# 生成高维数据
np.random.seed(42)
X = np.random.randn(100, 10)
# 创建并应用PCA
pca = PCA(n_components=2) # 降维到2维
X_reduced = pca.fit_transform(X)
# 输出方差解释率
explained_variance = pca.explained_variance_ratio_
total_variance = sum(explained_variance)
print(f"各主成分方差解释率: {explained_variance}")
print(f"总方差解释率: {total_variance:.4f}")
# 可视化降维结果
plt.figure(figsize=(8, 6))
plt.scatter(X_reduced[:, 0], X_reduced[:, 1])
plt.xlabel('主成分1')
plt.ylabel('主成分2')
plt.title('PCA降维结果')
plt.savefig('pca_reduction.png')
plt.close()
# 4. 监督学习:决策树示例
def decision_tree_example():
"""决策树分类示例"""
print("=== 决策树分类示例 ===")
# 生成简单的二维分类数据
np.random.seed(42)
X = np.random.randn(100, 2)
y = (X[:, 0] ** 2 + X[:, 1] ** 2 > 1).astype(int)
# 创建并训练决策树模型
model = DecisionTreeClassifier(max_depth=3)
model.fit(X, y)
# 预测并计算准确率
y_pred = model.predict(X)
accuracy = accuracy_score(y, y_pred)
print(f"模型准确率: {accuracy:.4f}")
# 可视化分类结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', edgecolors='k')
# 绘制决策边界
h = 0.02
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3, cmap='viridis')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.title('决策树分类结果')
plt.savefig('decision_tree.png')
plt.close()
# 运行示例
if __name__ == "__main__":
logistic_regression_example()
kmeans_clustering_example()
pca_example()
decision_tree_example()
print("所有示例运行完毕,结果图片已保存")




上面的代码示例展示了监督学习中的逻辑回归和决策树算法,以及无监督学习中的 K-means 聚类和 PCA 降维算法。每个算法都有完整的实现过程和可视化结果,帮助读者理解机器学习算法的工作原理和应用场景。
知识发现 (Knowledge Discovery in Databases, KDD) 是从大量数据中提取有用知识的整个过程。数据挖掘 (Data Mining) 是知识发现过程中的一个关键步骤,它是指从数据中提取有趣的模式和知识的算法过程。
知识发现的一般过程包括以下几个步骤:
知识发现的主要任务包括:
知识发现的方法主要包括:
知识发现的对象可以是各种类型的数据,包括:

图 4:知识发现过程流程图
下面是一个简单的关联规则挖掘示例,使用 Apriori 算法发现购物篮数据中的关联规则:
import pandas as pd
import matplotlib.pyplot as plt
from mlxtend.frequent_patterns import apriori, association_rules
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def association_rule_mining_example():
"""关联规则挖掘示例"""
print("=== 关联规则挖掘示例 ===")
# 创建示例购物篮数据
# 每一行表示一个购物篮,列表示商品是否被购买(1表示购买,0表示未购买)
data = {
'面包': [1, 1, 0, 1, 0],
'牛奶': [1, 0, 1, 1, 1],
'鸡蛋': [0, 1, 1, 0, 1],
'黄油': [1, 0, 0, 1, 0],
'奶酪': [0, 1, 1, 0, 1],
'水果': [1, 1, 1, 0, 1]
}
df = pd.DataFrame(data)
print("购物篮数据:")
print(df)
# 使用Apriori算法发现频繁项集
frequent_itemsets = apriori(df, min_support=0.4, use_colnames=True)
frequent_itemsets['length'] = frequent_itemsets['itemsets'].apply(lambda x: len(x))
print("\n频繁项集:")
print(frequent_itemsets)
# 生成关联规则
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.5)
print("\n关联规则:")
print(rules[['antecedents', 'consequents', 'support', 'confidence', 'lift']])
# 可视化强关联规则
plt.figure(figsize=(10, 6))
plt.scatter(rules['support'], rules['confidence'], alpha=0.5)
plt.xlabel('支持度')
plt.ylabel('置信度')
plt.title('关联规则 - 支持度 vs 置信度')
# 为强规则添加标签
for i, rule in rules.iterrows():
if rule['lift'] > 1.5: # 只标记提升度高的规则
plt.annotate(f"({', '.join(rule['antecedents'])}) -> ({', '.join(rule['consequents'])})",
(rule['support'], rule['confidence']),
fontsize=9)
plt.grid(True)
plt.savefig('association_rules.png')
plt.close()
# 运行示例
if __name__ == "__main__":
association_rule_mining_example()
print("关联规则挖掘示例运行完毕,结果图片已保存")

上面的代码示例使用 Apriori 算法进行关联规则挖掘,这是知识发现中的一项重要任务。示例中创建了一个简单的购物篮数据集,然后使用 Apriori 算法发现频繁项集,并生成关联规则。最后,通过可视化方式展示了支持度和置信度之间的关系,并标记了提升度较高的强规则。
建立一个专家系统通常需要经过以下步骤:
骨架系统是从已有的专家系统中抽取其具体领域知识,保留其体系结构和功能,再加以抽象和通用化而得到的通用专家系统外壳。使用骨架系统可以快速开发新的专家系统,只需添加新的领域知识即可。
EMYCIN (Empty MYCIN) 是从医疗诊断专家系统 MYCIN 中抽取出来的骨架系统。它保留了 MYCIN 的推理机制和解释功能,去掉了具体的医疗诊断知识。EMYCIN 可用于开发其他领域的诊断型专家系统。
KAS (Knowledge Acquisition System) 是从地质勘探专家系统 PROSPECTOR 中抽取出来的骨架系统。它采用语义网络作为知识表示方法,适用于开发解释型专家系统。
专家系统开发环境是用于辅助专家系统开发的软件工具,它通常包括:
常见的专家系统开发环境包括:
本章介绍了专家系统与机器学习的基本概念和原理,主要内容包括:
专家系统和机器学习是人工智能领域的重要分支,两者相互关联、相互促进。专家系统侧重于利用领域专家的知识进行推理,而机器学习则侧重于从数据中自动学习规律。随着人工智能技术的不断发展,专家系统和机器学习的结合将成为未来的重要发展方向。
通过本章的学习,读者应该对专家系统和机器学习有了基本的了解,并能够通过示例代码动手实践,加深对理论知识的理解和应用。