STUMPY เป็นไลบรารี Python ที่ทรงพลังและปรับขนาดได้ ซึ่งคำนวณบางสิ่งที่เรียกว่าโปรไฟล์เมทริกซ์ได้อย่างมีประสิทธิภาพ ซึ่งเป็นเพียงวิธีทางวิชาการในการพูดว่า "สำหรับทุกลำดับย่อย (สีเขียว) ภายในอนุกรมเวลาของคุณ จะระบุลำดับเพื่อนบ้านที่ใกล้ที่สุด (สีเทา) โดยอัตโนมัติ":
สิ่งสำคัญคือเมื่อคุณคำนวณโปรไฟล์เมทริกซ์ของคุณแล้ว (แผงกลางด้านบน) คุณจะสามารถนำไปใช้สำหรับงานขุดข้อมูลอนุกรมเวลาที่หลากหลาย เช่น:
ไม่ว่าคุณจะเป็นนักวิชาการ นักวิทยาศาสตร์ข้อมูล นักพัฒนาซอฟต์แวร์ หรือผู้ที่ชื่นชอบอนุกรมเวลา STUMPY ติดตั้งง่ายและเป้าหมายของเราคือการช่วยให้คุณเข้าถึงข้อมูลเชิงลึกของอนุกรมเวลาได้เร็วขึ้น ดูเอกสารประกอบสำหรับข้อมูลเพิ่มเติม
โปรดดูเอกสารประกอบ API ของเราสำหรับรายการฟังก์ชันทั้งหมดที่มีอยู่ และดูบทช่วยสอนที่ให้ข้อมูลของเราสำหรับกรณีการใช้งานตัวอย่างที่ครอบคลุมมากขึ้น ด้านล่างนี้ คุณจะพบข้อมูลโค้ดที่สาธิตวิธีใช้ STUMPY อย่างรวดเร็ว
การใช้งานทั่วไป (ข้อมูลอนุกรมเวลา 1 มิติ) กับ STUMP:
import stumpy
import numpy as np
if __name__ == "__main__" :
your_time_series = np . random . rand ( 10000 )
window_size = 50 # Approximately, how many data points might be found in a pattern
matrix_profile = stumpy . stump ( your_time_series , m = window_size )
การใช้งานแบบกระจายสำหรับข้อมูลอนุกรมเวลา 1 มิติด้วย Dask Distributed ผ่าน STUMPED:
import stumpy
import numpy as np
from dask . distributed import Client
if __name__ == "__main__" :
with Client () as dask_client :
your_time_series = np . random . rand ( 10000 )
window_size = 50 # Approximately, how many data points might be found in a pattern
matrix_profile = stumpy . stumped ( dask_client , your_time_series , m = window_size )
การใช้งาน GPU สำหรับข้อมูลอนุกรมเวลา 1 มิติด้วย GPU-STUMP:
import stumpy
import numpy as np
from numba import cuda
if __name__ == "__main__" :
your_time_series = np . random . rand ( 10000 )
window_size = 50 # Approximately, how many data points might be found in a pattern
all_gpu_devices = [ device . id for device in cuda . list_devices ()] # Get a list of all available GPU devices
matrix_profile = stumpy . gpu_stump ( your_time_series , m = window_size , device_id = all_gpu_devices )
ข้อมูลอนุกรมเวลาหลายมิติด้วย MSTUMP:
import stumpy
import numpy as np
if __name__ == "__main__" :
your_time_series = np . random . rand ( 3 , 1000 ) # Each row represents data from a different dimension while each column represents data from the same dimension
window_size = 50 # Approximately, how many data points might be found in a pattern
matrix_profile , matrix_profile_indices = stumpy . mstump ( your_time_series , m = window_size )
กระจายการวิเคราะห์ข้อมูลอนุกรมเวลาหลายมิติด้วย Dask Distributed MSTUMPED:
import stumpy
import numpy as np
from dask . distributed import Client
if __name__ == "__main__" :
with Client () as dask_client :
your_time_series = np . random . rand ( 3 , 1000 ) # Each row represents data from a different dimension while each column represents data from the same dimension
window_size = 50 # Approximately, how many data points might be found in a pattern
matrix_profile , matrix_profile_indices = stumpy . mstumped ( dask_client , your_time_series , m = window_size )
โซ่อนุกรมเวลาพร้อมโซ่อนุกรมเวลาแบบทอดสมอ (ATSC):
import stumpy
import numpy as np
if __name__ == "__main__" :
your_time_series = np . random . rand ( 10000 )
window_size = 50 # Approximately, how many data points might be found in a pattern
matrix_profile = stumpy . stump ( your_time_series , m = window_size )
left_matrix_profile_index = matrix_profile [:, 2 ]
right_matrix_profile_index = matrix_profile [:, 3 ]
idx = 10 # Subsequence index for which to retrieve the anchored time series chain for
anchored_chain = stumpy . atsc ( left_matrix_profile_index , right_matrix_profile_index , idx )
all_chain_set , longest_unanchored_chain = stumpy . allc ( left_matrix_profile_index , right_matrix_profile_index )
การแบ่งส่วนความหมายด้วยการแบ่งส่วนความหมาย Unipotent ต้นทุนต่ำที่รวดเร็ว (FLUSS):
import stumpy
import numpy as np
if __name__ == "__main__" :
your_time_series = np . random . rand ( 10000 )
window_size = 50 # Approximately, how many data points might be found in a pattern
matrix_profile = stumpy . stump ( your_time_series , m = window_size )
subseq_len = 50
correct_arc_curve , regime_locations = stumpy . fluss ( matrix_profile [:, 1 ],
L = subseq_len ,
n_regimes = 2 ,
excl_factor = 1
)
เวอร์ชัน Python และ NumPy ที่รองรับถูกกำหนดตามนโยบายการเลิกใช้งาน NEP 29
ติดตั้ง Conda (แนะนำ):
conda install -c conda-forge stumpy
การติดตั้ง PyPI สมมติว่าคุณติดตั้ง numpy, scipy และ numba แล้ว:
python -m pip install stumpy
หากต้องการติดตั้ง stumpy จากแหล่งที่มา โปรดดูคำแนะนำในเอกสารประกอบ
เพื่อที่จะเข้าใจและชื่นชมอัลกอริธึมและแอปพลิเคชันพื้นฐานอย่างถ่องแท้ จำเป็นอย่างยิ่งที่คุณจะต้องอ่านสิ่งพิมพ์ต้นฉบับ สำหรับตัวอย่างโดยละเอียดเพิ่มเติมของวิธีใช้ STUMPY โปรดอ่านเอกสารล่าสุดหรือสำรวจบทช่วยสอนแบบลงมือปฏิบัติจริงของเรา
เราทดสอบประสิทธิภาพของการคำนวณโปรไฟล์เมทริกซ์ที่แน่นอนโดยใช้โค้ดเวอร์ชันที่คอมไพล์ Numba JIT บนข้อมูลอนุกรมเวลาที่สร้างขึ้นแบบสุ่มที่มีความยาวต่างๆ (เช่น np.random.rand(n)
) พร้อมกับทรัพยากรฮาร์ดแวร์ CPU และ GPU ที่แตกต่างกัน
ผลลัพธ์ดิบจะแสดงในตารางด้านล่างเป็นชั่วโมง:นาที:วินาที.มิลลิวินาที และมีขนาดหน้าต่างคงที่ m = 50 โปรดทราบว่ารันไทม์ที่รายงานเหล่านี้รวมเวลาที่ใช้ในการย้ายข้อมูลจากโฮสต์ไปยังทั้งหมด อุปกรณ์ GPU คุณอาจต้องเลื่อนไปทางด้านขวาของตารางเพื่อดูรันไทม์ทั้งหมด
ฉัน | n = 2 ผม | GPU-STOMP | สตัมป์.2 | สตัมป์.16 | นิ่งงัน.128 | นิ่งงัน.256 | GPU-ตอมป์.1 | GPU-ตอมป์.2 | GPU-STUMP.DGX1 | GPU-STUMP.DGX2 |
---|---|---|---|---|---|---|---|---|---|---|
6 | 64 | 00:00:10.00 น | 00:00:00.00 น | 00:00:00.00 น | 00:00:05.77 | 00:00:06.08 | 00:00:00.03 | 00:00:01.63 | น่าน | น่าน |
7 | 128 | 00:00:10.00 น | 00:00:00.00 น | 00:00:00.00 น | 00:00:05.93 | 00:00:07.29 | 00:00:00.04 | 00:00:01.66 | น่าน | น่าน |
8 | 256 | 00:00:10.00 น | 00:00:00.00 น | 00:00:00.01 | 00:00:05.95 | 00:00:07.59 | 00:00:00.08 | 00:00:01.69 | 00:00:06.68 | 00:00:25.68 |
9 | 512 | 00:00:10.00 น | 00:00:00.00 น | 00:00:00.02 | 00:00:05.97 | 00:00:07.47 | 00:00:00.13 | 00:00:01.66 | 00:00:06.59 | 00:00:27.66 |
10 | 1,024 | 00:00:10.00 น | 00:00:00.02 | 00:00:00.04 | 00:00:05.69 | 00:00:07.64 | 00:00:00.24 | 00:00:01.72 | 00:00:06.70 น | 00:00:30.49 |
11 | 2048 | น่าน | 00:00:00.05 | 00:00:00.09 | 00:00:05.60 น | 00:00:07.83 | 00:00:00.53 | 00:00:01.88 | 00:00:06.87 | 00:00:31.09 |
12 | 4096 | น่าน | 00:00:00.22 | 00:00:00.19 | 00:00:06.26 | 00:00:07.90 | 00:00:01.04 | 00:00:02.19 | 00:00:06.91 | 00:00:33.93 |
13 | 8192 | น่าน | 00:00:00.50 น | 00:00:00.41 | 00:00:06.29 | 00:00:07.73 | 00:00:01.97 | 00:00:02.49 | 00:00:06.61 | 00:00:33.81 |
14 | 16384 | น่าน | 00:00:01.79 | 00:00:00.99 | 00:00:06.24 | 00:00:08.18 | 00:00:03.69 | 00:00:03.29 | 00:00:07.36 | 00:00:35.23 |
15 | 32768 | น่าน | 00:00:06.17 | 00:00:02.39 | 00:00:06.48 | 00:00:08.29 | 00:00:07.45 | 00:00:04.93 | 00:00:07.02 | 00:00:36.09 |
16 | 65536 | น่าน | 00:00:22.94 | 00:00:06.42 | 00:00:07.33 | 00:00:09.01 | 00:00:14.89 | 00:00:08.12 | 00:00:08.10 | 00:00:36.54 |
17 | 131072 | 00:00:10.00 น | 00:01:29.27 | 00:00:19.52 | 00:00:09.75 | 00:00:10.53 | 00:00:29.97 | 00:00:15.42 | 00:00:09.45 | 00:00:37.33 |
18 | 262144 | 00:00:18.00 น | 00:05:56.50 | 00:01:08.44 | 00:00:33.38 | 00:00:24.07 | 00:00:59.62 | 00:00:27.41 | 00:00:13.18 | 00:00:39.30 น |
19 | 524288 | 00:00:46.00 น | 00:25:34.58 | 00:03:56.82 | 00:01:35.27 | 00:03:43.66 | 00:01:56.67 | 00:00:54.05 | 00:00:19.65 | 00:00:41.45 |
20 | 1048576 | 00:02:30.00 น | 01:51:13.43 | 00:19:54.75 | 00:04:37.15 | 00:03:01.16 | 00:05:06.48 | 00:02:24.73 | 00:00:32.95 | 00:00:46.14 |
21 | 2097152 | 00:09:15.00 น | 09:25:47.64 | 03:05:07.64 | 00:13:36.51 | 00:08:47.47 | 00:20:27.94 | 00:09:41.43 | 00:01:06.51 | 00:01:02.67 |
22 | 4194304 | น่าน | 36:12:23.74 | 10:37:51.21 | 00:55:44.43 | 00:32:06.70 | 01:21:12.33 | 00:38:30.86 | 00:04:03.26 | 00:02:23.47 |
23 | 8388608 | น่าน | 143:16:09.94 | 38:42:51.42 | 03:33:30.53 | 02:00:49.37 | 05:11:44.45 | 02:33:14.60 | 00:15:46.26 | 00:08:03.76 |
24 | 16777216 | น่าน | น่าน | น่าน | 14:39:11.99 | 07:13:47.12 | 20:43:03.80 | 09:48:43.42 | 01:00:24.06 | 00:29:07.84 |
น่าน | 17729800 | 09:16:12.00 น | น่าน | น่าน | 15:31:31.75 | 07:18:42.54 | 23:09:22.43 | 10:54:08.64 | 01:07:35.39 | 00:32:51.55 |
25 | 33554432 | น่าน | น่าน | น่าน | 56:03:46.81 | 26:27:41.29 | 83:29:21.06 | 39:17:43.82 | 03:59:32.79 | 01:54:56.52 |
26 | 67108864 | น่าน | น่าน | น่าน | 211:17:37.60 | 106:40:17.17 | 328:58:04.68 | 157:18:30.50 | 15:42:15.94 | 07:18:52.91 |
น่าน | 100000000 | 291:07:12.00 น | น่าน | น่าน | น่าน | 234:51:35.39 | น่าน | น่าน | 35:03:44.61 | 16:22:40.81 |
27 | 134217728 | น่าน | น่าน | น่าน | น่าน | น่าน | น่าน | น่าน | 64:41:55.09 | 29:13:48.12 |
GPU-STOMP: ผลลัพธ์เหล่านี้ทำซ้ำจากกระดาษ Matrix Profile II ดั้งเดิม - NVIDIA Tesla K80 (มี GPU 2 ตัว) และทำหน้าที่เป็นเกณฑ์มาตรฐานประสิทธิภาพในการเปรียบเทียบ
STUMP.2: stumpy.stump ดำเนินการด้วย 2 CPU รวมทั้งหมด - 2x Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz โปรเซสเซอร์แบบขนานกับ Numba บนเซิร์ฟเวอร์เดียวที่ไม่มี Dask
STUMP.16: stumpy.stump ดำเนินการด้วย CPU 16 ตัวในจำนวนทั้งหมด - 16x Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz โปรเซสเซอร์แบบขนานกับ Numba บนเซิร์ฟเวอร์เดียวที่ไม่มี Dask
STUMPED.128: stumpy.stumped ดำเนินการด้วย CPU 128 ตัวในทั้งหมด - 8x Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz x เซิร์ฟเวอร์ x 16 เซิร์ฟเวอร์ ขนานกับ Numba และแจกจ่ายด้วย Dask Distributed
STUMPED.256: stumpy.stumped ดำเนินการด้วย CPU 256 ตัวทั้งหมด - 8x Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz x เซิร์ฟเวอร์ 32 เซิร์ฟเวอร์ ขนานกับ Numba และแจกจ่ายด้วย Dask Distributed
GPU-STUMP.1: stumpy.gpu_stump ดำเนินการด้วย GPU NVIDIA GeForce GTX 1080 Ti 1x, 512 เธรดต่อบล็อก, ขีดจำกัดพลังงาน 200W, คอมไพล์เป็น CUDA ด้วย Numba และทำพร้อมกันกับการประมวลผลหลายตัวของ Python
GPU-STUMP.2: stumpy.gpu_stump ดำเนินการด้วย GPU NVIDIA GeForce GTX 1080 Ti 2x, 512 เธรดต่อบล็อก, ขีดจำกัดพลังงาน 200W, คอมไพล์เป็น CUDA ด้วย Numba และทำพร้อมกันกับการประมวลผลหลายตัวของ Python
GPU-STUMP.DGX1: stumpy.gpu_stump ดำเนินการด้วย 8x NVIDIA Tesla V100, 512 เธรดต่อบล็อก คอมไพล์เป็น CUDA ด้วย Numba และขนานกับ Python multiprocessing
GPU-STUMP.DGX2: stumpy.gpu_stump ดำเนินการด้วย 16x NVIDIA Tesla V100, 512 เธรดต่อบล็อก คอมไพล์เป็น CUDA ด้วย Numba และขนานกับ Python multiprocessing
การทดสอบเขียนไว้ในไดเร็กทอรี tests
และประมวลผลโดยใช้ PyTest และต้องใช้ coverage.py
สำหรับการวิเคราะห์การครอบคลุมโค้ด การทดสอบสามารถทำได้ด้วย:
./test.sh
STUMPY รองรับ Python 3.9+ และเนื่องจากการใช้ชื่อ/ตัวระบุตัวแปร Unicode จึงเข้ากันไม่ได้กับ Python 2.x เนื่องจากมีการพึ่งพาเพียงเล็กน้อย STUMPY อาจทำงานกับ Python เวอร์ชันเก่าได้ แต่สิ่งนี้อยู่นอกเหนือขอบเขตการสนับสนุนของเรา และเราขอแนะนำอย่างยิ่งให้คุณอัปเกรดเป็น Python เวอร์ชันล่าสุด
ขั้นแรก โปรดตรวจสอบการสนทนาและปัญหาบน Github เพื่อดูว่าคำถามของคุณได้รับคำตอบแล้วหรือไม่ หากไม่มีวิธีแก้ไข อย่าลังเลที่จะเปิดการสนทนาหรือประเด็นใหม่ และผู้เขียนจะพยายามตอบกลับในเวลาที่เหมาะสม
เรายินดีรับการสนับสนุนในทุกรูปแบบ! เรายินดีให้ความช่วยเหลือด้านเอกสาร โดยเฉพาะบทช่วยสอนเพิ่มเติม หากต้องการมีส่วนร่วม โปรดแยกโครงการ ทำการเปลี่ยนแปลง และส่งคำขอดึง เราจะพยายามอย่างเต็มที่เพื่อแก้ไขปัญหาใดๆ กับคุณและรวมโค้ดของคุณเข้ากับสาขาหลัก
หากคุณใช้โค้ดเบสนี้ในสิ่งพิมพ์ทางวิทยาศาสตร์และต้องการอ้างอิง โปรดใช้บทความ Journal of Open Source Software
กฎหมาย SM, (2019) STUMPY: ไลบรารี Python ที่ทรงพลังและปรับขนาดได้สำหรับการขุดข้อมูลอนุกรมเวลา วารสารซอฟต์แวร์โอเพ่นซอร์ส, 4(39), 1504
@article { law2019stumpy ,
author = { Law, Sean M. } ,
title = { {STUMPY: A Powerful and Scalable Python Library for Time Series Data Mining} } ,
journal = { {The Journal of Open Source Software} } ,
volume = { 4 } ,
number = { 39 } ,
pages = { 1504 } ,
year = { 2019 }
}
ใช่แล้ว Chin-Chia Michael และคณะ (2016) โปรไฟล์เมทริกซ์ I: ความคล้ายคลึงกันของคู่ทั้งหมดเข้าร่วมสำหรับอนุกรมเวลา: มุมมองแบบรวมที่มีลวดลาย ความไม่ลงรอยกัน และรูปทรงต่างๆ ICDM:1317-1322. ลิงค์
จู้ หยาน และคณะ (2016) Matrix Profile II: การใช้ประโยชน์จากอัลกอริธึมใหม่และ GPU เพื่อทำลายกำแพงหนึ่งร้อยล้านสำหรับลวดลายและการรวมอนุกรมเวลา ICDM:739-748. ลิงค์
ใช่แล้ว Chin-Chia Michael และคณะ (2017) Matrix Profile VI: การค้นพบ Motif หลายมิติที่มีความหมาย ICDM:565-574. ลิงค์
จู้ หยาน และคณะ (2017) Matrix Profile VII: Time Series Chains: ดั้งเดิมใหม่สำหรับการขุดข้อมูลอนุกรมเวลา ICDM:695-704. ลิงค์
ฆารกาบี, ชากาเยห์ และคณะ (2017) โปรไฟล์เมทริกซ์ VIII: การแบ่งส่วนความหมายออนไลน์ของผู้ไม่เชื่อเรื่องพระเจ้าโดเมนที่ระดับประสิทธิภาพเหนือมนุษย์ ICDM:117-126. ลิงค์
จู้ หยาน และคณะ (2017) การใช้ประโยชน์จากอัลกอริธึมใหม่และ GPU เพื่อทำลายกำแพงการเปรียบเทียบแบบคู่สิบล้านล้านล้านสำหรับลวดลายและการรวมอนุกรมเวลา ไคส:203-236. ลิงค์
จู้ หยาน และคณะ (2018) Matrix Profile XI: SCRIMP++: การค้นพบ Motif อนุกรมเวลาด้วยความเร็วเชิงโต้ตอบ ICDM:837-846. ลิงค์
ใช่แล้ว Chin-Chia Michael และคณะ (2018) การรวมอนุกรมเวลา ลวดลาย ความไม่ลงรอยกัน และรูปทรงต่างๆ: มุมมองแบบรวมที่ใช้ประโยชน์จากโปรไฟล์เมทริกซ์ ดิสก์ข้อมูลขั้นต่ำความรู้: 83-123 ลิงค์
ฆารกาบี, ชากาเยห์ และคณะ (2018) "Matrix Profile XII: MPdist: การวัดระยะทางอนุกรมเวลาแบบใหม่เพื่อให้สามารถขุดข้อมูลในสถานการณ์ที่ท้าทายยิ่งขึ้น" ICDM:965-970. ลิงค์
ซิมเมอร์แมน, แซคารี และคณะ (2019) Matrix Profile XIV: Scaling Time Series Motif Discovery ด้วย GPU เพื่อทำลายการเปรียบเทียบแบบคู่นับล้านล้านล้านต่อวันและหลังจากนั้น SoCC '19:74-86. ลิงค์
อัคบาริเนีย, เรซา และเบทรานด์ โคลเอซ (2019) การคำนวณโปรไฟล์เมทริกซ์ที่มีประสิทธิภาพโดยใช้ฟังก์ชันระยะทางที่แตกต่างกัน arXiv:1901.05708. ลิงค์
คัมการ์, คาเวห์ และคณะ (2019) โปรไฟล์เมทริกซ์ XV: การใช้ประโยชน์จากแรงจูงใจฉันทามติอนุกรมเวลาเพื่อค้นหาโครงสร้างในชุดอนุกรมเวลา ICDM:1156-1161. ลิงค์