智慧水利项目实战(二):KNN算法实现水位预测与数据可视化
·
智慧水利项目实战(二):KNN算法实现水位预测与数据可视化
系列链接: 智慧水利项目实战
作者: 李垚
日期: 2026年1月25日
📖 目录
1. KNN算法原理
1.1 什么是KNN?
K-近邻算法是一种基于实例的懒惰学习算法,它的核心思想是:
- 相似性假设:相似的样本具有相似的输出
- 距离度量:通过计算样本间的距离来判断相似性
- K值选择:参考最近的K个邻居进行预测
1.2 距离度量方法
欧氏距离:
import numpy as np
def euclidean_distance(x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
曼哈顿距离:
def manhattan_distance(x1, x2):
return np.sum(np.abs(x1 - x2))
1.3 K值选择策略
- K值太小:容易过拟合,对噪声敏感
- K值太大:容易欠拟合,忽略局部特征
- 常用方法:交叉验证,选择最优K值
2. KNN分类实战
2.1 水位分类场景
将水位分为三个等级:
- 0:低水位(安全)
- 1:中水位(警戒)
- 2:高水位(危险)
2.2 代码实现
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np
# 生成模拟数据
X = np.array([
[500, 10], [600, 12], [700, 14],
[800, 16], [900, 18], [1000, 20],
[550, 11], [750, 15], [850, 17], [950, 19]
])
y = np.array([0, 0, 1, 1, 2, 2, 0, 1, 1, 2])
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# 创建KNN分类器
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
# 预测
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy:.2%}")
2.3 运行结果
准确率: 100.00%
3. KNN回归实战
3.1 水位预测场景
根据流量和河宽,预测具体的水位高度。
3.2 代码实现
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error
# 生成模拟数据
X = np.array([
[500, 10], [600, 12], [700, 14],
[800, 16], [900, 18], [1000, 20]
])
y = np.array([50, 50, 50, 50, 50, 50]) # 水位高度
# 创建KNN回归器
knn_reg = KNeighborsRegressor(n_neighbors=3)
knn_reg.fit(X, y)
# 预测
X_test = np.array([[550, 11], [750, 15]])
y_pred = knn_reg.predict(X_test)
print(f"预测水位: {y_pred}")
3.3 运行结果
预测水位: [50. 50.]
4. 可视化分析
4.1 分类结果可视化
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', s=100)
plt.colorbar(label='水位等级')
plt.xlabel('流量 (m³/s)')
plt.ylabel('河宽 (m)')
plt.title('KNN水位分类可视化')
plt.grid(True)
plt.show()
4.2 特征相关性分析
import seaborn as sns
# 生成相关矩阵
data = np.column_stack([X, y])
df = pd.DataFrame(data, columns=['流量', '河宽', '水位'])
# 绘制热力图
plt.figure(figsize=(8, 6))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm')
plt.title('特征相关性热力图')
plt.show()
5. 最佳实践
5.1 数据预处理
from sklearn.preprocessing import StandardScaler
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
5.2 超参数调优
from sklearn.model_selection import GridSearchCV
# 参数网格
param_grid = {'n_neighbors': [1, 3, 5, 7, 9]}
# 网格搜索
grid_search = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5)
grid_search.fit(X_train, y_train)
print(f"最优K值: {grid_search.best_params_['n_neighbors']}")
5.3 交叉验证
from sklearn.model_selection import cross_val_score
# 5折交叉验证
scores = cross_val_score(knn, X, y, cv=5)
print(f"交叉验证准确率: {scores.mean():.2%}")
6. 总结
6.1 学习收获
✅ 掌握了KNN算法原理
理解了距离度量和K值选择
掌握了分类和回归两种应用场景
✅ 学会了Scikit-learn使用
熟悉了API调用方式
掌握了数据预处理和模型评估
✅ 提升了可视化能力
使用Matplotlib绘制分类结果
使用Seaborn分析特征相关性
6.2 代码仓库
完整代码已上传至GitHub:
https://github.com/LY-muyanshiqi/smart-water-demo
核心文件:
- src/knn_predictor.py:KNN预测器实现
- src/visualizer.py:数据可视化模块
6.3 下一步计划
学习LSTM时序预测模型
实现模型集成与性能优化
开发Flask后端服务
📚 参考资料
- Scikit-learn官方文档
- KNN算法详解
- Python机器学习实战
💬 交流讨论
欢迎在评论区留言,或在 GitHub Issues 中提出问题!
点赞 + 关注 + 收藏 ,不错过后续精彩内容!
更多推荐
所有评论(0)