智慧水利项目实战(二):KNN算法实现水位预测与数据可视化

系列链接: 智慧水利项目实战

作者: 李垚

日期: 2026年1月25日


📖 目录

  1. KNN算法原理
  2. KNN分类实战
  3. KNN回归实战
  4. 可视化分析
  5. 最佳实践
  6. 总结

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 中提出问题!
点赞 + 关注 + 收藏 ,不错过后续精彩内容!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐