GEE实战 | 4种非监督分类算法深度解析,附可直接运行的完整代码

在遥感影像处理领域,非监督分类凭借其无需人工标注样本的优势,成为快速了解地物分布的得力助手。它能自动依据像素光谱特征的相似性完成聚类,这种“无师自通”的特性,让地理空间分析变得更加高效。

今天,我们就来深入探讨如何在Google Earth Engine(GEE)中实现4种经典的非监督分类算法。从基础原理到具体代码实现,再到结果分析,全方位为你讲解,文中案例均可直接运行,参数也能灵活调整,非常适合新手入门学习。

一、GEE非监督分类基础认知

1. 非监督分类的核心概念

非监督分类是一种无标签的机器学习方法,它的核心原理是让算法自主去发现影像中像素之间的内在联系。简单来说,就是把具有相似光谱特征的像素归为同一类别,而这个过程不需要我们提前告诉计算机“这是耕地”“那是建筑”。

2. 为什么选择GEE进行非监督分类?

GEE作为一个强大的云平台,为非监督分类提供了诸多便利:

  • 拥有海量的遥感影像数据,无需我们自己费力去收集和预处理数据。
  • 集成了多种成熟的聚类算法,省去了我们自己编写复杂算法的麻烦。
  • 具备强大的计算能力,能快速处理大规模的遥感影像数据。

3. 非监督分类的核心优势

  • 节省时间成本:不需要人工标注大量样本,大大减少了前期准备工作的时间。
  • 快速探索未知区域:对于我们不熟悉的区域,能快速了解其地物分布规律。
  • 适合大规模处理:可以高效地对大范围的遥感影像进行自动化分类。

二、实战案例:旧金山湾区土地覆盖分类

本次实战案例以旧金山湾区为研究区域,采用Landsat 8影像作为数据源,通过4种不同的非监督分类算法,对该区域的土地覆盖情况进行分类,并对比分析它们的效果。

1. 数据准备详情

研究区域:旧金山湾区,其地理坐标范围为(-122.6, 37.4, -122.2, 37.8)。这个区域地物类型丰富,包含了城市建筑、植被、水体、裸地等多种类型,非常适合作为分类案例的研究区域。

数据源:选用Landsat 8 TOA反射率数据,时间范围为2023年6月1日至2023年9月1日。选择这个时间段的数据,是因为此时段该区域天气相对晴朗,云量较少,能保证影像的质量。

特征波段选择:选取了B4(红波段)、B3(绿波段)、B2(蓝波段)、B5(近红外波段)、B6(短波红外1波段)、B7(短波红外2波段)这6个波段作为分类特征。这些波段能较好地反映不同地物的光谱特性,比如近红外波段对植被的反射率较高,能很好地区分植被和其他地物。

样本量确定:生成5000个随机采样点作为训练样本。样本量的多少会影响分类结果的准确性,过少的样本可能无法充分反映地物的特征,过多的样本则会增加计算量,5000个样本在保证分类效果的同时,也能兼顾计算效率。

// 定义研究区域
var region = ee.Geometry.Rectangle({coords: [-122.6, 37.4, -122.2, 37.8],proj: 'EPSG:4326'
});// 加载影像并筛选
var image = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA').filterBounds(region)  // 筛选出研究区域内的影像.filterDate('2023-06-01', '2023-09-01')  // 筛选出指定时间范围内的影像.sort('CLOUD_COVER')  // 按照云量排序.first()  // 选取云量最少的影像.clip(region);  // 裁剪出研究区域// 选择特征波段
var bands = ['B4', 'B3', 'B2', 'B5', 'B6', 'B7'];
var input = image.select(bands);// 生成训练样本
var training = input.sample({region: region,  // 采样区域scale: 30,  // 采样尺度,与Landsat 8影像分辨率一致numPixels: 5000,  // 采样数量seed: 42,  // 随机种子,保证结果可重复tileScale: 4  // 提高采样效率
});

2. 4种算法实现与深度对比

(1)K-Means算法

算法原理:K-Means算法是一种经典的聚类算法,它首先随机选择k个初始聚类中心,然后将每个样本分配到距离最近的聚类中心所在的类别中,接着重新计算每个类别的聚类中心,重复这个过程,直到聚类中心不再发生明显变化。

特点:作为经典的聚类算法,它需要我们预先设定聚类数量,计算速度相对较快。

核心参数详解

  • nClusters:聚类数,这个参数需要我们根据研究目标和地物类型的复杂程度来设定。
  • init:初始化方式,选择1表示使用k-means++优化初始化,这种方式能使初始聚类中心的分布更加合理,提高分类效果。
  • seed:随机种子,保证每次运行结果的一致性。
var kmeans = ee.Clusterer.wekaKMeans({nClusters: 4,  // 预设4类,可根据实际情况调整init: 1,       // 采用k-means++优化初始化seed: 42
}).train(training, bands);  // 用训练样本和特征波段训练聚类器
var kmeansResult = input.cluster(kmeans);  // 对输入影像进行分类

分类效果分析:分类结果的边界清晰,能较好地将不同地物区分开来。非常适合已知目标类别数量的场景,比如在进行固定类型的土地利用分类时,我们可以根据经验设定合适的聚类数,得到理想的分类结果。

(2)X-Means算法

算法原理:X-Means算法是K-Means算法的扩展,它在K-Means的基础上,通过贝叶斯信息准则(BIC)来自动确定最优的聚类数量。它先从较少的聚类数开始,然后不断尝试分裂聚类,判断分裂后的结果是否更优,直到找到最优的聚类数量。

特点:作为K-Means的扩展算法,它最大的优势是可以自动确定最优聚类数量,不需要我们手动去尝试和调整。

核心参数详解

  • minClusters:最小聚类数,设定聚类数量的下限。
  • maxClusters:最大聚类数,设定聚类数量的上限。
  • useKD:是否启用KDTree加速计算,启用后能提高算法处理高维数据的效率。
  • seed:随机种子,保证结果的可重复性。
var xmeans = ee.Clusterer.wekaXMeans({minClusters: 2,  // 最小聚类数为2maxClusters: 6,  // 最大聚类数为6useKD: true,  // 启用KDTree加速计算seed: 42
}).train(training, bands);  // 训练聚类器
var xmeansResult = input.cluster(xmeans);  // 进行分类

分类效果分析:由于能自动确定聚类数量,它的分类结果能更好地适应数据的分布特征。适合进行探索性分析,当我们对研究区域的地物类型不太了解时,使用X-Means算法可以快速得到较为合理的分类结果。

(3)级联K-Means算法

算法原理:级联K-Means算法通过多轮迭代和多次重启来寻找全局最优解。它在每一轮迭代中都会尝试不同的初始聚类中心,通过多次重启,避免算法陷入局部最优解,从而提高分类结果的稳定性和准确性。

特点:该算法通过多轮迭代优化,多次重启寻找全局最优解,得到的结果稳定性高,抗噪声能力强。

核心参数详解

  • minClusters:最小聚类数。
  • maxClusters:最大聚类数。
  • manual:是否手动选择聚类数,设为false表示自动选择。
  • restarts:重启次数,重启次数越多,找到最优解的可能性越大,但计算时间也会相应增加。
  • init:是否使用优化的初始化方式。
  • distanceFunction:距离函数,这里选择欧几里得距离。
var cascadeKmeans = ee.Clusterer.wekaCascadeKMeans({minClusters: 2,maxClusters: 6,manual: false,  // 自动选择聚类数restarts: 10,  // 10次重启优化,可根据计算资源调整init: true,distanceFunction: "Euclidean"  // 使用欧几里得距离
}).train(training, bands);  // 训练聚类器
var cascadeResult = input.cluster(cascadeKmeans);  // 进行分类

分类效果分析:分类结果的稳定性高,对于影像中存在的噪声点有较强的抵抗能力。适合对分类精度要求较高的场景,比如在进行土地利用变化监测时,需要分类结果具有较高的一致性和准确性,级联K-Means算法就能满足这样的需求。

(4)Cobweb算法

算法原理:Cobweb算法是一种增量式聚类算法,它通过构建分类层次结构来对数据进行聚类。在处理数据的过程中,它会不断地调整分类结构,当新的数据进来时,会判断其与现有类别之间的关系,决定是将其归入现有类别,还是创建新的类别。

特点:作为增量式聚类算法,它可以生成层次化的分类结构,能很好地反映类别之间的层次关系。

核心参数详解

  • acuity:敏锐度,值越小,算法对数据中的细微差异越敏感,越容易区分不同的类别。
  • cutoff:新类创建阈值,值越小,越容易创建新的类别。
  • seed:随机种子,保证结果的可重复性。
var cobweb = ee.Clusterer.wekaCobweb({acuity: 0.1,    // 降低阈值,提高对差异的敏感度cutoff: 0.0001, // 降低新类创建门槛,使算法更容易生成新类seed: 42
}).train(training, bands);  // 训练聚类器
var cobwebResult = input.cluster(cobweb);  // 进行分类

分类效果分析:分类结果呈现出类别间的层次关系,能很好地反映地物的嵌套结构。比如在分析城市-郊区-农村的梯度变化时,Cobweb算法可以清晰地展示出这种层次关系,帮助我们更好地理解地物的空间分布规律。

3. 结果可视化代码详解

// 真彩色影像显示
Map.addLayer(image, {bands: ['B4', 'B3', 'B2'], min: 0, max: 0.3}, '真彩色影像'); 
// 这里设置了红、绿、蓝三个波段,以及显示的最小值和最大值,使影像能以真彩色显示,方便我们直观地观察研究区域的地物情况// 分类结果添加到地图
Map.addLayer(kmeansResult, {min:0, max:3, palette: ['#0000FF','#00FF00','#FF0000','#FFFF00']}, 'K-Means分类');
// 为K-Means分类结果设置了颜色 palette,每个颜色代表一个类别,min和max对应聚类数的范围Map.addLayer(xmeansResult, {min:0, max:5, palette: ['#FF5733','#33FF57','#3357FF','#F3FF33','#FF33F3','#33FFF3']}, 'X-Means分类');
Map.addLayer(cascadeResult, {min:0, max:5, palette: ['#8B4513','#228B22','#87CEFA','#FFD700','#FF6347','#9370DB']}, '级联K-Means分类');
Map.addLayer(cobwebResult, {min:0, max:11, palette: ['#FFA500','#008000','#000080','#800080','#00FFFF','#FF0000','#808080','#FFFF00','#00FF00','#0000FF','#FF00FF','#C0C0C0']}, 'Cobweb分类');

结果展示:
真彩色影像
在这里插入图片描述

K-means
在这里插入图片描述

X-mean
在这里插入图片描述

级联K-means
在这里插入图片描述

CobWeb
在这里插入图片描述

三、完整代码获取与详细使用指南

1. 代码使用步骤

  1. 打开GEE编辑器:在浏览器中输入code.earthengine.google.com,进入GEE代码编辑器页面。
  2. 复制代码:将本文提供的完整代码复制到编辑器中。
  3. 运行代码:点击编辑器上方的“Run”按钮,等待代码运行完成,地图会加载出分类结果。
  4. 查看结果:在地图窗口可以切换不同的分类结果图层进行查看,控制台会显示聚类数量统计等信息,帮助我们评估分类效果。
  5. 导出结果:如果需要保存分类结果,在左侧的“Tasks”面板中找到对应的导出任务,点击“Run”按钮,按照提示设置导出参数,即可将结果导出到Google Drive中。

2. 参数调节详细建议

(以下为基础参考值,实际应用中需根据具体数据特征进行调整)

  • 样本量:一般建议在3000-10000个像素之间。当研究区域的数据量较大时,可以适当减小样本量,以提高计算速度;当数据量较小时,可增加样本量,保证分类的准确性。
  • 聚类数量:对于土地利用分类,建议设置5-10类;如果需要进行更精细的分类,比如区分不同种类的植被,可以适当增加聚类数量。
  • Cobweb参数acuity的取值范围建议在0.1-1之间,cutoff的取值范围建议在0.0001-0.01之间。这两个参数值越小,分类结果越精细,但也可能会导致过度分类。
  • 波段选择:除了本文选用的波段外,还可以添加NDVI(归一化植被指数)、NDBI(归一化建筑指数)等指数作为特征波段,这些指数能增强不同地物之间的差异,提高分类效果。

四、注意事项与常见问题解决

1. 研究区域更换

如果要将案例应用到其他区域,需要修改region的坐标值。可以通过GEE编辑器中的绘图工具,绘制新的研究区域,然后获取其坐标范围进行修改。

2. 数据源更换

当使用不同传感器的数据(如Sentinel-2)时,需要对应调整bands参数。不同传感器的波段设置不同,要选择适合分类的波段。例如,Sentinel-2的波段更多,分辨率更高,可以根据研究需求选择合适的波段。

3. 分类结果解读

聚类结果的颜色只是为了区分不同的类别,并不代表实际的地物类型。在解读分类结果时,需要结合实地调研数据、高分辨率影像等进行验证,才能准确判断每个类别对应的地物类型。

4. 分类效果提升

在复杂的场景中,仅依靠光谱特征可能无法得到理想的分类结果。此时,可以考虑增加纹理特征(如均值、方差等)或多时相数据。纹理特征能反映地物的空间结构信息,多时相数据能反映地物的动态变化,这些都能帮助提高分类的精度。

通过对这4种算法的分类结果进行对比,我们可以根据不同的研究目标选择合适的算法:如果追求分类效率,K-Means算法是不错的选择;如果需要探索未知区域的地物分布,X-Means算法能自动确定聚类数量,非常方便;如果对分类结果的稳定性要求较高,级联K-Means算法更合适;如果要分析地物的层次关系,Cobweb算法能满足需求。

在实际应用中,建议先通过非监督分类对研究区域的数据规律进行探索,了解地物的大致分布情况,然后结合少量的样本进行监督分类优化,这样既能提高分析效率,又能保证分类精度。希望本文能帮助你更好地掌握GEE中的非监督分类方法,为你的地理空间分析工作提供有力支持。

若您认为本文的技术方法对研究或实践有参考价值,欢迎关注并推荐给更多从事遥感应用的同行,以便共同交流完善相关技术体系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91947.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于落霞归雁思维框架的软件需求管理实践指南

作者:落霞归雁 日期:2025-08-02 摘要 在 VUCA 时代,需求变更成本已占软件总成本的 40% 以上。本文将“落霞归雁”思维框架(观察现象 → 找规律 → 应用规律 → 实践验证)引入需求工程全生命周期,通过 4 个阶…

企业级AI Agent构建实践:从理论到落地的完整指南

🚀 引言 随着人工智能技术的快速发展,AI应用正在从简单的工具转变为智能伙伴。企业级AI Agent作为这一变革的核心载体,正在重新定义我们与软件系统的交互方式。本文将深入探讨如何构建一个真正意义上的企业级AI Agent系统。 🎯 …

电商项目_性能优化_限流-降级-熔断

针对电商系统,在遇到大流量时,必须要考虑如何保障系统的稳定运行,常用的手段:限流,降级,拒绝服务。 一、限流 限流算法:计数器、滑动窗口、漏铜算法、令牌桶算法。 限流的方案 前端限流接入…

javaweb开发之Servlet笔记

第五章 Servlet 一 Servlet简介 1.1 动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源,在程序运行之前就写好的资源. 例如:html css js img ,音频文件和视频文件 动态资源 需要在程序运行时通过代码运行生成的资源,在程序运行之前无法确定的数据,运行时…

sqli-labs靶场less26/a

less261.我们打开这一关来看一下,他提示我们空格和其他一些什么都被过滤了2.我们来尝试绕过,按照之前的做法,可以看到闭合方式为单引号,并且过滤了--与#3.我们来尝试绕过一下,发现可以以下的方式绕过,空格用&#xff0…

从Docker衔接到导入黑马商城以及前端登录显示用户或密码错误的相关总结(个人理解,仅供参考)

目录 一、前言 二、从Docker衔接到导入黑马点评 三、谈谈端口映射及我的前端登录显示用户或密码错误 四、总结 一、前言 在学习24黑马SpringCloud课程时,说实话Docker那一块再到导入黑马商城是真的有点折磨,个人感觉老师水平还是很强的,但…

控制建模matlab练习10:滞后补偿器

此练习主要是:关于滞后补偿器。 ①滞后补偿器作用; ②不同滞后补偿器的效果; 一、为什么使用滞后补偿器 滞后补偿器:主要用于改善系统的稳态误差;滞后补偿器设计思路:同时为系统增加一个极点和零点&#xf…

力扣-108.将有序数组转换为二叉搜索树

题目链接 108.将有序数组转换为二叉搜索树 class Solution {public TreeNode Traverse(int[] nums, int begin, int end) {if (end < begin)return null;int mid (begin end) / 2;TreeNode root new TreeNode(nums[mid]);root.left Traverse(nums, begin, mid - 1);ro…

`npm error code CERT_HAS_EXPIRED‘ 问题

问题: npm error code CERT_HAS_EXPIRED npm error errno CERT_HAS_EXPIRED npm error request to https://r2.cnpmjs.org/string_decoder/-/string_decoder-1.3.0.tgz failed, reason: certificate has expired npm error A complete log of this run can be found in: /home…

数据结构---概念、数据与数据之间的关系(逻辑结构、物理结构)、基本功能、数据结构内容、单向链表(概念、对象、应用)

数据结构在数据结构部分&#xff0c;研究数据在内存中如何存储。数据存储的形式有两种&#xff1a;变量和数组&#xff08;数据结构的顺序表&#xff09;。一、什么是数据结构&#xff1f;数据类型被用来组织和存储数据。程序设计 数据结构 算法二、数据与数据之间的关系1、逻…

CMS框架漏洞

一、WordPress姿势一1.下载vulhub靶场cd /vulhub/wordpress/pwnscriptum docker-compose up -d2.我们进入后台&#xff0c;网址拼接/wp-admin/3.我们进入WP的模板写入一句话木马后门并访问其文件即可GetShell4然后我们拼接以下路径/wp-content/themes/twentyfifteen/404.php&am…

控制建模matlab练习07:比例积分控制-③PI控制器的应用

此练习主要是比例积分控制&#xff0c;包括三部分&#xff1a; ①系统建模&#xff1b; ②PI控制器&#xff1b; ③PI控制器的应用&#xff1b; 以下是&#xff0c;第③部分&#xff1a;PI控制器的应用。 一、比例积分控制的应用模型 1、整个系统是如图&#xff0c;这样一个单位…

【MySQL】MySQL 中的数据排序是怎么实现的?

MySQL 数据排序实现机制详解 MySQL 中的数据排序主要通过 ORDER BY 子句实现&#xff0c;其内部实现涉及多个优化技术和算法选择。让我们深入探讨 MySQL 排序的完整实现机制。 一、排序基础&#xff1a;ORDER BY 子句 基本语法&#xff1a; SELECT columns FROM table [WHERE c…

JVM-垃圾回收器与内存分配策略详解

1.如何判断对象已死1.1 对象引用的4种类型&#xff08;强软弱虚&#xff09;1.1.1 强引用特点&#xff1a;最常见的引用类型&#xff0c;只要强引用存在&#xff0c;对象绝不会被回收Object strongObj new Object(); // 强引用注意&#xff1a;集合类型&#xff0c;如果对象不…

新手向:简易Flask/Django个人博客

从零开始搭建个人博客:Flask与Django双版本指南 本文将详细讲解如何使用两种主流Python框架构建功能完整的个人博客系统。我们将从零开始,分别使用轻量级的Flask框架和功能全面的Django框架实现以下核心功能: 用户认证系统: 用户注册/登录/注销功能 密码加密存储 会话管理…

使用 Trea cn 设计 爬虫程序 so esay

使用 Trea cn 设计 爬虫程序 so esay 在现代数据驱动的时代&#xff0c;网络爬虫已成为数据采集的重要工具。传统的爬虫开发往往需要处理复杂的HTTP请求、HTML解析、URL处理等技术细节。而借助 Trea CN 这样的AI辅助开发工具&#xff0c;我们可以更高效地构建功能完善的爬虫程…

MySQL Redo Log

MySQL Redo Log MySQL主从复制&#xff1a;https://blog.csdn.net/a18792721831/article/details/146117935 MySQL Binlog&#xff1a;https://blog.csdn.net/a18792721831/article/details/146606305 MySQL General Log&#xff1a;https://blog.csdn.net/a18792721831/artic…

项目实战1:Rsync + Sersync 实现文件实时同步

项目实战&#xff1a;Rsync Sersync 实现文件实时同步 客户端中数据发生变化&#xff0c;同步到server端&#xff08;备份服务器&#xff09;。 Rsync&#xff1a;负责数据同步&#xff0c;部署在server端。 Sersync&#xff1a;负责监控数据目录变化&#xff0c;并调用rsync进…

Spring Boot 全 YAML 配置 Liquibase 教程

一、项目初始化配置 1.1 创建 Spring Boot 项目 通过 Spring Initializr 生成基础项目&#xff0c;配置如下&#xff1a; ​​Project​​: Maven​​Language​​: Java​​Spring Boot​​: 3.5.3&#xff08;最新稳定版&#xff09;​​Project Metadata​​: Group: com…

STM32-驱动OLED显示屏使用SPI(软件模拟时序)实现

本章概述思维导图&#xff1a;SPI通信协议SPI通信协议介绍SPI通讯&#xff1a;高速的、串行通讯、全双工、同步、总线协议&#xff1b;&#xff08;通过片选信号选中设备&#xff09;&#xff1b;注&#xff1a;SPI通讯通过片选信号选中设备&#xff0c;串口通讯通过端口号选中…