2020年6月9日 星期二

[tf.keras]利用LSTM預測泵傳感器剩餘壽命(二)—數據預處理


在上一章節,提供了數據的csv檔,在開始之前,請將數據檔案下載進電腦裡(此章節將用Excel做第一步的預處理)

https://www.kaggle.com/nphantawee/pump-sensor-data

下載完並解壓縮後會得到一個sensor.csv檔案,我們利用Excel開啟它。
從欄位中可以看到序號、日期時間、52項數據資料以及機器狀態。
其中,機器的狀態包含:broken(故障):7個、recovering(修復中)14477個、normal(正常狀態)220320個



我們按下,排序與篩選/篩選,然後對machine_status欄位按下篩選箭頭,勾銷NORMAL和RECOVERING後,就只剩下機器故障時的資料了。

接著我們在[timestamp]右邊插入剩餘時間欄位[time_left],格是選擇數值,目前可以看到最左邊的機器狀態為broken,所以我們把那7筆資料的剩餘時間填滿0。
請記得左側的藍色數字(最左側的編號),等一下會用到。

處理完之後解除篩選功能。
我們於C2的地方輸入公式:
=($B$17157-B2)*60*24
B12157是剛剛記下的藍色數字的第一個,減掉B2後代表機器第一次壞掉前的剩餘時間,60跟24則是讓它以分鐘為單位(本來是以天為單位)。
然後設定格是為數值。

沒意外的話得到的結果為17155,接著向下填滿,它並不會直接填滿到最底下,而是在剛剛輸入了0的地方被擋住,我們可以看到數字結果剛好符合。
如果0的上方不是1而是別的數字,則須考慮是否有操作錯誤(如果上方數字是三,則有可能是你將第A列的序號誤看成最左側的編號了)。
另外,機器狀態為RECOVERING的資料適不適用此計算方式尚未能完全確認(可以考慮刪除RECOVERING的資料)。

接著我們重複剛剛的動作,將第二次故障的時間減去現在的時間。

然後依此類推,總共做七次。



做完後可以先儲存成xlsx檔做備份,因為等一下要拆成兩份csv資料檔。

由於24512之後的資料並沒有損壞數據,故無法得知時間序列,將其刪除。

此時只剩下166442筆資料(含欄位名稱)。

接著複製[time_left]整個欄位並原地貼上為"值"。

貼上後可按圖中所框選的按鈕兩次,可以縮短為整數。


接著我們要打散資料,再最尾端增加[random]欄位,公式輸入:
=RAND()
並向下填滿

接著對[random]選擇從小到大排序,資料就隨機打散了。
然後記得,排序完[random]欄位要刪除。

訓練檔跟驗證檔比例我們分為8:2,由於現在資料總共是166442-1筆,故我們到166442*0.8=133152筆資料的地方停下,按ctrl+shift+↑可以選取上方所有資料。

然後按右鍵/刪除,然後將資料另存新檔成驗證檔test_sensor.csv(此時資料包含欄位大約33291筆)。

另存完後按ctrl+z回到刪除前,按下第133152筆資料,然後按ctrl+shift+↓可以選取下方所有資料。


然後按右鍵/刪除,然後將資料另存新檔成訓練檔train_sensor.csv(此時資料包含欄位大約133152筆)。

資料預處理完畢,下一章節將正式打code了。

[tf.keras]利用LSTM預測泵傳感器剩餘壽命(三)—訓練

[tf.keras]利用LSTM預測泵傳感器剩餘壽命(一)—簡介

本系列文章使用的數據為Kaggle的一項競賽[Pump sensor data for predictive maintenance](泵傳感器數據可進行預測性維護)所提供的資料
https://www.kaggle.com/nphantawee/pump-sensor-data

在此系列文章,我們將利用長短期記憶(Long Short-Term Memory,LSTM)預測機器還剩餘幾天會故障,使用的Library及API為tensorflow.keras。

LSTM簡介:
LSTM的中文名稱是長短期記憶,它可以記憶不定時間長度的數值,適合於處理和預測時間序列中間隔和延遲非常長的事件 [1]。
目前的應用包括:
  • 時間序列
  • 機器控制
  • 語音識別
  • 自然語言處理
  • 手寫識別
  • 自動駕駛汽車
  • 動畫


數據簡介:
數據的提供者在一個小組中工作,該小組需維護距離城鎮非常遙遠的小區域的水泵,去年有7個系統故障。這些故障給許多家庭面臨嚴重的生活問題。當系統出現故障時,團隊無法看到數據中的任何規律,因此他們也不確定應該特別注意哪些地方。
數據中大約有55個欄位,包含序號、時間、52個機器數據以及機器的狀態。
其中,機器的狀態包含:
  • broken(故障):7個
  • recovering(修復中)14477個
  • normal(正常狀態)220320個

在下一章節,我們將整理這些數據,做更詳細的說明。

[tf.keras]利用LSTM預測泵傳感器剩餘壽命(二)—數據預處理


參考文獻:
[1] 長短期記憶
https://zh.wikipedia.org/wiki/%E9%95%B7%E7%9F%AD%E6%9C%9F%E8%A8%98%E6%86%B6

2020年5月23日 星期六

[解決方法]Word項目編號後的空格過大

最近寫論文時發現Word項目編號後的空格很大怎麼樣都去除不掉。

如何解決呢

首先,對這行字按右鍵,調整清單縮排。

將編號的後置字元改成不標示,再按下確定,空格就消失了。

2020年5月19日 星期二

[密技]如何快速統計Pixiv瀏覽次數

原本Pixiv站的瀏覽量似乎需要付費會員才能自動統計瀏覽量,那如果不是付費會員就只能打計算機了嗎? 不用的

首先,利用Chorme或Firefox之類的瀏覽器,開啟Pixiv有顯示瀏覽次數的頁面。


然後按鍵盤上的F12,會顯示以下畫面。

接著複製並貼上以下程式嗎:
var spans = document.getElementsByClassName("count");
var counts=0;
for (var i = 0; i < spans.length; i++) {
if((""+(spans[i].parentNode.innerText)).match('瀏覽')!=null)
    counts+=parseInt(spans[i].innerText);
}
console.log("此頁面的瀏覽量為:"+counts);

貼完程式碼後,按下鍵盤上的Enter,「該頁面」的瀏覽次數就統計完畢了。

注意這段程式碼僅適用於一個頁面,如果你的作品有好幾頁的話(例如我有兩頁作品集),就要在每一頁都做一次以上動作,再把每頁的數字加總起來就可以了。

如果有問題或發現程式碼不能用的歡迎一起討論喔,希望這篇文有幫助到各位^.^

2020年4月30日 星期四

解決TypeError: type of argument "epsilon" must be int; got float instead的錯誤

日前在使用tensorflow_addons時遇到以下錯誤:
TypeError: type of argument "epsilon" must be int; got float instead

這時進入tensorflow_addons/layers/normalizations.py裡面

找到epsilon int = le-3的地方

把int改成[int,float]

再執行一次程式,問題就解決了

2020年4月26日 星期日

程式語言毛病數量排行

本文依據Stack Overflow的文章數量,衡量前十大最容易出毛病的程式語言排名。

第十名:C++
C++在Stack Overflow有10,400,000則文章

第九名:SQL
SQLStack Overflow19,800,000則文章

第八名:C#
C#Stack Overflow28,900,000則文章

第七名:PHP
PHPStack Overflow31,400,000則文章

第六名:R
RStack Overflow33,500,000則文章

第五名:C
CStack Overflow35,200,000則文章

第三名:GO與Python並列
GO與PythonStack Overflow皆36,900,000則文章

第二名:JavaScript
JavaScriptStack Overflow37,000,000則文章

第一名:Java
JavaStack Overflow39,300,000則文章


當然,本文只是玩笑性質,不必當作真正選擇語言的參考。

2020年4月5日 星期日

[小技巧]0.1+0.2==0.3的快速解法

最近在製作程式考題,出了一個0.1+0.2==0.3的題目。
這是很常見的程式考題,
題目可能會問如何回傳正確的數字,當0.1+0.2後,結果會是0.30000000000000004的數字,所以0.1+0.2==0.3會回傳false。

怎麼快速解這題呢,只要把它變成整數就可以了。
範例:
let a=0.1,b=0.2;
answer=(a*10+b*10)/10;

程式的意思是,先將0.1和0.2轉成1和2,相加後會變成3,之後再除上之前乘上的數字變0.3,就能回傳正確的數字。

同理:
0.24+0.42會回傳0.6599999999999999。
故只要將10改成100:
let a=0.24,b=0.42;
answer=(a*100+b*100)/100;

就能回傳正確的數字:0.66

2020年4月2日 星期四

在Linux解壓縮已切分成數份的zip檔

已知在Linux系統下unzip指令可以解壓縮zip檔,但是,如果壓縮檔已經被分割成數份zip檔了該怎麼辦呢。


首先,開啟CLI介面,輸入:
cat face2.zip* > face2.zip

註:face2為zip檔的檔名,請自行改成自己的。

然後這群zip檔就被合併成一個zip檔了。

然後再輸入解壓縮指令:
unzip face2.zip



該zip檔案就可以解壓縮了。

=====分隔線=====

如果覺得這篇文有幫助到你們的話,請留言或幫忙按個廣告吧。

您的支持是我寫文的最大動力。

如果依然失敗了,也請留言讓我知道,看看哪個環節出了問題,我有看到就會回。


希望這篇文有幫助到各位ξ( ✿>◡❛)

2020年3月29日 星期日

[解決方法]引入cv2時發生ImportError: libSM.so.6: cannot open shared object file: No such file or directory錯誤

使用Docker並在Python程式import cv2時可能會傳回
ImportError: libSM.so.6: cannot open shared object file: No such file or directory
的錯誤。

這是因為dockerfile的基本映像檔已經過期了

解決方法:
首先,開啟CLI介面,更新apt-get,輸入:
sudo apt-get update

然後,安裝libsm6,libxext6,libxrender-dev這三個元件,輸入:
sudo apt-get install -y libsm6 libxext6 libxrender-dev


更新完後,再重新import一次cv2,問題得以解決


=====分隔線=====
如果覺得這篇文有幫助到你們的話,請留言或幫忙按個廣告吧。

您的支持是我寫文的最大動力。

如果依然失敗了,也請留言讓我知道,看看哪個環節出了問題,我有看到就會回。


希望這篇文有幫助到各位ξ( ✿>◡❛)

2020年3月6日 星期五

[不專業評比]各主流程式語言效能比較

本篇將依據各主流程式語言執行的時間來比較效能差異

程式語言的速度僅供參考,效能往往取決於譯器而非語言本身


系統環境:

  • 作業系統:Windows10,64位元
  • CPU:intel i7 9700
執行環境:
  • Java:cmd
  • JavaScript:Chrome
  • C++:Visual Studio 2019
  • C#:Visual Studio 2019
  • Python:Spider
================
比較:各語言的IO效能

程式碼:
JAVA
  • for (var i=0;i<10000;i++)System.out.print(1);  
JavaScript
  • for (var i=0;i<10000;i++)console.log(1);
C++
  • for(int i=0;i<10000;i++) std::cout << 1;
C#
  • for (int i = 0; i < 10000; i++) Console.Write(1);
Python
  • for i in range(10000):
  •     print(1)

執行時間(單位:毫秒)

Java130
JavaScript73
C++176
C++(最佳化)129
C#136
C#(最佳化)132
Python142

=================
比較:各語言的一維陣列/串列填充效能

程式碼
JAVA
  • for (var i=0;i<1000000;i++)arr[i]=i; 
JavaScript
  • for (var i=0;i<1000000;i++)arr[i]=i;
C++
  • for (int i = 0; i < 1000000; i++)
  • number[i]=i;
C#
  • for (int i = 0; i < 1000000; i++) number[i]=i;
Python
  • for i in range(1000000):
  •     list0[i]=i


執行時間(單位:毫秒)

Java2
JavaScript6
C++2
C++(最佳化)2
C#4
C#(最佳化)2
Python98

=============================
比較:各語言的串列新增效能

程式碼
JAVA
  • for (int i = 0; i < 1000000; i++) st.push(i); 
JavaScript
  •  for (var i=0;i<10000000;i++)list.push(i);
C++
  • for (int i = 0; i < 1000000; i++)
  • mystack.push(i);
C#
  • for (int i = 0; i < 1000000; i++) myStack.Push(i); 
Python
  • for i in range(1000000):
  •     list0.append(i)

執行時間(單位:毫秒)

Java20
JavaScript135
C++690
C++(最佳化)12
C#59
C#(最佳化)59
Python94

========================
比較:各語言的遞迴效能(使用費氏數列)

程式碼
JAVA
  • public static long fib(int n){
  •         if(n==1)
  • return 1;
  • else if (n==2)
  • return 1;
  • else
  • return fib(n-1)+fib(n-2); 
  •     }   
  • fib(40);
JavaScript
  • function fib(n){
  •       if (n == 1)
  •         return 1;
  •       else if (n == 2)
  •         return 1;
  •       else
  •         return fib(n - 1) + fib(n - 2);
  •     }
  • fib(40);
C++
  • static long fib(int n) {
  • if (n == 1)
  • return 1;
  • else if (n == 2)
  • return 1;
  • else
  • return fib(n - 1) + fib(n - 2);
  • }
  • std::cout<<fib(40);
C#
  • static long fib(int n)
  •         {
  •             if (n == 1)
  •                 return 1;
  •             else if (n == 2)
  •                 return 1;
  •             else
  •                 return fib(n - 1) + fib(n - 2);
  •         }
  • fib(40);
Python
  • def fib(n):
  •     if n == 1:
  •         return 1
  •     elif n == 2:
  •         return 1
  •     else:
  •         return fib(n - 1) + fib(n - 2); 
  • fib(40)

執行時間(單位:毫秒)

Java224
JavaScript632
C++2527
C++(最佳化)251
C#2035
C#(最佳化)343
Python17947

================
比較:各語言大型二維陣列效能

程式碼(灰色字不列入計時):
JAVA

  • int arr[][]; 
  •  arr = new int[10000][10000]; 
  • for(int i = 0; i < arr.length; i++)  
  •             for(int j = 0; j < arr[i].length; j++) 
  •                 arr[i][j] = 0; 
  • for(int i = 0; i < arr.length; i++)  
  •             for(int j = 0; j < arr[i].length; j++) 
  •                 arr[i][j] = 255-arr[i][j]; 
JavaScript
  • var tArray = new Array();
  •     for (var k = 0; k < 10000; k++) {
  •       tArray[k] = new Array();
  •       for (var j = 0; j < 10000; j++) {
  •         tArray[k][j] = 0;
  •       }
  •     }
  •     var y=0,x=0;
  •  for (y = 0; y < 10000; y++) {
  •       for (x = 0; x < 10000; x++) {
  •         tArray[y][x] = 255 - tArray[y][x];
  •       }
  •     }
C++
  • unsigned char** fp = new unsigned char* [10000];
  • int x = 0, y = 0;
  • for (int j = 0; j < 10000; j++)
  • fp[j] = new unsigned char [10000];
  • for (y = 0; y < 10000; y++)
  • {
  • for (x = 0; x < 10000; x ++)
  • {
  • fp[y][x] = 255 - fp[y][x];
  • }
  • }

C#
  • int[,] number = new int[10000, 10000];
  •             int y = 0, x = 0;
  •             for (y = 0; y < 10000; y++) for (x = 0; x < 10000; x++) number[y,x] = 0;
  • for (y = 0; y < 10000; y++)
  • {
  • for (x = 0; x < 10000; x++)
  • {
  •  number[y,x] = 255 - number[y,x];
  • }
  •  }
Python
  • score=[[0]*10000 for i in range(10000)]
  • for i in range(10000):
  •     for j in range(10000):
  •         score[i][j]=0
  • for i in range(10000):
  •     for j in range(10000):
  •         score[i][j]=255-score[i][j]

執行時間(單位:毫秒)

Java52
JavaScript194
C++185
C++(最佳化)45
C#437
C#(最佳化)171
Python13908

=======================
整體上來說,在各個方面每個語言各有優劣

但依我個人排序的順序比為:
  1. C++(最佳化)
  2. Java
  3. C#(最佳化)
  4. JavaScript
  5. Python
不過就如開頭紅字所說,程式語言不應用來直接比較速度,如果想要更優的效能,編寫出更好的演算法帶來的速度效益往往超過更換語言的速度效益

對此篇有興趣的歡迎指教,希望以後可以出更多IT相關文章

2020年2月29日 星期六

2020年2月25日 星期二

[密技]如何在小畫家中使用漸層筆刷

繼上次這篇 [密技]如何在小畫家中使用自訂筆刷
已經可以得知小畫家可以自訂筆刷
那能不能用相同原理讓小畫家也有漸層筆刷呢,可以的

在這個範例中,將會實作一隻漸層蛇

首先,畫一個對角線,左上紅右下藍

2020年2月24日 星期一

2020年2月17日 星期一

[好東西推薦]線上圖片線稿抽取程式

google搜尋線稿抽取的教學,幾乎都需要CSP或PS等高檔軟體才能辦到,還需要一堆步驟,那有沒有線上版並且一個按鍵搞定的呢?有的

這是小弟我花了兩天兩夜的時間完成的線稿抽取程式網頁版
https://linedraft.blogspot.com

感謝您的支持,未來我將會優化它做更好的效果

2020年2月13日 星期四

[小知識]電腦今天突然跑不順怎麼辦

標題:電腦今天突然跑不順怎麼辦

通常電腦暫時性的當機或變緩慢時,重開機可以解決90%以上的問題。