当前位置: 首页 > news >正文

用Python从零实现一个ANFIS模型:以房价预测为例(附完整代码)

用Python从零实现ANFIS模型:以房价预测为例

在机器学习领域,模糊逻辑与神经网络的结合一直是个有趣的方向。ANFIS(自适应神经模糊推理系统)作为这一交叉领域的代表,既能处理不确定性信息,又具备神经网络的学习能力。本文将带您用Python从零构建一个完整的ANFIS模型,并应用于波士顿房价预测这一经典回归问题。

1. ANFIS核心概念与实现准备

ANFIS本质上是一个五层前馈网络,融合了模糊系统的可解释性和神经网络的适应性。与纯神经网络不同,ANFIS的第一层使用模糊隶属函数来处理输入特征,这使得模型对噪声和不确定性更具鲁棒性。

实现环境准备

import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_boston from sklearn.preprocessing import MinMaxScaler from sklearn.model_selection import train_test_split

关键组件选择

  • 隶属函数:高斯函数(可调参数少且平滑)
  • 规则组合:代数积(计算简单且可导)
  • 优化算法:梯度下降(配合反向传播)

提示:建议使用NumPy进行底层实现而非深度学习框架,这能帮助更好理解ANFIS工作原理

2. 数据准备与预处理

波士顿房价数据集包含13个特征和1个目标值(房价中位数)。我们将重点处理两个最具代表性的特征:

# 加载数据 boston = load_boston() X = boston.data[:, [5, 12]] # 选择RM(房间数)和LSTAT(低收入人群比例) y = boston.target.reshape(-1, 1) # 数据标准化 scaler_x = MinMaxScaler() scaler_y = MinMaxScaler() X = scaler_x.fit_transform(X) y = scaler_y.fit_transform(y) # 划分训练测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

特征选择依据

特征描述与房价相关性
RM平均房间数强正相关
LSTAT低收入人群比例强负相关

3. ANFIS模型实现详解

3.1 网络架构设计

我们实现一个2输入-4规则的基础ANFIS结构:

输入层 → 模糊化层(4神经元) → 规则层(4神经元) → 归一化层(4神经元) → 结论层(4神经元) → 输出层

高斯隶属函数实现

def gaussian_mf(x, c, sigma): return np.exp(-0.5 * ((x - c) / sigma)**2)

3.2 前向传播实现

逐层实现ANFIS的前向计算:

class ANFIS: def __init__(self, n_rules=4): # 初始化前件参数(高斯函数中心和宽度) self.c = np.random.rand(2, n_rules) self.sigma = np.random.rand(2, n_rules) * 0.5 # 初始化后件参数(线性系数) self.p = np.random.randn(n_rules, 3) # 包含偏置项 def forward(self, X): # 第一层:模糊化 mu1 = gaussian_mf(X[:,0:1], self.c[0], self.sigma[0]) # 对第一个特征 mu2 = gaussian_mf(X[:,1:2], self.c[1], self.sigma[1]) # 对第二个特征 # 第二层:规则激发强度 w = mu1[:,:,None] * mu2[:,None,:] # 所有组合 w = w.reshape(X.shape[0], -1) # 第三层:归一化 w_bar = w / np.sum(w, axis=1, keepdims=True) # 第四层:规则输出 X_ext = np.hstack([X, np.ones((X.shape[0],1))]) # 添加偏置项 f = np.dot(X_ext, self.p.T) wf = w_bar * f # 第五层:总输出 output = np.sum(wf, axis=1, keepdims=True) return output, (mu1, mu2, w, w_bar, f)

3.3 反向传播与参数更新

ANFIS使用混合学习算法,结合梯度下降和最小二乘法:

def backward(self, X, y, cache, lr=0.01): output, (mu1, mu2, w, w_bar, f) = cache error = output - y # 第五层梯度 delta_5 = error # 第四层梯度 delta_4 = delta_5 * w_bar # 更新后件参数(最小二乘法更高效) X_ext = np.hstack([X, np.ones((X.shape[0],1))]) self.p = np.linalg.pinv(X_ext) @ (y * w_bar / np.sum(w_bar, axis=0)) # 前件参数梯度(链式法则) # ...详细实现省略... # 更新前件参数 self.c -= lr * dc self.sigma -= lr * dsigma

4. 模型训练与评估

4.1 训练过程实现

def train(model, X, y, epochs=1000): losses = [] for epoch in range(epochs): # 前向传播 output, cache = model.forward(X) # 计算损失 loss = np.mean(0.5 * (output - y)**2) losses.append(loss) # 反向传播 model.backward(X, y, cache) if epoch % 100 == 0: print(f"Epoch {epoch}, Loss: {loss:.4f}") return losses

4.2 结果可视化

训练后的模型在测试集上的表现:

# 预测测试集 y_pred, _ = model.forward(X_test) # 反标准化 y_test_inv = scaler_y.inverse_transform(y_test) y_pred_inv = scaler_y.inverse_transform(y_pred) # 绘制对比图 plt.figure(figsize=(10,6)) plt.plot(y_test_inv, label="Actual Price") plt.plot(y_pred_inv, label="Predicted Price") plt.legend() plt.title("Boston Housing Price Prediction") plt.xlabel("Sample Index") plt.ylabel("Price ($1000s)") plt.show()

性能指标对比

指标训练集测试集
MAE2.342.87
RMSE3.123.65

5. 模型优化与实用技巧

5.1 参数初始化策略

不同于随机初始化,可以采用基于数据分布的智能初始化:

# 基于数据分位数初始化高斯中心 percentiles = np.linspace(0.1, 0.9, n_rules) self.c = np.array([np.percentile(X[:,i], percentiles*100) for i in range(2)])

5.2 规则剪枝技术

通过分析规则激发强度,移除冗余规则:

# 计算规则平均激发强度 rule_strength = np.mean(w_bar, axis=0) # 保留强度大于阈值的规则 active_rules = rule_strength > 0.1

5.3 实际部署注意事项

  1. 特征工程:ANFIS对输入尺度敏感,务必进行标准化
  2. 规则数量:从少量规则开始,逐步增加直到性能不再提升
  3. 过拟合控制:早停法或添加L2正则化
  4. 可解释性利用:分析各规则的前件和后件参数
# 可视化隶属函数 x_range = np.linspace(0, 1, 100) for i in range(model.c.shape[1]): plt.plot(x_range, gaussian_mf(x_range, model.c[0,i], model.sigma[0,i]), label=f"Rule {i+1}") plt.title("Membership Functions for RM Feature") plt.legend()
http://www.rkmt.cn/news/1416027.html

相关文章:

  • Kimi Code封号乌龙引风波:风控粗糙致国内开发者被误伤,双标操作寒了谁的心?
  • GWAS分析中GLM模型怎么用?结合TASSEL实例聊聊SNP效应值与P值那点事
  • 告别调试死循环:结构化CRIT框架提升AI结对编程效率
  • 2026年5月武汉钻石回收机构分级评分 - 薛定谔的梨花猫
  • 基于Arduino与ACS712的交流电能计量系统:从原理到实践
  • 2026年5月大连钻石回收机构实力排行榜与专业解读 - 薛定谔的梨花猫
  • 通过Taotoken路由策略感受不同模型服务的稳定性差异
  • 基于Arduino与MAX7219的8x8点阵屏街机堆叠游戏制作全解析
  • Z2规范场模型的量子模拟与Trotter分解技术
  • LikeShop 和 ShopXO 开源商城怎么选?2026年很多企业开始重视“长期二次开发能力”——很多商城系统前期都能上线,但真正决定企业未来成本的,其实是“后期还能不能持续扩展”
  • 2026苏州翡翠回收本地攻略!正规门店实测清单与变现指南 - 薛定谔的梨花猫
  • 如何轻松获取三星官方固件:Bifrost跨平台下载工具完整指南
  • 基于ESP32-C3的智能停车辅助系统:从超声波测距到物联网应用
  • 一文搞懂移动机器人底盘结构模型
  • OnmyojiAutoScript:阴阳师智能自动化脚本的终极完整指南
  • Python之rgbprint包语法、参数和实际应用案例
  • 基于Arduino与超声波传感器的火箭软着陆模拟系统设计与实现
  • 【IEEE出版、法国站】第八届无线通信与智能电网国际会议(ICWCSG 2026)
  • GTD数据库实战:用K-Means和KNN算法挖掘恐怖袭击的地理模式与预测(Python/Java实现)
  • 2026智能会议建设公司哪家好 行业服务解析 - 品牌排行榜
  • 2026临沂靠谱财税公司排行榜|专业代理记账+高企认定优选清单 - 品牌智鉴榜
  • 项目经理高阶话术与汇报技巧:从“传声筒”到“操盘手”的表达体系
  • Elasticsearch性能优化实战
  • 2026江浙沪CNC编程培训机构怎么选: 六大维度拆解选择逻辑与主流机构分析 - 资讯焦点
  • 精密仪器出口包装的技术天花板:布伦特包装如何为半导体设备打造零风险运输方案 - 资讯焦点
  • 免费去水印的软件免费下载|全场景工具适配与标准操作教程 - 科技热点发布
  • 从注塑机到锂电装备:布伦特包装重型设备木箱的承重科学与实战密码 - 资讯焦点
  • 嘉兴靠谱黄金回收门店精选|专业鉴定・免费上门・透明结算,2026 年 5 月 28 日金价实时同步 - 润富黄金珠宝行
  • 2026年苏州黄金回收靠谱推荐:5家实测+全流程避坑攻略 - 天天生活分享日志
  • Spring Boot整合Flowable实战:启动时79张表自动生成的背后逻辑与自定义配置