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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

家用电器用户行为分析与事件识别代码详解+修改后运行无误的代码

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 家用电器用户行为分析与事件识别代码详解+修改后运行无误的代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

運行環境:

ubuntu16.04 64位

pycharm python3.5.2

相關軟件列表:

cycler (0.10.0)
graphviz (0.7.1)
h5py (2.7.0)
Keras (2.0.4)
matplotlib (2.0.2)
numpy (1.12.1)
pandas (0.20.1)
pip (8.1.1)
protobuf (3.3.0)
pydot (1.2.3)
pyparsing (2.2.0)
python-dateutil (2.6.0)
pytz (2017.2)
PyYAML (3.12)
scipy (0.19.0)
setuptools (20.10.1)
six (1.10.0)
tensorflow (1.1.0)
Theano (0.9.0)
Werkzeug (0.12.2)
wheel (0.29.0)
xlrd (1.0.0)
xlwt (1.2.0)

-------------------------------------------------------------------下面是10-1-----------------------------------------------------------------------------------

#-*- coding: utf-8 -*- #用水事件劃分 import pandas as pdthreshold = pd.Timedelta('4 min') #閾值為分鐘 inputfile = '../data/water_heater.xls' #輸入數據路徑,需要使用Excel格式 outputfile = '../tmp/dividsequence.xls' #輸出數據路徑,需要使用Excel格式data = pd.read_excel(inputfile) data[u'發生時間'] = pd.to_datetime(data[u'發生時間'], format = '%Y%m%d%H%M%S') data = data[data[u'水流量'] > 0] #只要流量大于0的記錄 d = data[u'發生時間'].diff() > threshold #相鄰時間作差分,比較是否大于閾值 data[u'事件編號'] = d.cumsum() + 1 #通過累積求和的方式為事件編號data.to_excel(outputfile)
這個代碼什么意思呢?

也就是說,根據水流量和時間間隔的頻率來判斷用戶第幾次用水,舉個通俗的例子,就說洗菜把。

洗一顆青菜,洗一個葉子時需要用水對吧,但是呢,我把青菜的瓣兒一個個扳下來的這會兒功夫是不需要用水的對吧?

在扳的時候我停掉水龍頭,拌青菜完了之后開始洗了,就需要用水,然后洗下一個青菜,再停水。

那么整個洗菜的過程中我有停水,也有用水,整個過程視為一次用水事件。

P205中表格的數據解釋:

可以看到

20141019172323

20141019172325

這兩個發生事件只相隔了2秒,水流量反而減少了,這個可以理解為水龍頭開大開小導致。


-------------------------------------------------------------------下面是10-2-----------------------------------------------------------------------------------

#-*- coding: utf-8 -*- #閾值尋優 import numpy as np import pandas as pdinputfile = '../data/water_heater.xls' #輸入數據路徑,需要使用Excel格式 n = 4 #使用以后四個點的平均斜率threshold = pd.Timedelta(minutes = 5) #專家閾值,這句話就是把數據格式變化了下,沒有對數據進行處理 print("threshold=",threshold) data = pd.read_excel(inputfile) data[u'發生時間'] = pd.to_datetime(data[u'發生時間'], format = '%Y%m%d%H%M%S') data = data[data[u'水流量'] > 0] #只要流量大于0的記錄def event_num(ts):#這里是函數定義,不是在執行,這里的ts是thresholdd = data[u'發生時間'].diff() > ts #相鄰時間作差分,比較是否大于閾值return d.sum() + 1 #這樣直接返回事件數 ################以上代碼和12-1類似################ dt = [pd.Timedelta(minutes = i) for i in np.arange(1, 9, 0.25)]#這里用到的語法是列表推導,也叫作列表解析 #這里arange用于創建等差數組,這里的數據最終會變化成時間數據格式,也就是說,這里的0.25代表每分鐘的四分之一,也就是15秒,按照15秒為步長,進行取數據 #上面一句話的意思其實就是某某函數在某定義域的值的序列☆☆☆☆☆☆ h = pd.DataFrame(dt, columns = [u'閾值']) #定義閾值列 h[u'事件數'] = h[u'閾值'].apply(event_num) #計算每個閾值對應的事件數,調用了上面的event_num函數 #上面這句話的意思是在實現圖10-4,通過橫軸的閾值,來計算數軸的事件數h[u'斜率'] = h[u'事件數'].diff()/0.25 #計算每兩個相鄰點對應的斜率 print("h[u'斜率'].abs()=",h[u'斜率'].abs()) h[u'斜率指標'] = pd.rolling_mean(h[u'斜率'].abs(), n) #采用后n個的斜率絕對值平均作為斜率指標 print("h[u'斜率指標']=",h[u'斜率指標']) #以上的計算: h[u'斜率']=>h[u'斜率指標'] print("--------------------------------------------------------------------------------")ts = h[u'閾值'][h[u'斜率指標'].idxmin() - n]# #這里ts得到的是4min,利用修正過后的索引對h[u'閾值']取值 #idxmin()返回數組中最小值的索引 #注:用idxmin返回最小值的Index,由于rolling_mean()自動計算的是前n個斜率的絕對值平均(根據下方列表可以通透地理解這個意思) #所以結果要進行平移(-n) #這里的平移其實是不太合適的,我認為平移n/2更加合理,因為一個點的斜率一般是取前后n/2個點進行平均計算后所得值是更為合理的。if ts > threshold:#這里的意思是,如果上面計算得到的ts小魚上面設定的專家閾值,就以ts為準,否則就降低為4.ts = pd.Timedelta(minutes = 4)#決定的最終的閾值 print("-----------------------------") print("ts=",ts)#所以這個代碼的終極目的就是為了獲得斜率最低點的起始點,這樣有利于把前一件用水事件和后一件用水事件進行合理的區分。
這個代碼的意思就是為了尋找書本p211的圖10-4的斜率為零的線段的起始點。

當線段下降很陡的時候,說明線段中的這幾個點很可能屬于同一個事件,所以化為一個事件。

同樣的,當線段很平坦,閾值的遞增對事件總數影響不大時,那么曲線上的多個點代表的事件總是說明分類比較合理,也就是說此時每個用水事件之間相隔時間間隔較大。

-------------------------------------------------------------------下面是10-3-----------------------------------------------------------------------------------

接下來這個代碼就是數據的輸入輸出之間進行模型訓練了,書上的代碼沒辦法直接運行,我進行了修改,如下:

#-*- coding: utf-8 -*- #建立、訓練多層神經網絡,并完成模型的檢驗 from __future__ import print_function import pandas as pd from keras.utils.vis_utils import plot_modelinputfile1='../data/train_neural_network_data.xls' #訓練數據 inputfile2='../data/test_neural_network_data.xls' #測試數據 testoutputfile = '../tmp/test_output_data.xls' #測試數據模型輸出文件 data_train = pd.read_excel(inputfile1) #讀入訓練數據(由日志標記事件是否為洗浴) data_test = pd.read_excel(inputfile2) #讀入測試數據(由日志標記事件是否為洗浴) y_train = data_train.iloc[:,4].as_matrix() #訓練樣本標簽列 x_train = data_train.iloc[:,5:17].as_matrix() #訓練樣本特征 y_test = data_test.iloc[:,4].as_matrix() #測試樣本標簽列 x_test = data_test.iloc[:,5:17].as_matrix() #測試樣本特征from keras.models import Sequential from keras.layers.core import Dense, Dropout, Activation from keras.layers import Dense, Activationmodel = Sequential() #建立模型 model.add(Dense(output_dim=17,input_dim=11)) #添加輸入層、隱藏層的連接 model.add(Activation('relu')) #以Relu函數為激活函數model.add(Dense(output_dim=10,input_dim=17)) #添加隱藏層、隱藏層的連接 model.add(Activation('relu')) #以Relu函數為激活函數model.add(Dense(input_dim=10,output_dim=1)) #添加隱藏層、輸出層的連接 model.add(Activation('sigmoid')) #以sigmoid函數為激活函數 #編譯模型,損失函數為binary_crossentropy,用adam法求解 model.compile(loss='binary_crossentropy', optimizer='adam', class_mode="binary")model.fit(x_train, y_train, nb_epoch = 100, batch_size = 1) #訓練模型 model.save_weights('../tmp/net.model') #保存模型參數r = pd.DataFrame(model.predict_classes(x_test), columns = [u'預測結果']) pd.concat([data_test.iloc[:,:5], r], axis = 1).to_excel(testoutputfile) model.predict(x_test) ############自己添加的######################## plot_model(model, to_file='model.png', show_shapes=True)



代碼運行結果為:


? 熱水事件 起始數據編號 終止數據編號 開始時間(begin_time) 根據日志判斷是否為洗浴(1表示是,0表示否) 預測結果
01733362015-01-05 9:42:41'11
12420535'2015-01-05 18:05:28'11
23538706'2015-01-05 18:25:24'11
34793910'2015-01-05 20:00:42'11
459351133'2015-01-05 20:15:13'11
5611721274'2015-01-05 20:42:41'11
6716411770'2015-01-06 08:08:26'00
78210522802015-01-06 11:31:13'11
8922902506'2015-01-06 17:08:35'11
91025622708'2015-01-06 17:43:48'11
101131413284'2015-01-07 10:01:57'01
1112352436552015-01-07 13:32:43'01
121336593863'2015-01-07 17:48:22'11
131439374125'2015-01-07 18:26:49'11
141541454373'2015-01-07 18:46:07'11
151644114538'2015-01-07 19:18:08'11
1617570058942015-01-08 7:08:43'01
1718591361782015-01-08 13:23:42'11
1819623864432015-01-08 18:06:47'11
1920662966962015-01-08 20:18:58'11
2021671368792015-01-08 20:32:16'11


注意每次預測結果都是不一樣的,上面的預測結果準確度是80%,如果多訓練幾次會發現準確度在60%~80%之間,靠右兩列數值不同時,則為判斷錯誤,相同時,則為判斷正確。

并且會出現隨機報錯,也就是說一次運行無報錯,另外一次運行報錯,屬正?,F象,因為每次訓練都是局部最優解。

使用的神經網絡模型為:


總結

以上是生活随笔為你收集整理的家用电器用户行为分析与事件识别代码详解+修改后运行无误的代码的全部內容,希望文章能夠幫你解決所遇到的問題。

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