NILMTK——经典数据集REDD介绍和使用

配置了NILMTK包的环境之后,想找数据测试一下,在NILMTK官网的API Docs里边发现dataset_converters模块中有内置的数据集处理函数,如图:

将数据转换成HDF文件,这些数据都是比较优秀的,其中,常用的数据集是REDD和UK_DALE。

1. REDD数据集

目前版本的下载地址为: http://redd.csail.mit.edu,需要向作者发送邮件,才能获取用户名和密码进行下载!

论文为:J. Zico Kolter and Matthew J. Johnson. REDD: A public data set for energy disaggregation research. In proceedings of the SustKDD workshop on Data Mining Applications in Sustainability, 2011. [pdf]

数据集的文件为:

文件主要包含低频功率数据和高频电压电流数据

low_freq:1Hz功率数据

high_freq:校准和分组之后的电压电流波形数据

high_freq_row:原生电压电流波形数据

(1)low_freq的文件目录

总共收集了6个家庭的数据,labels记录了每个channel的设备类型,channel是记录每个channel的UTC时间戳的功率数据。

labels:

channel(一秒一个点):

(2)high_freq的文件目录

总共收集了6个家庭的数据,current_1记录了第一电源的电流数据,current_1记录了第二电源的电流数据,voltage记录了电压数据。

需要注意的是:

a、十进制的UTC时间戳,与低频的UTC时间戳是一样的格式,但是这个允许有小数部分。

b、循环计数,虽然它在文件中表示为双精度,但实际上它是一个整数,表示该特定波形保留多少交流周期。

c、在等间隔的周期中,275个十进制数值,表示波形的数值

下载完数据集之后,可通过dataset_converters 的函数将数据改为HDF格式:

from nilmtk.dataset_converters import convert_reddconvert_redd(r'C:\Users\admin\Anaconda3\nilm_metadata\low_freq',r'C:\Users\admin\Anaconda3\nilm_metadata\low_freq\redd_low_new.h5')

2. REDD数据集的使用

a、负荷分解算法

通过NILMTK官网的API知道负荷分解包的算法有组合优化(CombinatorialOptimisation)、因子隐马尔可夫(FHMM)、Hart 1985(Hart 1985 algorithm),常用的是CO和FHMM。

b、负荷分解实现

以下例子是通过CO和FHMM计算的,文件获取在:

CO:http://nilmtk.github.io/nilmtk/master/_modules/nilmtk/disaggregate/combinatorial_optimisation.html#CombinatorialOptimisation

FHMM:nilmtk.legacy.disaggregate文件下的fhmm_exact文件。

  • 获取数据:
from __future__ import print_function, division
import pandas as pd
import numpy as np
from nilmtk.dataset import DataSet
#from nilmtk.metergroup import MeterGroup
#from nilmtk.datastore import HDFDataStore
#from nilmtk.timeframe import TimeFrame
from nilmtk.disaggregate.combinatorial_optimisation import CombinatorialOptimisation
from nilmtk.legacy.disaggregate.fhmm_exact import FHMMtrain = DataSet('C:/Users/admin/PycharmProjects/nilmtktest/low_freq/redd_low.h5')  # 读取数据集
test = DataSet('C:/Users/admin/PycharmProjects/nilmtktest/low_freq/redd_low.h5') # 读取数据集
building = 1  ## 选择家庭house
train.set_window(end="30-4-2011")  ## 划分数据集,2011年4月20号之前的作为训练集
test.set_window(start="30-4-2011") ## 四月40号之后的作为测试集## elec包含了这个家庭中的所有的电器信息和总功率信息,building=1-6个家庭
train_elec = train.buildings[1].elec  
test_elec = test.buildings[1].electop_5_train_elec = train_elec.submeters().select_top_k(k=5)  ## 选择用电量排在前5的来进行训练和测试

选取了第一个家庭,用电量在前5的电器数据进行测试。

  • 计算:
def predict(clf, test_elec, sample_period, timezone):   ## 定义预测的方法pred = {}gt= {}#获取总的负荷数据for i, chunk in enumerate(test_elec.mains().load(sample_period=sample_period)):chunk_drop_na = chunk.dropna()   ### 丢到缺省值pred[i] = clf.disaggregate_chunk(chunk_drop_na)  #### 分解,disaggregate_chunk #通过调用这个方法实现分解,这部分代码在下面可以见到gt[i]={}  ## 这是groudtruth,即真实的单个电器的消耗功率for meter in test_elec.submeters().meters:# Only use the meters that we trained on (this saves time!)    gt[i][meter] = next(meter.load(sample_period=sample_period))  gt[i] = pd.DataFrame({k:v.squeeze() for k,v in gt[i].items()}, index=next(iter(gt[i].values())).index).dropna()   #### 上面这一块主要是为了得到pandas格式的gt数据# If everything can fit in memorygt_overall = pd.concat(gt)   gt_overall.index = gt_overall.index.droplevel()pred_overall = pd.concat(pred)pred_overall.index = pred_overall.index.droplevel()# Having the same order of columnsgt_overall = gt_overall[pred_overall.columns]#Intersection of indexgt_index_utc = gt_overall.index.tz_convert("UTC")pred_index_utc = pred_overall.index.tz_convert("UTC")common_index_utc = gt_index_utc.intersection(pred_index_utc)common_index_local = common_index_utc.tz_convert(timezone)gt_overall = gt_overall.ix[common_index_local]pred_overall = pred_overall.ix[common_index_local]appliance_labels = [m.label() for m in gt_overall.columns.values]gt_overall.columns = appliance_labelspred_overall.columns = appliance_labelsreturn gt_overall, pred_overallclassifiers = { 'CO':CombinatorialOptimisation(),'FHMM':FHMM()}   ### 设置了两种算法,一种是CO,一种是FHMM
predictions = {}
sample_period = 120  ## 采样周期是两分钟
for clf_name, clf in classifiers.items():print("*"*20)print(clf_name)print("*" *20)clf.train(top_5_train_elec, sample_period=sample_period)  ### 训练部分gt, predictions[clf_name] = predict(clf, test_elec, 120, train.metadata['timezone'])

先用clf.train训练这5种电器的特征规律,然后在用总的功率数据进行各种电器特征分解。gt记录了每个电器的功率数据,采样周期是两分钟一个点,后边根据预测的电器种类选取了用电量排名比较高的5种电器。

predictions变量记录了两个算法的计算结果:

  • 评估:
def compute_rmse(gt, pred):   ### 评估指标 rmsefrom sklearn.metrics import mean_squared_errorrms_error = {}for appliance in gt.columns:rms_error[appliance] = np.sqrt(mean_squared_error(gt[appliance], pred[appliance])) ## 评价指标的定义很简单,就是均方根误差return pd.Series(rms_error)
rmse = {}
for clf_name in classifiers.keys():rmse[clf_name] = compute_rmse(gt, predictions[clf_name])
rmse = pd.DataFrame(rmse)

计算结果为:

参考博客:https://blog.csdn.net/baidu_36161077/article/details/81144037

 

 

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

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

相关文章

[转]ASP中ActiveX控件的内嵌及调用

懂ASP(Active Server Pages)的人很多,但能用ASP自如地调用ActiveX控件的人却不多;如果不调用ActiveX控件,则可以说微软当初设计ASP的初衷根本没有达到。众所周知,ActiveX技术是微软在Internet上除了IE外的另…

Linux C实现简单的shell

Linux C下实现简单的Shell 宗旨:技术的学习是有限的,分享的精神是无限的。 【需求描述】 用各种C函数实现一个简单的交互式Shell: 1、给出提示符,让用户输入一行命令,识别程序名和参数并调用适当的exec函数执行程序…

上拉电阻的作用

1、介绍使用微控制器(MCUs) 或任何数字逻辑设备时,上拉电阻器非常常见。本教程将解释何时何地使用上拉电阻器,然后我们将做一个简单的计算,以显示为什么上拉很重要。2、上拉电阻是什么?假设您有一个将一个引…

NILMTK——深扒组合优化(CO)和FHMM细节

前面的博客讲了具体实现,现在深究算法代码实现细节!!! 1.CO (1)关于train 从以下代码可知,CO首先是对各个电器的功率数据做了train,为了了解其原生实现对代码进行了深究: classifiers {CO:…

Python关键字

and  as  assert  break  class  continue   def  del  elif  else  except  exec  finally   for  from  global  if  import  in  is  lambda not  or  pass  print  raise  return  try while  with  yield  Non…

对51CTO的初步看法

决定给自己见一个技术博客之后,在网上搜了一下,发现了51CTO网站,进入之后发现网速够快,有尝试了博客的功能,也基本满足了我的要求,那就是它了,于是我就在51CTO安家了。写了两片共近千字的文章之…

深圳工资指导价出炉!最高月薪6万!你拖同行后腿了吗?

2020 年只剩下不到一个月了,年初立的 flag 有没有实现呢?我想多数人面临的尴尬是升职、加薪、赢取白富美、走上人生巅峰可能一步都没实现~对比周围混得风生水起的小伙伴感觉自己也不差啥啊,怎么就莫名其妙被甩了八条街?想一探究竟…

NILMTK——因子隐马尔可夫之隐马尔可夫

因子隐马尔可夫(FHMM)由Ghahramani在1997年提出,是一种多链隐马尔可夫模型,适合动态过程时间序列的建模,并具有强大的时序模型的分类能力,特别适合非平稳、再现性差的序列的分析。 1. 马尔可夫链 随机过程的研究对象是随时间演变…

CodeForces 903D Almost Difference

题目描述 Lets denote a function You are given an array aa consisting of nn integers. You have to calculate the sum of d(a_{i},a_{j})d(ai​,aj​) over all pairs (i,j)(i,j) such that 1<i<j<n1<i<j<n . 输入输出格式 输入格式&#xff1a; The fi…

如何使用资源文件

摘要.NET 中有一套非常完善的地方化系统被定义在 System.Resources 名字空间中。不过大多数人都被 MissingManifestResourceException 这个错误困惑着。本文就是要让大家了解什么是资源文件&#xff0c;它有什么用处以及如何正确的调用从而避免一些"奇怪"的错误&…

据悉,深圳某工程师沦为C语言笔试枪手

事情是这样的&#xff0c;昨晚晚上&#xff0c;有个网友发消息给我&#xff0c;说他有几道C语言笔试题不会写&#xff0c;所以&#xff0c;就出现了解题的这一幕。文章中&#xff0c;我只讲解了一部分&#xff0c;有一些题目觉得没必要讲&#xff0c;然后我在pdf上做了注释&…

大数据工具使用——安装Hadoop(多台服务器)和Hive、Hbase

1.配置环境版本 资料上传百度云&#xff0c;自取&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1evVp5Zk0_X7VdjKlHGkYCw 提取码&#xff1a;ypti 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 &#xff08;之前安装的是apache版本的Hadoop2.6.4,在启…

进程间通信——信号

进程间通信——信号 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、信号和中断 1、信号基本概念 &#xff08;1&#xff09;发送信号&#xff1a;产生信号&#xff0c;有多种发送信号的方式【一个进程到另一个进程&#xff0c;内核向用户&#x…

[转] 关于 WCF 中数据压缩的几篇文章

原文:http://www.cnblogs.com/jiabao/archive/2007/12/04/982534.html在.net3.0出现以前我们进行分布式开发式有两个选择一个是webservice&#xff0c;另一个是remoting&#xff1b;在早期的项目中&#xff0c;比较喜欢remoting&#xff0c;因为remoting可控性好&#xff0c;也…

聊一聊我自己的从业经历和感悟

嵌入式学习&#xff0c;是一个很枯燥的过程&#xff0c;我记得在学习三极管的时候&#xff0c;我真的对这个东西一点感觉都没有&#xff0c;我知道三极管可以放大&#xff0c;然后电子从一个地方去到了另一个地方&#xff0c;然后就触发了某个开关&#xff0c;就发了大水。然后…

gmake与make的区别

gnu make在linux下一般是叫make但是如果是在其他的unix系统下&#xff0c;因为有一个原生的makegnu make就改个名字叫gmake了。就这们简单当port一个老的unix程序&#xff0c;如老的SunOS上的程序时往往需要sed s/gmake/make/ggmake是GNU Make的缩写。Linux系统环境下的make就是…

大数据——sqoop操作mysql和hive导出导入数据

1.sqoop安装 &#xff08;1&#xff09;下载CDH版本的sqoop &#xff08;2&#xff09;解压并进行环境配置 环境变量为&#xff1a; export SQOOP_HOME/home/sqoop-1.4.6-cdh5.15.1 export PATH$PATH:$SQOOP_HOME/bin 在sqoop安装目录/conf/下&#xff1a; #新建sqoop-en…

LinuxC高级编程——线程

LinuxC高级编程——线程 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、线程基础 main函数和信号处理函数是同一个进程地址空间中的多个控制流程&#xff0c;多线程也是如 此&#xff0c;但是比信号处理函数更加灵活&#xff0c;信号处理函数的控制…

来自专业的RIA咨询strechmedia机构提供的Flex组件

具体内容见这里&#xff0c;其中最有用的是chart range selection组件&#xff0c;可以用作历史数据浏览和分析&#xff0c;不光能用slider来选择查看的范围&#xff0c;还能控制范围的大小&#xff0c;而且通过图形也能对range selection进行反向操作&#xff0c;非常酷&#…

年终了,肿一下

也没有没有跟大家好好唠唠&#xff0c;一年时间过得飞快&#xff0c;我还记得那时候从老家开车来深圳&#xff0c;一路狂奔&#xff0c;在广西入境广东的时候&#xff0c;因为疫情排查&#xff0c;我们在那里堵了3个小时&#xff0c;还因为路途颠簸&#xff0c;车子一起一停&am…