熵权法处理TIFF图像

一、熵权法

又称熵值法,是一种客观赋权法,根据各项指标观测值所提供的信息大小来确定指标权重,具体细节可以参阅Stata-熵值法(熵权法)计算实现。

二、原理

根据指标特性,可以用熵值判断某个指标的离散程度,熵值越小表示离散程度越大,因此该指标对综合评价的影响(权重)越大。假设现有 m 个样本与 n 个评价指标,则初始数据矩阵如下:

X = [ x 11 x 12 ⋯ x 1 n x 21 x 22 ⋯ x 2 n ⋮ ⋮ ⋱ ⋮ x m 1 x m 2 ⋯ x m n ] X=\begin{bmatrix} x_{11} & x_{12} & \cdots & x_{1n} \\ x_{21} & x_{22} & \cdots & x_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ x_{m1} & x_{m2} & \cdots & x_{mn} \end{bmatrix} X= x11x21xm1x12x22xm2x1nx2nxmn

对于某项指标 x j x_j xj ,不同样本之间的指标值 x i j x_{ij} xij 的差距越大,则该指标在综合评价中的作用越大,如果某项指标值全部相等,则再综合评价中不起作用。

三、流程

1. 预处理

对于 TIFF 文件,通常将无效值和背景值确定为某一个具体的数值(如 nan 或 -3.4028235e38),因此首先需要去除这些数值,防止对后续计算过程产生影响,代码中将其赋为 0 :

tmp[np.isclose(im_data, -3.4028235e38, atol=1e-6)] = 0
tmp[np.isnan(im_data)] = 0

2. 标准化

指标分为正向指标和负向指标,因此在标准化过程中,需要根据不同指标的特点进行处理,以保证后续的处理过程无需考虑正向或负向,可以使用一套代码执行,因此对于正向指标,标准化公式如下:

z i j = x i j − min ⁡ x j max ⁡ x j − min ⁡ x j z_{ij}=\frac{x_{ij}-\min x_j}{\max x_j-\min x_j} zij=maxxjminxjxijminxj

对于负向指标,标准化公式如下:

z i j = max ⁡ x j − x i j max ⁡ x j − min ⁡ x j z_{ij}=\frac{\max x_j-x_{ij}}{\max x_j-\min x_j} zij=maxxjminxjmaxxjxij

其中, z i j z_{ij} zij 表示标准化后第 i i i 个样本的第 j j j 个指标值。

3. 计算指标比重

计算第 j j j 个指标下第 i i i 个样本所占比重,公式如下:

p i j = z i j ∑ i = 1 m z i j p_{ij}=\frac{z_{ij}}{\sum_{i=1}^m z_{ij}} pij=i=1mzijzij

4. 计算熵值

计算第 j j j 个指标的熵值,公式如下:

e j = − k ∑ i = 1 m p i j ln ⁡ p i j e_j=-k\sum_{i=1}^m p_{ij}\ln p_{ij} ej=ki=1mpijlnpij

k = 1 ln ⁡ m k=\frac{1}{\ln m} k=lnm1

其中, k > 0 , e j > 0 k>0,e_j>0 k>0,ej>0 ,因此 0 ≤ e j ≤ 1 0\le e_j\le1 0ej1

5. 计算信息效用值

计算第 j j j 个指标的信息效用值:
d j = 1 − e j d_j=1-e_j dj=1ej

6. 计算各项指标权重

w j = d j ∑ i = 1 m d j w_j=\frac{d_j}{\sum_{i=1}^m d_j} wj=i=1mdjdj

7. 计算个样本综合得分

s i = ∑ i = 1 n w j × z i j s_i=\sum_{i=1}^n w_j\times z_{ij} si=i=1nwj×zij

四、Python 代码

# coding=utf-8
import osimport numpy as np
import pandas as pd
from osgeo import gdaldef read_img(filename):# 打开文件dataset = gdal.Open(filename)# 获取栅格数据的元信息im_width = dataset.RasterXSize  # 栅格矩阵的列数im_height = dataset.RasterYSize  # 栅格矩阵的行数im_bands = dataset.RasterCount  # 波段数im_geotrans = dataset.GetGeoTransform()  # 仿射矩阵,左上角像素的大地坐标和像素分辨率im_proj = dataset.GetProjection()  # 地图投影信息,字符串表示# 读取栅格数据到数组im_data = dataset.ReadAsArray(0, 0, im_width, im_height)# 返回元信息、投影、仿射矩阵和数据数组return im_proj, im_geotrans, im_datadef write_img(filename, im_proj, im_geotrans, im_data, driverName="GTiff"):# 判断栅格数据的数据类型if "int8" in im_data.dtype.name:datatype = gdal.GDT_Byteelif "int16" in im_data.dtype.name:datatype = gdal.GDT_UInt16else:datatype = gdal.GDT_Float32# 判读数组维数if len(im_data.shape) == 3:im_bands, im_height, im_width = im_data.shapeelse:im_bands, (im_height, im_width) = 1, im_data.shape# 创建文件driver = gdal.GetDriverByName(driverName)dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)# 写入仿射变换参数dataset.SetGeoTransform(im_geotrans)# 写入投影dataset.SetProjection(im_proj)# 写入数组数据if im_bands == 1:dataset.GetRasterBand(1).WriteArray(im_data)else:for i in range(im_bands):dataset.GetRasterBand(i + 1).WriteArray(im_data[i])def normalize_data(arr, name):"""数据归一化"""mode = {"GPP年变异系数": 0,"GPP年总值": 1,"干旱胁迫": 0,"供给服务": 1,"固碳释氧": 1,"洪涝灾害": 0,"景观多样性SHDI": 0,"景观连通度COHESION": 1,"景观破碎度ED": 0,"人口密度": 0,"人类干扰指数": 0,"水源涵养": 1,"土地垦殖系数": 0,"土壤保持": 1,}# 计算每一列的最小值和最大值min_values = arr.min()max_values = arr.max()if mode[name] == 1:# 计算正向指标normalized = (arr - min_values) / (max_values - min_values)else:# 计算负向指标normalized = (max_values - arr) / (max_values - min_values)return normalizeddef calculate_entropy(weights):"""计算信息熵"""# 防止出现对数运算中的零值,将小于等于零的值替换为一个很小的正数weights[weights <= 0] = 1e-10# 计算 mm = weights.shape[0]# 计算 kk = 1 / np.log(m)# 计算熵值entropy = []for j in range(weights.shape[1]):tmp = 0.0for i in range(m):tmp += weights[i][j] * np.log(weights[i][j])entropy.append((-k) * tmp)return entropydef calculate_weights(z):"""计算指标比重p"""# 计算每列的和column_sums = z.sum(axis=0)# 计算指标比重weights = z / column_sumsreturn weightsdef calculate_g(e):g = []for t in e:g.append(1 - t)return gdef calculate_w(g):sumG = sum(g)w = []for t in g:w.append(t / sumG)return wdef raster_index_by_sum():data_path = "D:/Download/数据/年份/"  # 数据路径csv_path = "D:/Download/数据/sum_entropies.csv"years = os.listdir(data_path)  # 获取年份文件夹集合sum = Nonefor year in years:files = os.listdir(data_path + year)  # 获取某一年份里的指标路径名df = pd.DataFrame(columns=files)index = []  # 指数im_proj, im_geotrans, im_data = read_img(data_path + year + "/" + files[0])  # 读取栅格数据tmp = np.ones_like(im_data, dtype=int)for file in files:im_proj, im_geotrans, im_data = read_img(data_path + year + "/" + file)  # 读取栅格数据tmp[np.isclose(im_data, -3.4028235e38, atol=1e-6)] = 0tmp[np.isnan(im_data)] = 0for file in files:im_proj, im_geotrans, im_data = read_img(data_path + year + "/" + file)  # 读取栅格数据im_data = im_data[tmp != 0]z = normalize_data(im_data.flatten(), file[4:-4])  # 数据标准化得到zindex.append(z)  # 存到一个数组里index = np.transpose(np.vstack(index))  ## 构造某一年份的栅格-指标矩阵p = calculate_weights(index)  # 计算指标比重e = calculate_entropy(p)  # 计算熵权if sum is None:sum = eelse:sum = [x + y for x, y in zip(sum, e)]g = calculate_g(sum)w = calculate_w(g)df.loc[len(df)] = wdf.to_csv(csv_path,index=False,sep=",",)def raster_index_by_years():data_path = "D:/Download/数据/年份/"  # 数据路径csv_path = "D:/Download/数据/years_entropies.csv"norm_path = "D:/Download/数据/归一化/"if not os.path.exists(data_path):os.mkdir(data_path)if not os.path.exists(csv_path):os.mkdir(csv_path)if not os.path.exists(norm_path):os.mkdir(norm_path)years = os.listdir(data_path)  # 获取年份文件夹集合for year in years:if not os.path.exists(norm_path + year):os.mkdir(norm_path + year)files = os.listdir(data_path + years[0])files = [file[4:-4] for file in files]df = pd.DataFrame(columns=files)im_proj, im_geotrans, im_data = read_img(data_path + years[0] + "/" + years[0] + files[0] + ".tif")  # 读取栅格数据tmp = np.ones_like(im_data, dtype=int)for year in years:for file in files:im_proj, im_geotrans, im_data = read_img(data_path + year + "/" + year + file + ".tif")  # 读取栅格数据tmp[np.isclose(im_data, -3.4028235e38, atol=1e-6)] = 0tmp[np.isnan(im_data)] = 0data = Nonefor year in years:index = []for file in files:im_proj, im_geotrans, im_data = read_img(data_path + year + "/" + year + file + ".tif")  # 读取栅格数据write_img(norm_path + year + '/' + year + file + '.tif', im_proj, im_geotrans, normalize_data(im_data, file))im_data = im_data[tmp != 0]z = normalize_data(im_data.flatten(), file)  # 数据标准化得到zindex.append(z)  # 存到一个数组里index = np.transpose(np.vstack(index))  ## 构造某一年份的栅格-指标矩阵if data is None:data = indexelse:data = np.concatenate((data, index), axis=0)p = calculate_weights(index)  # 计算指标比重e = calculate_entropy(p)  # 计算熵权g = calculate_g(e)w = calculate_w(g)df.loc[len(df)] = wdf.to_csv(csv_path,index=False,sep=",",)if __name__ == "__main__":# raster_index_by_sum()raster_index_by_years()

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

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

相关文章

40、排列数字

排列数字 题目描述 给定一个整数n&#xff0c;将数字1~n排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;请你按照字典序将所有的排列方法输出。 输入格式 共一行&#xff0c;包含一个整数n。 输出格式 按字典序输出所有排列方案&#xff0c;每个方案占一行…

一句话或一张图讲清楚系列之——ISERDESE2的原理

主要参考&#xff1a; https://blog.csdn.net/weixin_50810761/article/details/137383681 xilinx原语详解及仿真——ISERDESE2 作者&#xff1a;电路_fpga https://blog.csdn.net/weixin_45372778/article/details/122036112 Xilinx ISERDESE2应用笔记及仿真实操 作者&#x…

K8S Prometheus Springboot Actuator ServiceMonitor配置

用于展示Springboot Actuator监控内容 引入Springboot相关的监控配置包 Springboot pom配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><depende…

前端CSS基础7(背景相关属性,鼠标相关属性)

前端CSS基础7&#xff08;元素的背景相关属性&#xff0c;鼠标相关属性&#xff09; CSS背景相关属性CSS鼠标相关属性 CSS背景相关属性 在 CSS 中&#xff0c;可以使用多种属性来设置元素的背景样式。以下是一些常用的 CSS 背景相关属性&#xff1a; background-color&#x…

K8s: Ingress对象, 创建Ingress控制器, 创建Ingress资源并暴露服务

Ingress对象 1 &#xff09;概述 Ingress 是对集群中服务的外部访问进行管理的 API 对象&#xff0c;典型的访问方式是 HTTPIngress-nginx 本质是网关&#xff0c;当你请求 abc.com/service/a, Ingress 就把对应的地址转发给你&#xff0c;底层运行了一个 nginx但 K8s 为什么不…

F5应用及配置

F5网络公司的BIG-IP系列设备主要被应用于负载均衡&#xff0c;同时也提供应用交付网络功能。 以下是F5 BIG-IP配置和应用的一些要点&#xff1a; 管理接口&#xff1a;F5设备可以通过图形化界面或命令行界面进行配置和管理。图形化界面适合进行设备的基础以及高级调试&#x…

framework.jar如何导入到android studio中进行framework的开发+系统签名

framework的开发 生成framework.jar的方式 链接: framework.jar 生成 如何生成一个系统签名 链接: 生产系统签名 生成 platform.x509.pem、platform.pk8文件位置 生产系统签名 清单文件位置改变 <manifest xmlns:android"http://schemas.android.com/apk/res/a…

代码随想录算法训练营第6天 | 242. 有效的字母异位词 | 349. 两个数组的交集 | 202. 快乐数 | 1. 两数之和

242. 有效的字母异位词 题意 两个字符串中每个字符的出现次数是否一样 解 hash bool isAnagram(char* s, char* t) {int array[30];memset(array, 0, sizeof(int) * 30);for (int i 0; s[i] ! \0; i) {array[s[i] - a];}for (int i 0; t[i] ! \0; i) {array[t[i]-a]--;}…

modelsim波形高度异常,值为X

一、问题 波形高度异常&#xff0c;忽高忽低&#xff0c;正常波形高电平和低电平是统一高度的 timescale 1ns/1nsmodule key_test_tb();//parameter define parameter CLK_PERIOD 20; parameter CNT_MAX 25d25; //仅用于仿真,对应 500nsreg sys_clk; //周期 20ns reg d; wir…

刷代码随想录有感(43):遍历N叉树

题干&#xff1a;N叉树的前序遍历、后序遍历、层序遍历。 代码&#xff1a; class Node{//前序遍历N叉树&#xff08;递归实现&#xff09; public:int val;vector<Node*>children;Node(int _val, vector<Node*>_children): val(_val), children(_children){} };…

13.接口自动化学习-Pytest结合Yaml使用

问题&#xff1a;项目自动化测试脚本迭代出现变革技术方案 要求&#xff1a;测试用例从excel–变为yaml用例 注意事项&#xff1a; 1&#xff09;尽可能少改代码 2&#xff09;新技术方案yaml读取&#xff0c;尽可能写成一样的数据返回 [(请求体1,响应数据1),(请求体2,响应数据…

AR模块中通用对账的优化尝试

背景&#xff1a; 用户在唯品会下单后&#xff0c;是可以自由选择不同支付方式进行支付的&#xff0c;支付后&#xff0c;支付系统会将一笔收款单传送给AR&#xff0c;AR财务可以从此处看到收款情况。但是&#xff0c;真实的资金是按照不同支付方式&#xff0c;由银行或者其他渠…

ffmpeg初体验

一&#xff1a;安装 sudo yum install epel-release -y sudo yum update -ysudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpmyum -y install …

在 Oracle 数据库中使用正则表达式

在 Oracle 数据库中使用正则表达式 0. 引言1. 什么是正则表达式&#xff1f;2. Oracle 数据库正则表达式支持3. 用于正则表达式的 Oracle 数据库 SQL 函数4. 正则表达式中支持的元字符5. 构建正则表达式 0. 引言 本文介绍 Oracle 数据库的正则表达式支持。本文涵盖以下主题&am…

Unity构建详解(10)——Unity构建流程

【前言】 我们知道从源代码到可执行文件有四个步骤&#xff1a;预编译、编译、汇编、链接 预编译&#xff1a;处理源代码文件中的以“#”开始的各种预编译指令编译&#xff1a;通过语法语义分析等将源代码文件转为中间语言文件并进行优化&#xff0c;再生成汇编代码文件汇编&…

Vs Code npm install 报错解决方法

用的人家的前端框架发现是封装过的&#xff0c;要修改人家前端的话还得把前端源码放在Vs Code 上运行&#xff0c;后端放在IDEA上运行&#xff0c;然后前后端并行开发&#xff0c;在配置前端环境时遇到&#xff1a; npm install 这个的原因是我把node下载到D盘了权限不够框框爆…

android学习笔记(五)-MVP模式

1、MVP模式demo的实现&#xff0c;效果下&#xff1a; 2、创建一个Fruit类&#xff1a; package com.example.listview; //Fruit类就是Model&#xff0c;表示应用程序中的数据对象。 public class Fruit {private int imageId;private String name;private String price;publi…

代码随想录算法训练营Day6 | 242.有效的字母异位词 ●349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

基础&#xff1a; 1.哈希表是根据关键值进行直接访问的数据结构&#xff0c;时间复杂度是O(1)&#xff0c;也就是通过数组的索引下标&#xff0c;直接访问数组中的元素哈希表的作用就是用来快速判断一个元素是否出现在集合里。 2.常见的哈希结构&#xff1a; 数组set &#…

计算机视觉 | 交通信号灯状态的检测和识别

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目旨在使用计算机视觉技术检测交通信号灯的状态&#xff0c;主要针对红色和绿色信号灯的识别。通过分析输入图像中的像素颜色信息&#xff0c;利用OpenCV库实现对信号灯状态的检测和识别。 目录 一、项目背景 二、项目功能…

CalcPad(2) 单位设置和绘制图表

CalcPad(2) 单位设置和绘制图表 Hi uu们&#xff0c;CalcPad用的还好吗&#xff1f;有发现一些问题吗&#xff1f; 在我的使用中&#xff0c;经常需要指定一些计算结果的符号&#xff0c;比如说我希望ADC最小分辨率的计算结果是以uV展示&#xff0c;那我们该怎么操作呢&#…