机器学习算法手把手实战:KNN预测城市空气质量

python空气质量分析与预测_干货!如何用 Python+KNN 算法实现城市空气质量分析与预测?... 原标题:干货!如何用 Python+KNN 算法实现城市空气质量分析与预测? 作者 | 李秋键责编 | 伍杏玲封图 | 优快云 付费下载自东方 IC出品 | 优快云(ID:优快云news)随着中国工业和科技的发展,中国的一些发达城市的空气质量问题变得越来越严重,其中最为严重的便是PM2.5带来的恶劣环境问题。本文在根据网络公开空气质量数据的基础上进行爬取相关数据,主要针对环境较为恶劣的城市,... 阅读详情

AI派在读学生小姐姐Beyonce

Java实战项目练习群

长按识别下方二维码,按需求添加

扫码添加Beyonce小姐姐

扫码关注

进Java学习大礼包


机器学习KNN算法实践

预测城市空气质量

「Python数据之道」导读: 之前在公众号上分享过 “图解KNN算法” 的内容(点击下面链接前往),今天来分享下使用KNN算法进行案例实践,进一步加深对KNN算法的理解。

一、KNN算法简介

KNN(K-Nearest Neighbor)最邻近分类算法是数据挖掘分类(classification)技术中常用算法之一,其指导思想是"近朱者赤,近墨者黑",即由你的邻居来推断出你的类别。

KNN 最邻近分类算法的实现原理:为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与未知样本距离最近的K个已知样本,再根据少数服从多数的投票法则(majority-voting),将未知样本与K个最邻近样本中所属类别占比较多的归为一类。

KNN算法的核心思想:寻找最近的k个数据,推测新数据的分类

KNN算法的关键:

  • 样本的所有特征都要做可比较的量化 若是样本特征中存在非数值的类型,必须采取手段将其量化为数值。例如样本特征中包含颜色,可通过将颜色转换为灰度值来实现距离计算。

  • 样本特征要做归一化处理 样本有多个参数,每一个参数都有自己的定义域和取值范围,他们对距离计算的影响不一样,如取值较大的影响力会盖过取值较小的参数。所以样本参数必须做一些 scale 处理,最简单的方式就是所有特征的数值都采取归一化处置。

  • 需要一个距离函数以计算两个样本之间的距离 通常使用的距离函数有:欧氏距离、余弦距离、汉明距离、曼哈顿距离等,一般选欧氏距离作为距离度量,但是这是只适用于连续变量。在文本分类这种非连续变量情况下,汉明距离可以用来作为度量。通常情况下,如果运用一些特殊的算法来计算度量的话,K近邻分类精度可显著提高,如运用大边缘最近邻法或者近邻成分分析法。

以计算二维空间中的 A(x1,y1)、B(x2,y2) 两点之间的距离为例,常用的欧氏距离的计算方法如下图所示:

  • 确定 K 的值 K 值选的太大易引起欠拟合,太小容易过拟合,需交叉验证确定K值。

  • KNN 算法的优点:简单,易于理解,易于实现,无需估计参数,无需训练;适合对稀有事件进行分类;特别适合于多分类问题(multi-modal,对象具有多个类别标签), KNN 比 SVM 的表现要好。

  • KNN算法的缺点:KNN算法在分类时有个主要的不足是:当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的 K 个邻居中大容量类的样本占多数。该算法只计算最近的邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。

  • 该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的 K 个最近邻点。可理解性差,无法给出像决策树那样的规则。

二、KNN算法实现思路

要自己动手用 Python 实现 KNN 算法,主要有以下三个步骤:

  • 算距离:给定待分类样本,计算它与已分类样本中的每个样本的距离;

  • 找邻居:圈定与待分类样本距离最近的 K 个已分类样本,作为待分类样本的近邻;

  • 做分类:根据这 K 个近邻中的大部分样本所属的类别来决定待分类样本该属于哪个分类;

三、KNN算法预测城市空气质量

1. 获取数据

数据来源:http://www.tianqihoubao.com/aqi/chengdu-201901.html

对于这种 Table 表格型数据,可以直接用 pandas 的 read_html() 大法,将数据保存到csv,也就不用再写爬虫去解析网页和提取数据了。

# -*- coding: UTF-8 -*-
import pandas as pd
import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')

for page in range(1, 13):   # 12个月
    if page < 10:
        url = f'http://www.tianqihoubao.com/aqi/guangzhou-20190{page}.html'
        df = pd.read_html(url, encoding='gbk')[0]
        if page == 1:
            df.to_csv('2019年广州空气质量数据.csv', mode='a+', index=False, header=False)
        else:
            df.iloc[1:,::].to_csv('2019年广州空气质量数据.csv', mode='a+', index=False, header=False)
    else:
        url = f'http://www.tianqihoubao.com/aqi/guangzhou-2019{page}.html'
        df = pd.read_html(url, encoding='gbk')[0]
        df.iloc[1:,::].to_csv('2019年广州空气质量数据.csv', mode='a+', index=False, header=False)

    logging.info(f'{page}月空气质量数据下载完成!')

多爬取几个城市 2019 年历史空气质量数据保存到本地

2. 生成测试集和训练集

首先,我们要对数据进行简单的处理,这里选择两个城市:成都和天津。

成都

import pandas as pd

# 将2019年成都空气质量数据作为测试集
df = pd.read_csv('2019年成都空气质量数据.csv')
# 取质量等级  AQI指数  当天AQI排名  PM2.5 。。。8列数据
# SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 解决方法
df1 = df[['AQI指数', '当天AQI排名', 'PM2.5', 'PM10', 'So2', 'No2', 'Co', 'O3']].copy()

air_quality = []
# print(df['质量等级'].value_counts())
# 质量等级列数据为字符串  转为为标签  便于判断预测
for i in df['质量等级']:
    if i == "优":
        air_quality.append('1')
    elif i == "良":
        air_quality.append('2')
    elif i == "轻度污染":
        air_quality.append('3')
    elif i == "中度污染":
        air_quality.append('4')
    elif i == "重度污染":
        air_quality.append('5')
 elif i == "严重污染":
        air_quality.append('6')

print(air_quality)
df1['空气质量'] = air_quality

# 将数据写入test.txt
# print(df1.values, type(df1.values)) # <class 'numpy.ndarray'>
with open('test.txt', 'w') as f:
    for x in df1.values:
        print(x)
        s = ','.join([str(i) for i in x])
        # print(s, type(s))
        f.write(s + '\n')

天津

import pandas as pd

# 自定义其他几个城市空气质量数据作为训练集
df = pd.read_csv('2019年天津空气质量数据.csv', encoding='utf-8')
# 取质量等级  AQI指数  当天AQI排名  PM2.5 。。。8列数据
# SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 解决方法
df1 = df[['AQI指数', '当天AQI排名', 'PM2.5', 'PM10', 'So2', 'No2', 'Co', 'O3']].copy()

air_quality = []
# print(df['质量等级'].value_counts())
# 质量等级列数据为字符串  转为为数字标识
for i in df['质量等级']:
    if i == "优":
        air_quality.append('1')
    elif i == "良":
        air_quality.append('2')
    elif i == "轻度污染":
        air_quality.append('3')
    elif i == "中度污染":
        air_quality.append('4')
    elif i == "重度污染":
        air_quality.append('5')
    elif i == "严重污染":
        air_quality.append('6')

print(air_quality)
df1['空气质量'] = air_quality

# 将数据写入追加写入到train.txt
# print(df1.values, type(df1.values)) # <class 'numpy.ndarray'>
with open('train.txt', 'a+') as f:
    for x in df1.values:
        print(x)
        s = ','.join([str(i) for i in x])
        # print(s, type(s))
        f.write(s + '\n')

3. 实现KNN算法

读取数据集

def read_dataset(filename1, filename2, trainingSet, testSet):
      with open(filename1, 'r') as csvfile:
          lines = csv.reader(csvfile)  # 读取所有的行
          dataset1 = list(lines)       # 转化成列表
          for x in range(len(dataset1)):  # 每一行数据
              for y in range(8):
                  dataset1[x][y] = float(dataset1[x][y])   # 8个参数转换为浮点数
              testSet.append(dataset1[x])    # 生成测试集

      with open(filename2, 'r') as csvfile:
          lines = csv.reader(csvfile)  # 读取所有的行
          dataset2 = list(lines)       # 转化成列表
          for x in range(len(dataset2)):   # 每一行数据
              for y in range(8):
                  dataset2[x][y] = float(dataset2[x][y])  # 8个参数转换为浮点数
              trainingSet.append(dataset2[x])  # 生成训练集

计算欧氏距离

def calculateDistance(testdata, traindata, length):  # 计算距离
      distance = 0  # length表示维度 数据共有几维
      for x in range(length):
          distance += pow((int(testdata[x]) - int(traindata[x])), 2)
      return round(math.sqrt(distance), 3)    # 保留3位小数

找K个相邻最近的邻居

def getNeighbors(self, trainingSet, test_instance, k):  # 返回最近的k个边距
      distances = []
      length = len(test_instance)
      # 对训练集的每一个数计算其到测试集的实际距离
      for x in range(len(trainingSet)):
          dist = self.calculateDistance(test_instance, trainingSet[x], length)
          print('训练集:{} --- 距离:{}'.format(trainingSet[x], dist))
          distances.append((trainingSet[x], dist))
      distances.sort(key=operator.itemgetter(1))  # 按距离从小到大排列
      # print(distances)
      neighbors = []
      # 排序完成后取距离最小的前k个
      for x in range(k):
          neighbors.append(distances[x][0])
      print(neighbors)
      return neighbors

计算比例最大的分类

def getResponse(neighbors):   # 根据少数服从多数,决定归类到哪一类
      class_votes = {}
      for x in range(len(neighbors)):
          response = neighbors[x][-1]  # 统计每一个分类的多少  空气质量的数字标识
          if response in class_votes:
              class_votes[response] += 1
          else:
              class_votes[response] = 1
      print(class_votes.items())
      sortedVotes = sorted(class_votes.items(), key=operator.itemgetter(1), reverse=True)  # 按分类大小排序  降序
      return sortedVotes[0][0]    # 分类最大的  少数服从多数   为预测结果

预测准确率计算

def getAccuracy(test_set, predictions):
      correct = 0
      for x in range(len(test_set)):
          # predictions预测的与testset实际的比对  计算预测的准确率
          if test_set[x][-1] == predictions[x]:
              correct += 1
          else:
              # 查看错误预测
              print(test_set[x], predictions[x])

      print('有{}个预测正确,共有{}个测试数据'.format(correct, len(test_set)))
      return (correct / (len(test_set))) * 100.0

run函数调用

def run(self):
    training_set = []    # 训练集
    test_set = []        # 测试集
    self.read_dataset('./train_4/test.txt', './train_4/train.txt', training_set, test_set)  # 数据划分
    print('Train set: ' + str(len(training_set)))
    print('Test set: ' + str(len(test_set)))
    # generate predictions
    predictions = []
    k = 7  # 取最近的6个数据
    for x in range(len(test_set)):  # 对所有的测试集进行测试
        neighbors = self.getNeighbors(training_set, test_set[x], k)  # 找到8个最近的邻居
        result = self.getResponse(neighbors)  # 找这7个邻居归类到哪一类
        predictions.append(result)

    accuracy = self.getAccuracy(test_set, predictions)
    print('预测准确度为:  {:.2f}%'.format(accuracy))   # 保留2位小数

运行效果如下:

可以通过增加训练集城市空气质量数据量,调节找邻居的数量k,提高预测准确率。

文末福利

各位猿们,还在为记不住API发愁吗,哈哈哈,最近发现了国外大师整理了一份Python代码速查表和Pycharm快捷键sheet,火爆国外,这里分享给大家。

这个是一份Python代码速查表

下面的宝藏图片是2张(windows && Mac)高清的PyCharm快捷键一览图

怎样获取呢?可以添加我们的AI派团队的Beyonce小姐姐

一定要备注【高清图】哦

????????????????????

➕我们的Beyonce小姐姐微信要记得备注【高清图】哦

来都来了,喜欢的话就请分享、点赞、在看三连再走吧~~~

机器学习 手写KNN算法预测城市空气质量 机器学习 KNN算法分析与预测城市空气质量 阅读详情

相关推荐

【数据挖掘】基于Stacking机器学习混合模型的空气质量预测

在空气质量预测中,我们可以使用多种基模型,如线性回归、决策树、神经网络等,将它们的预测结果进行融合,以得到更加准确的预测结果。总的来说,基于Stacking机器学习混合模型的空气质量预测是一种高效而准确的方法,可以提高预测的精度,并为人们的健康保护提供有力的支持。模型评估:最后对模型进行评估,根据评估指标来选择最优的基模型和次级模型,并用测试数据集来验证模型的性能。构建次级模型:将每个基模型的输出结果作为次级模型的输入,再进行训练和交叉验证,以得到最终的预测结果。

Fanjufei的博客 781

KNN算法及KNN的优化算法-加权KNN

KNN及加权KNN优化算法 深度学习的常规套路: 1.收集数据并给定标签 2.训练一个分类器 3.测试,评估 K-近邻(KNN)算法: 对于未知类别属性数据集中的点: 1.计算已知类别数据集中的点与当前点的距离 2.按照距离依次排序 3.选取与当前点距离最小的K个点 4.确定前K个点所在类别的出现概率 5.返回前K个点出现频率最高的类别作为当前点预测分类。 KNN算法:不需要使用训...

sjyttkl的专栏 1万+

空气质量预测 | Python实现基于SVR支持向量机回归的空气质量预测模型(Air Quality Prediction)

空气质量预测 | Python实现基于SVR支持向量机回归的空气质量预测模型(Air Quality Prediction)

天天酷科研的博客 788

优化KNN算法

读者可看此文章,为复现的knn算法python实现KNN算法_AGuiRong的博客-优快云博客该文章为针对复现的knn算法进行优化。对KNN算法采取了10折运算原理,在给定的参数范围内选取最优参数值,并给出了可视化效果。

aouiylfjh的博客 2677

纽约空气质量指数预测:机器学习技术应用指南

htmltable {th, td {th {pre {简介:纽约市的空气质量预测利用了多种先进的机器学习算法,包括线性回归、套索回归、决策树回归器、KNN回归器、RandomForestRegressor以及Xgboost回归器。这些方法通过考虑温度、湿度、风速等环境因素对空气质量指数(AQI)的影响,帮助科学家和工程师们有效地预测未来的空气质量。文章详细介绍了每种模型的工作原理和应用,以及在模型构建过程中必须考虑的数据预处理、特征工程和模型调参等关键步骤。

weixin_42348783的博客 1131

北京市空气质量数据csv格式

中文乱码请在excel中数据选项下用csv格式打开

机器学习KNN算法实践:预测城市空气质量

出品:Python数据之道作者:叶庭云整理:Lemon机器学习KNN算法实践预测城市空气质量「Python数据之道」导读: 之前在公众号上分享过 “图解KNN算法” 的内容(点击下面链接...

Python数据之道 9688

Comsol超声空化气泡仿真:从基础理论到工业应用实践

本文详细介绍了Comsol超声空化气泡仿真的基础理论及工业应用实践。通过解析超声空化现象、Comsol模型搭建流程及求解器优化技巧,帮助工程师掌握气泡仿真技术,提升超声波清洗和乳液制备等工业应用的效率与质量。

weixin_27966471的博客 253

机器学习 城市空气质量AQI的分析与预测

本文针对江西省南昌市2022年空气质量问题,采用各种机器学习算法实现其分类、知识、预测等。文中采用了基于SVM的图像分类或归类、深度学习模型LSTM、KNN算法、决策树、随机森林和线性回归分析等方法,对南昌市空气质量进行了研究和预测,并综合分析了各种算法的优缺点和适用性,为南昌市及相关决策部门提供了有效的参考建议。

xqmids99的博客 1万+

Unity UI适配实战:从Canvas Scaler到主流游戏适配方案解析

本文深入解析Unity UI适配的核心技术,重点介绍Canvas Scaler组件的关键参数如Reference Resolution和Screen Match Mode,并提供主流游戏适配方案实战分析。通过九宫格拉伸、动态调整等技巧,帮助开发者解决多设备适配难题,提升游戏UI在不同分辨率下的表现。

weixin_29001419的博客 975

opencv简单小项目

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。要开始一个OpenCV项目,你需要安装OpenCV库,这通常可以通过Python的pip包管理器完成。替换为你要加载的图像的实际路径。这个例子展示了OpenCV项目的基本结构,你可以在此基础上添加更多的图像处理功能。如果你需要更详细的指导或代码示例,请告诉我你的具体需求。

youyouxiong的博客 972

干货!如何用 Python+KNN 算法实现城市空气质量分析与预测?

作者 |李秋键责编 | 伍杏玲封图 | 优快云 付费下载自东方 IC出品 | 优快云(ID:优快云news)随着中国工业和科技的发展,中国的一些发达城市的空气质量问题变得越来越严...

优快云资讯 9988

基于ESP32-C3的便携式血氧仪硬件与算法实现

血氧饱和度(SpO₂)监测是生理参数无创检测的核心技术之一,其原理基于光电容积脉搏波(PPG)信号中红光与红外光吸收比值的动态变化。该技术依赖高精度模拟前端、稳定光学激励及实时数字信号处理能力,在消费级健康设备中面临功耗、体积与测量鲁棒性的多重约束。ESP32-C3凭借集成LEDC、12位ADC与低功耗双核架构,成为PPG终端的理想主控平台;结合定制化指夹式光学探头与比率法血氧算法,可实现非诊断级但趋势可靠的日常健康监测。本文围绕硬件电路设计、电源管理策略与嵌入式信号处理流程展开,覆盖从LED驱动、跨阻放大

weixin_29025501的博客 132

Python+KNN 算法怎么实现城市空气质量分析与预测?看我用代码怎么解决

随着中国工业和科技的发展,中国的一些发达城市的空气质量问题变得越来越严重,其中最为严重的便是PM2.5带来的恶劣环境问题。 本文在根据网络公开空气质量数据的基础上进行爬取相关数据,主要针对环境较为恶劣的城市,天津、北京、广州等几个城市,尤其是针对天津的质量数据进行对比分析。在分析的基础上得出空气质量变化情况,提出一些意见。并借助机器学习算法根据数据预测空气质量,以达到分析预测的典型大数据分析模式效果。 整体分析的流程图如下: 实验前的准备 1.1 数据获取 我们这里所得到的数据来源于网络.

m0_49079037的博客 1703

MySQL数据库面试题(2022版)

序列号 内容 链接 1 Java基础知识面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124023797 2 Java集合容器面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124043363 3 Java异常面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124....

拉格朗日的学习笔记 1万+

图像处理:张量分解在图像处理领域的应用

随着计算机视觉和图像处理技术的快速发展,图像数据呈现出高维、多模态、海量等特点。传统的矩阵分解方法已经无法有效处理这些复杂的图像数据。张量分解作为一种高阶矩阵分解方法,可以很好地捕捉图像数据的高维结构信息,在图像处理领域展现出巨大的应用前景。本节介绍几种常用的张量分解算法,包括高阶SVD(HOSVD)、Tucker-ALS、CP-ALS等。这些算法的核心思想是通过迭代优化的方式,交替更新张量分解的因子矩阵,直到收敛为止。综上所述,本文系统地介绍了张量分解技术在图像处理领域的应用。

AI天才研究院 7105

knn算法python代码_干货!如何用 Python+KNN 算法实现城市空气质量分析与预测?

作者 |李秋键责编 | 伍杏玲封图 | 优快云 付费下载自东方 IC出品 | 优快云(ID:优快云news)随着中国工业和科技的发展,中国的一些发达城市的空气质量问题变得越来越严重,其中最为严重的便是PM2.5带来的恶劣环境问题。本文在根据网络公开空气质量数据的基础上进行爬取相关数据,主要针对环境较为恶劣的城市,天津、北京、广州等几个城市,尤其是针对天津的质量数据进行对比分析。在...

weixin_39910043的博客 604

晶闸管选型参数,结构原理,工艺与注意问题总结

闸管(Thyristor)是一种半导体开关器件,也被称为可控硅整流器(SCR, Silicon Controlled Rectifier)。它可以在高电压和大电流条件下工作,常被用于交流电的控制和整流。本文对晶闸管的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 1286

智慧城市的空气质量监测:保护人类健康的关键

1.背景介绍 空气质量监测对于人类的生存和发展具有重要的意义。随着城市化进程的加快,人类生活的空间越来越小,城市空气污染问题日益严重。智慧城市的发展为空气质量监测提供了有力支持,通过大数据技术、人工智能算法和互联网技术,实现了对空气质量的实时监测、预测和控制。 1.1 空气质量监测的重要性 空气质量对人类的生活和健康具有重要的影响。长期曝露于污染空气,可能导致呼吸系统疾病、心血管疾病、智能病...

AI天才研究院 1527

SY6982C 7.4V锂电池1A充电模块原理图设计,已量产

在手持设备、便携工具与小型无人机等场景中,7.4V(2S)锂聚合物电池的应用愈发广泛。这类电池对充电系统的安全性、效率与兼容性提出了明确要求:需支持 USB 5V 输入、1A 安全充电,同时具备多重保护机制。本文将结合一款基于 SY6982C 的充电原理图,深入解析其电路设计与技术亮点。

不脱发的程序猿 365

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

机器学习 KNN算法实践

作者 | 叶庭云来源 | 修炼Python头图 | 下载于视觉中国KNN算法简介KNN(K-Nearest Neighbor)最邻近分类算法是数据挖掘分类(classification)技...

AI科技大本营 1282

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: Python 荣登 TIOBE 2020 年度编程语言
下一篇: Python 高效提取 HTML 文本的方法
Wang_AI
博客等级 码龄12年 996粉丝 162原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值