研究生三年快毕业了,毕业前整理一下该领域的研究工作。正所谓,我栽树,后人乘凉。研究NILM的时候,个人觉得最快的方法是直接复现别人的论文,或者甚至用别人论文的代码直接跑出来体会整个流程(数据集导入->数据预处理->运行模型->输出结果)。研究生三年找遍了github上的一些相关的代码收集起来,现在快要毕业了,整理一下,就当做是研究生三年的一个交待。
个人研究NILM主要是利用深度学习、机器学习方面的方法,数学优化(遗传算法、粒子群优化)之类的研究得比较少,因此本文的分享主要聚集于已公开的基于深度学习来做非侵入式负荷识别的论文及相关公开的源码。
注:文中关于论文和代码的时效性为22年6月前后,后面我没有再阅读过相关论文和找过相关的公开代码了(主要是自己的论文后面投出去录用了),这方面的工作后面没有再深入了,好像就那时候开始流行用GNN来做了,因为之前普通的CNN、LSTM甚至Transformer都做过很多了,没得水论文了。此外,下面论文的代码我也只是跑通了个别几个感兴趣的,个别的你没跑通你问我我也不知道怎么弄。
公开数据集、工具和性能指标篇请看我另外一篇文章:
NILM非侵入式负荷识别(papers with code、data)带代码的论文整理——(公开数据集、工具、和性能指标篇) 全网最全
本文的适用读者:仅对相关领域有兴趣的在校的学生及学者
(鉴于最近有网友私信留言,考虑负荷辨识商业应用这一块,老实说本文不适合真正的商业应用,不建议在这些文献中浪费时间。在实际的商业应用中,还是通过电流谐波等特征,用传统的信号处理方法比如模版匹配滤波、盲源分离、构造特征向量或矩阵等比较符合商业实际和经济成本,应考虑这些传统思路。)
第一次更新时间:2023年1月10日 20:50:39
第一次更新的内容:全文的分享,排版还没有空改
第二次更新时间:2023年2月24日 15:52:30
第二次更新的内容:排版还没有空改,在忙学位论文,增加一下本文适用读者的说明。
《Review on Deep Neural Networks Applied to Low-Frequency NILM》
如果你打算通过深度学习来研究NILM,这是一篇必读的综述。这篇综述的发表时间在2020年前后,包括了网上几乎全部的NILM公开数据集、论文及代码地址。我这篇整理,也是在这篇综述的基础上,增加一些额外收集到的NILM公开代码和论文。

对于必读和比较重要的,我会特意在下面给出文字提示,其它的也会按需要加上注解。
GitHub - JackKelly/neuralnilm: Deep Neural Networks Applied to Energy Disaggregation
推荐理由:深度学习用于NILM的开山之作,必读!
《Sequence-to-point learning with neural networks for nonintrusive load monitoring》
GitHub - MingjunZhong/seq2point-nilm: Sequence-to-point learning for non-intrusive load monitoring
改进版本(进行剪枝)
推荐理由:这里包括了seq2seq和seq2point两种方法,是很多论文的benchmark比较对象,必读!下面的改进版本可以暂时略过。
改进版本1:Structured Probabilistic Pruning
Wang, H., Zhang, Q., Wang, Y., Hu, H. (2018) Structured Probabilistic Pruning for Convolutional Neural Network Acceleration. Zhejiang University, China.
pdf: https://arxiv.org/pdf/1709.06994.pdf
改进版本2:Entropy-Based Pruning
Hur, C., Kang, S. (2018) Entropy-Based Pruning Method For Convolutional Neural Networks. The Journal of Supercomputing, 75:2950–2963.
pdf: https://link-springer-com/content/pdf/10.1007/s11227-018-2684-z.pdf
改进版本3:Relative Threshold Pruning
Asouri, A. H., Abdelrahman, T. S., Remedios, A. D. (2019) Retraining-Free Methods for Fast On-the-Fly Pruning of Convolutional Neural Networks. Neurocomputing, 370 56-59.
pdf: https://www.sciencedirect.com/science/article/abs/pii/S0925231219312019
code :https://github.com/OdysseasKr/online-nilm
pdf :https://dl.acm.org/doi/pdf/10.1145/3200947.3201011
注解:这个不是论文,应该是一个学生对其它论文的一个复现,基于pytorch框架,因为之前的工作很多时候都是用Tensorflow做的。但是这个仓库意外地包含了两篇中文核心的复现。
code: GitHub - Ming-er/NeuralNILM_Pytorch
下面是来自他github的截图


[5]基于 seq2seq 和 Attention 机制的居民用户非侵入式负荷分解
[8]基于卷积块注意力模型的非侵入式负荷分解算法
code: Bitbucket
注解:GAN
GitHub - picagrad/WaveNILM: WaveNILM as published at ICASSP 2019
注解:通过wavenet,把电力信号当成语音信号来处理?膨胀卷积,扩大感受野。
code: a3labShares / A3NeuralNILM · GitLab
code : GitHub - jiejiang-jojo/fast-seq2point
code : https://github.com/EdgeNILM/EdgeNILM
注解:剪枝;
pdf: UNet-NILM | Proceedings of the 5th International Workshop on Non-Intrusive Load Monitoring
code : https://github.com/sambaiga/UNETNiLM
注解:Unet;多任务Multi-task;
pdf: https://mobile.aau.at/publications/bousbiat-buildsys20-imaging.pdf
code: https://github.com/BHafsa/image-nilm
注解:把NILM当成图像分类来做,挺有意思的,有好几篇也是这个思路,下面展开一下说明,代码在后面补充。
将一维序列数据转化为二维图像数据,把负荷识别当成进行图片分类来做,同时还有分灰度编码和彩色编码的图。
常见一维数据转二维的方法:
example1: 《非侵入式负荷识别边缘计算颜色编码研究》(2020)


example2 : 《Imaging Time-Series for NILM》(2019)

2.马尔科夫变迁场MTF
example1:《Exploring Time Series Imaging for Load Disaggregation》(2020)

3.递归图Recurrence Plot
example1:Improved Appliance Classification in Non-Intrusive Load Monitoring Using Weighted Recurrence Graph and Convolutional Neural Networks(2020)

4.短时傅里叶变换STFT
(这个应该有的,但是没记录)
5.V-I轨迹
example1:《A feasibility study of automated plug-load identification from high-frequency measurements》(2015) 二值化V-I轨迹

example2:《Appliance classification using VI trajectories and convolutional neural networks》(2017) 灰度的V-I轨迹

example3:《Non-Intrusive Load Monitoring by Voltage–Current Trajectory Enabled Transfer Learning》(2019) 彩色的V-I轨迹

code: GitHub - lmssdd/TPNILM: Notebook for Temporal Pooling NILM

注解:用到了语义分割里面比较出名的PSPNet来做多标签分类,可以读一下,代码也容易懂。
code: GitHub - DLZRMR/seq2subseq: Seq2subseq method for NILM
注解:GAN,生成对抗网络;
code: GitHub - LampriniKyrk/Imaging-NILM-time-series
pdf: https://arxiv.org/abs/1812.03915
code: GitHub - cbrewitt/nilm_fcn: Fully convolutional neural networks for non-intrusive load monitoring
pdf: https://www.mdpi.com/1996-1073/14/4/847/pdf
pdf: https://www.sciencedirect.com/science/article/pii/S0142061521000776
code: https://github.com/linfengYang/BitcnNILM
注解:wavenet+空洞卷积,瞎搞的堆叠罢了。
注解:GAN+Transfer Learning(迁移学习),后面迁移学习相关的我再补充一篇
code: GitHub - sambaiga/WRG-NILM: Weighted Recurrence Graph for appliance classification
pdf: https://arxiv.org/pdf/2106.02352.pdf
pdf: https://arxiv.org/pdf/2103.12177.pdf
code :GitHub - ETSSmartRes/VAE-NILM: Non-Intrusive Load Monitoring based on VAE model
注解:建议跑一下这个代码,挺仔细的,这几个作者做的实验,虽然其实就是一个VAE(变分自编码器),创新性一般的样子。
code : https://github.com/eyangs/transferNILM
注解:又是迁移学习。
code : GitHub - sambaiga/AWRGNILM: Adaptive Recurrence Graph for Appliance classification in NILM.
pdf:https://ieeexplore.ieee.org/abstract/document/9144492
PDF:https://www.mdpi.com/1996-1073/13/16/4154/htm
code: https://github.com/sambaiga/MLCFCD
文献下载: http://nilmworkshop.org/2020/proceedings/nilm20-final88.pdf
Code: https://github.com/Yueeeeeeee/BERT4NILM

code :https://github.com/vahit19/smart_grid
pdf : https://www.mdpi.com/1424-8220/22/2/473
code : https://github.com/ChristoferNal/Neural-Fourier-Energy-Disaggregation
https://github.com/MingjunZhong/transferNILM
基于TensorFlow2.0版本的实现
GitHub - MingjunZhong/seq2point-nilm: Sequence-to-point learning for non-intrusive load monitoring
注解:22年6月的时候发现的,截止我发文的时候(2023年1月),也不知道这个作者发paper了没
pdf: https://ieeexplore.ieee.org/document/7457610
pdf: On time series representations for multi-label NILM
code: GitHub - ChristoferNal/multi-nilm: Multi-NILM: Multi Label Non Intrusive Load Monitoring
code: GitHub - antoniosudoso/nilm-bqp: Mixed-Integer Nonlinear Programming for NILM
pdf: https://arxiv.org/abs/2106.09158
pdf : https://arxiv.org/abs/1907.06299
code :GitHub - compsust/KP-NILM: Supervised NILM using multiple-choice knapsack problem (MCKP).
https://github.com/ch-shin/awesome-nilm
CS446 Project: Electric Load Identification using Machine Learning
code: GitHub - andydesh/nilm: Non intrusive load monitoring using machine learning


非侵入式负载监测(NILM)旨在预测家庭中家用电器的状态或消耗,只需知道汇总的电力负荷。NILM可以被表述为回归问题或最常见的分类问题。由智能电表收集的大多数数据集允许自然地定义回归问题,但相应的分类问题是一个派生问题,因为它需要通过阈值处理方法从电力信号转换为每个设备的状态。我们处理了三种不同的阈值处理方法来执行这一任务,讨论了它们在UK-DALE数据集的各种设备上的差异。我们分析了深度学习最先进的架构在回归和分类问题上的表现,介绍了选择最方便的阈值处理方法的标准。
code:https://github.com/UCA-Datalab/nilm-thresholding
Neural NILM: Deep Neural Networks Applied to Energy Disaggregation
code: https://github.com/louisyuzhe/MachineLearning_NILM
注解:好像是国外某个大学生的本科毕业设计
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
“输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o