日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

?

?

總結

以上是生活随笔為你收集整理的NILMTK——经典数据集REDD介绍和使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。