哈儿小波分解和重构(降维和升维)实现算法

【0】README
0.1)本文旨在讲解 哈儿小波变换(分解和重构)进行数据的降维和升维;

【timestamp: 1703281610时隔几个月再来review 哈儿小波变换算法的具体思路:
1)分解降维:首先对所有item进行分解降维,求相邻维度的两个元素的和均值和差均值,如 array[0] 和 array[1]为一组,array[2]和array[3]为一组;分别存储在 array[i] array[i+span], 其中span=该当前分辨率下的 分辨率长度,如当前分辨率为resolution, 则 length=2^resolution;
2)item重构升维:当前分辨率为curResolution,则 
int span = (int) pow(2, curResolution);
for (int i = 0; i < span; i++) {temp[2*i] = rawitem[i] + rawitem[i+span];temp[2*i+1] = rawitem[i] - rawitem[i+span];
}
因为 rawitem[i] 和 rawitem[i+span]是 降维时的和均值和差均值;
3)质心重构升维: 只需要将较低分辨率下的质心扩展一倍,如
if(ClusterData.resolutionLength < ClusterData.dimension) {for (int j = ClusterData.resolutionLength-1; j >= 0 ; j--) {	ClusterData.centroid[i][2*j] = ClusterData.centroid[i][j];ClusterData.centroid[i][2*j+1] = ClusterData.centroid[i][j];}
}

【1】intro to 哈儿小波

1.1)定义:哈尔小波变换分为哈尔小波分解和重构。本文利用哈尔小波分解和哈尔小波重构分别对社交网络中的时间序列进行降维和升维操作,而分解降维和重构升维互为逆过程,这里以哈尔小波分解降维步骤为例进行说明。

1.2)哈尔小波分解(重构是其逆过程):可以被看作是一系列对离散时间函数的均值和差操作。本文计算离散函数f(t),即时间序列元素值的每两个相邻值间的均值和差。找出离散函数f(t)={9 7 3 5}的哈尔小波分解过程如下表所示:

分辨率

级别

分辨率

(维度)

均值

差值

哈尔小波

分解系数

降维后的

时序

全分辨率下的时序

2

4

{9,7,3,5}


{9,7,3,5}


{9,7,3,5}

1

2

{8,4}

{1,-1}

{8,4,1,-1}

{8,4}

{8,8,4,4}

0

1

{6}

{2}

{6,2,1,-1}

{6}

{6,6,6,6}

对上表的分析(Analysis):
A1)intro to 分辨率:哈儿小波分解和重构常应用于图像的降维和升维,这里的分辨率,你与可以理解为是图像的分辨率,分辨率越低,图像质量越不清晰,分辨率越高图片质量越清晰(数据显示更加丰富);(干货——我们看到的图片为什么不清晰)
A2)上表中最后一列(全分辨率下的时序):我们看到数据由 [9 7 3 5] 到 [8 8 4 4] 再到 [6 6 6 6],显然在一个图像的某个区域内,分辨率越低,数据越不丰富,变化越不明显,这也是为什么低分辨率下数据模糊的一个原因(因为低分辨率下,数据经过降维处理了);

【2】将上述哈尔小波分解过程用倒置二叉树表示如下:

【3】看个荔枝


对上图的分析(Analysis):
A1)以上数据[2, 5, 8, 9, 7, 4, -1, 1]在不同分辨率下经过哈儿小波变换得到的数据如下:
分辨率3:它本身;
分辨率2:3.5, 8.5, 5.5, 0, -1.5, -0.5, 1.5, -1;
分辨率1:6, 2.75, -2.5, 2.75, -1.5, -0.5, 1.5, -1;
分辨率0:4.375, 1.625, -2.5, 2.75, -1.5, -0.5, 1.5, -1;
A2)哈儿小波变换分为哈儿小波分解和哈儿小波重构,且我们可以指定最低级分辨率(并不一定是0);

【4】将哈儿小波变换应用到Kmeans聚类算法(干货——目的是降低聚类时间复杂度)
1)Kmeans聚类进行前:先对数据进行哈儿小波分解以降维到0分辨率(或你自己指定)(干货——聚类开始前,我们数据的分辨率是0,而维度是1,即2^0=1);
2)Kmeans聚类过程中:聚类是一个迭代的过程,每轮迭代,我们都对数据进行哈儿小波重构进行升维(以降低聚类时间复杂度);
如第1轮聚类后,我们将数据升维到分辨率1下;第2轮迭代后,将数据升维到分辨率2下,以此类推......;当达到全分辨率下时,我们不再进行哈儿小波变换,但可以继续聚类,直到满足聚类结束标志的条件为止;

【5】哈儿小波分解和重构源代码实现 
5.1)哈儿小波分解和重构的源代码 
public class HaarTransform{public static int maxResolution;/*** executing haar reconstruction transform towards given array* @param rawitem raw array* @param curResolution current resolution*/public static void haarReconstruct(double[] rawitem, int curResolution)	{double[] temp = new double[rawitem.length];System.arraycopy(rawitem, 0, temp, 0, temp.length);int span = (int) pow(2, curResolution);for (int i = 0; i < span; i++) {temp[2*i] = rawitem[i] + rawitem[i+span];temp[2*i+1] = rawitem[i] - rawitem[i+span];}System.arraycopy(temp, 0, rawitem, 0, temp.length);}/*** @param rawitem is a array* @param leastResolution is the least resolution  allowed be zero.* @param maxResolution is equals to log(full dimension)* @return*/public static double[] haarDecompose(double[] rawitem, int leastResolution)	{double[] temp = new double[rawitem.length];int resolutionLength = rawitem.length;  int maxResolution = HaarTransform.maxResolution;// if rawitem.length=8, maxResolution = 3; // you know least resolution equals to 0.for (int i = maxResolution; i > leastResolution; i--) {System.out.println("第"+i+"级分辨率下");AlgTools.printOneDimArray(rawitem);for (int j = 0; j < resolutionLength / 2; j++) {temp[j] = (rawitem[2*j] + rawitem[2*j+1]) / 2;temp[resolutionLength/2+j] = (rawitem[2*j] - rawitem[2*j+1]) / 2;}resolutionLength /= 2;System.arraycopy(temp, 0, rawitem, 0, temp.length);}return temp;}
}
5.2)哈儿小波分解和重构的测试用例
public class HaarTransformTest {public static void main(String[] args) {double[] data = {2, 5, 8, 9, 7, 4, -1, 1};int resolutionNum = (int) (log(data.length) / log(2));System.out.println("分辨率总级别个数为: " + resolutionNum);HaarTransform.maxResolution = resolutionNum;int leastResolution = 0;HaarTransform.haarDecompose(data, leastResolution);System.out.println("最低级分辨率"+leastResolution+"下");AlgTools.printOneDimArray(data);// 哈儿小波分解over.for (int i = leastResolution; i < resolutionNum; i++) {HaarTransform.haarReconstruct(data, i);System.out.println("第"+ (i+1) + "级分辨率下");AlgTools.printOneDimArray(data);}// 哈儿小波重构over.}
}
对以上代码的分析(Analysis):
A1)因为总共维度是8,所以最大分辨率==log8=3;
A2)上述哈儿小波分解过程中对应的变量变化如下(为了便于更加理解分解过程):

循环次数

round

分辨率级别 i 

分辨率级别的对应维度

resolutionLength

j(max)

下一分辨率级别

的维度sum

1

3

8

3(0~3)

4

2

2

4

1(0~1)

2

3

1

2

0(0~0)

1

4

0

1



    

5.2)打印结果(共8维)(也可以指定哈尔小波分解的最低级分辨率,如1,2,但最小是0)
分辨率总级别个数为: 3
第3级分辨率下2.000  5.000  8.000  9.000  7.000  4.000 -1.000  1.000
第2级分辨率下3.500  8.500  5.500  0.000 -1.500 -0.500  1.500 -1.000
第1级分辨率下6.000  2.750 -2.500  2.750 -1.500 -0.500  1.500 -1.000
最低级分辨率0下4.375  1.625 -2.500  2.750 -1.500 -0.500  1.500 -1.000
第1级分辨率下6.000  2.750 -2.500  2.750 -1.500 -0.500  1.500 -1.000
第2级分辨率下3.500  8.500  5.500  0.000 -1.500 -0.500  1.500 -1.000
第3级分辨率下2.000  5.000  8.000  9.000  7.000  4.000 -1.000  1.000


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

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

相关文章

漫画算法:判断2的乘方

转载自 玻璃猫 程序员小灰 小灰陷入回忆当中。。。。 题目&#xff1a;实现一个方法&#xff0c;判断一个正整数是否是2的乘方&#xff08;比如16是2的4次方&#xff0c;返回True&#xff1b;18不是2的乘方&#xff0c;返回False&#xff09;。要求性能尽可能高。 解法一&…

k66 pit计时功能配置_PIT,JUnit 5和Gradle –仅需额外的一行配置

k66 pit计时功能配置在Gradle&#xff08;带有gradle-pitest-plugin 1.4.7&#xff09;中发现简单&#xff0c;改进的PIT和JUnit 5配置。 不可否认&#xff0c;如今JUnit 5越来越受欢迎。 虽然为JUnit 5提供了一个专用于PIT的插件&#xff0c;并且gradle-pitest-plugin支持了很…

tomcat(7)日志记录器

【0】README0.1&#xff09;本文部分文字描述转自&#xff1a;“深入剖析tomcat”&#xff0c;旨在学习 “tomcat的日志记录器” 的基础知识&#xff1b;0.2&#xff09;intro to 日志记录器&#xff1a;日志记录器是用来记录消息的组件&#xff1b;0.3&#xff09;for complet…

漫画算法:最小栈的实现

转载自 玻璃猫 程序员小灰 小灰回忆起当时的情景…… 题目&#xff1a;实现一个栈&#xff0c;带有出栈&#xff08;pop&#xff09;&#xff0c;入栈&#xff08;push&#xff09;&#xff0c;取最小元素&#xff08;getMin&#xff09;三个方法。要保证这三个方法的时间复杂度…

oidc auth2.0_将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成

oidc auth2.0如果您正在使用Auth0对多个现有应用程序中的用户进行身份验证和授权&#xff0c;则可能需要将下一个Web应用程序与Auth0集成。 有多种方法可以执行此操作&#xff0c;例如&#xff0c;如果要将Jenkins与Auth0集成&#xff0c;则可以使用SAML v2&#xff1b;否则&a…

follow 开源项目关于NoClassDefFoundError错误的解决方法

【0】README0.1&#xff09;本文旨在po出当我们follow open projects 的时候&#xff0c;遇到一些在open API中不存在&#xff08;NoClassDefFoundError&#xff09;的类时的解决方法&#xff1b;【1】problemsolution&#xff1a;1.1&#xff09;problem&#xff1a;一般case下…

camel apache_如何使用Apache Camel,Quarkus和GraalVM快速运行100个骆驼

camel apache今天&#xff0c;我继续在youtube上练习&#xff0c;并录制了10分钟的视频&#xff0c;介绍了如何创建一个新的Camel and Quarkus项目&#xff0c;该项目包括Rest和HTTP服务以及开箱即用的健康检查和指标。 然后比较在JVM模式下运行示例与使用GraalVM编译的本机的…

漫画算法:找出缺失的整数

转载自 玻璃猫 程序员小灰 小灰一边回忆一边讲述起当时面试的情景...... 题目&#xff1a;一个无序数组里有99个不重复正整数&#xff0c;范围从1到100&#xff0c;唯独缺少一个整数。如何找出这个缺失的整数&#xff1f; 解法一&#xff1a; 创建一个HashMap&#xff0c;以1到…

tomcat(8)载入器

【0】README0.0&#xff09;本文部分描述转自“深入剖析tomcat”&#xff0c;旨在学习 tomcat(8)载入器 的基础知识&#xff1b;0.1&#xff09;一个标准web 应用程序中的载入器&#xff1a;简单来说就是 tomcat中的载入器&#xff1b;0.2&#xff09;servlet容器需要实现一个自…

micrometer_具有InlfuxDB的Spring Boot和Micrometer第3部分:Servlet和JDBC

micrometer在上一个博客中&#xff0c;我们使用由InfluxDB支持的Micrometer设置了React式应用程序。 在本教程中&#xff0c;我们将使用传统的带有JDBC的基于Servlet的阻塞Spring堆栈。 我选择的数据库是postgresql。 我将使用与先前博客文章相同的脚本。 因此&#xff0c;我…

漫画算法:辗转相除法是什么鬼

转载自 玻璃猫 程序员小灰 大四毕业前夕&#xff0c;计算机学院的小灰又一次顶着炎炎烈日&#xff0c; 去某IT公司面试研发工程师岗位…… 半小时后&#xff0c;公司会议室&#xff0c;面试开始…… 小灰奋笔疾书&#xff0c;五分钟后…… 小灰的思路十分简单。他使用暴力…

tomcat(9)Session管理

【0】README0.0&#xff09;本文部分描述转自“深入剖析tomcat”&#xff0c;旨在学习“tomcat-Session管理” 的基础知识&#xff1b;0.1&#xff09;Catalina通过一个称为Session 管理器的组件来管理建立的Session对象&#xff0c;该组件由org.apache.catalina.Manager接口来…

micrometer_具有InlfuxDB的Spring Boot和Micrometer第2部分:添加InfluxDB

micrometer自从我们添加了基本应用程序以来&#xff0c;是时候启动InfluxDB实例了。 我们将按照之前的教程进行操作&#xff0c;并添加一个docker实例。 docker run –rm -p 8086&#xff1a;8086 –name influxdb-本地influxdb 是时候在我们的pom上添加微米InfluxDB依赖项了…

漫画:什么是volatile关键字?(整合版)

转载自 永远爱大家的 程序员小灰 ————— 第二天 ————— ———————————— Java内存模型简称JMM&#xff08;Java Memory Model&#xff09;&#xff0c;是Java虚拟机所定义的一种抽象规范&#xff0c;用来屏蔽不同硬件和操作系统的内存访问差异&#xff0c;让j…

tomcat(supplement)HttpConnector.initialize() 和 start() 方法 以及 StandardContext.start()方法的分析

【0】README 0.0&#xff09;本文中源代码的背景&#xff0c;参见 tomcat(9)session管理 0.1&#xff09;本文主要以图片的形式分析他们大致的调用过程&#xff1b; 0.2&#xff09;HttpConnector org.apache.catalina.connector.http.HttpConnector; 而StandardContext o…

restful rest_HATEOAS的RESTful服务。 超媒体:REST的秘密要素

restful rest在这篇文章中&#xff0c;我们将介绍有关HATEOAS的RESTful服务的综合文章。 超媒体是REST的秘密成分。 1.简介 在本教程的前一部分中&#xff0c;我们花了一些时间来刷新有关REST体系结构样式的基本原理的知识。 业界对REST状态的批判性眼光揭示了一个令人失望的…

漫画:什么是单例设计模式

转载自 永远爱大家的 程序员小灰 ————— 第二天 ————— 单例模式第一版&#xff1a; 1234567891011public class Singleton {private Singleton() {} //私有构造函数private static Singleton instance null; //单例对象//静态工厂方法public static Singleton ge…

如何在工作繁重、睡眠较少的情况下保持旺盛精力?

作者&#xff1a;陈炬 链接&#xff1a;https://www.zhihu.com/question/23177623/answer/47785761 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 本人也在创业&#xff0c;结合《精力管理》一书&#xff0c;说说我…

mockito接口没法赋值_Mockito:无法实例化@InjectMocks字段:类型是接口

mockito接口没法赋值使用Mockito进行Java类的模拟和存根的任何人&#xff0c;可能都熟悉InjectMocks -annotation。 在要测试的类上使用此批注&#xff0c;Mockito将尝试通过构造函数注入&#xff0c;setter注入或属性注入来注入模拟。 魔术成功了&#xff0c;它无声地失败了&a…

tomcat(10)安全性

【0】README0.0&#xff09;本文部分描述转自“深入剖析tomcat”&#xff0c;旨在学习 tomcat(10)安全性 的基本知识&#xff1b;0.1&#xff09;servlet技术支持通过配置部署描述器&#xff08;web.xml&#xff09;文件来对这些内容进行访问控制&#xff1b;&#xff08;干货—…