CWT ที่สเกลต่ำ: PyWavelets vs Scipy

Oct 07 2020

เครื่องชั่งต่ำเป็นเนื้อหาที่ท้าทายที่สุดในการนำไปใช้เนื่องจากข้อ จำกัด ในการนำเสนอที่แยกไม่ออก เปรียบเทียบรายละเอียดที่นี่ ; ความแตกต่างที่สำคัญคือวิธีที่ทั้งสองจัดการเวฟเล็ตในแต่ละสเกล :

  • pywt : diffของการint_psi สุ่มตัวอย่างในแต่ละมาตราส่วน, self-normalized ( caveat2 );int_psi == cumsum(psi)
  • scipy : เวฟเล็ตถูกคำนวณใหม่และทำให้เป็นมาตรฐานอย่างชัดเจนในแต่ละสเกล

(สำหรับ pywt มันไม่ตรงdiff(int_psi)แต่ลักษณะการทำงานที่สำคัญเทียบเท่ากัน) ด้านล่างพล็อตเปรียบเทียบมอร์เล็ต CWT จริงและซับซ้อนสำหรับสัญญาณการเปลี่ยนที่คม ค่าสัมประสิทธิ์ทั้งหมดเป็นมาตรฐาน L1

ฉันไม่ได้รับอะไรมากจากการตรวจสอบรูปร่างของเวฟเล็ตตามลำดับ (สีน้ำเงิน = recomputed, orange = resampled, ทั้งปรับขนาด -1 ถึง 1):

ข้อตกลงคืออะไร? ฉันพลาดอะไรบางอย่างในความแตกต่างของการแยกแยะหรือวิธีการเวฟเล็ตแบบรวมของ pywt เหนือกว่าสำหรับเครื่องชั่งที่ต่ำกว่า (ถ้าเป็นเช่นนั้นทำไม)

คำตอบ

OverLordGoldDragon Oct 09 2020 at 04:17

คำตัดสิน : ฉันสรุปได้ว่าจุดสูงสุดด้านซ้ายสุดที่สูงกว่าของ scipy นั้นเกิดจากความกว้างที่ต่ำกว่าของ wavelets ของ pywt ที่สเกลที่ต่ำกว่าและความสัมพันธ์ที่แข็งแกร่งของเวฟเล็ตของ scipy กับความถี่ที่ต่ำกว่า โดยรวมแล้วทั้งคู่มีความสัมพันธ์โดยประมาณเท่า ๆ กันกับความถี่ที่ไม่เกี่ยวข้อง (scipy แย่กว่าเล็กน้อย) แต่ pywt "โชคดี" ด้วยความสัมพันธ์ที่ไม่ดีถูกหักล้างด้วยแอมพลิจูดของเวฟเล็ตที่เล็กกว่าที่สเกลต่ำดังนั้นจุดสูงสุดที่เล็กกว่า

ฉันไม่แน่ใจว่าทำไมการคำนวณซ้ำโดยตรงของ Scipy จึงแย่กว่าการสุ่มตัวอย่างของ pywt ฉันจะบอกว่าปัญหาในการแก้ปัญหาด้วยจำนวนตัวอย่างที่ จำกัด ในช่วงต้นและการสุ่มตัวอย่างแบบบูรณาการใหม่ทำงานได้ดีขึ้น (ก็นานกว่าเล็กน้อย) แต่ยังไม่ได้ตรวจสอบอย่างชัดเจน

สำหรับการประเมินเพิ่มเติมเกี่ยวกับ pywt vs scipy ระดับต่ำดูหัวข้อด้านล่าง คำตอบที่เหลือทำหน้าที่ในการพิสูจน์คำตัดสิน แต่ไม่ได้เพิ่มเติมอะไรมาก ข้อมูลที่ให้ข้อมูลมากที่สุดคือรูปที่ 2 มีรหัสบางส่วนซึ่งสามารถใช้ซ้ำเพื่อทดสอบการแปลงอื่น ๆ ได้


บรรทัดฐานที่ไร้เดียงสามากขึ้นชี้ไปที่คำตอบ ค่า coeffs มาตราส่วนศูนย์ + ค่าเฉลี่ยระหว่าง$[-1,1]$ ต่อมาตราส่วน:

สำหรับพล็อตด้านบน a $[0,1]$-rescale มีค่าเท่ากันดังนั้นจึงแสดงความสัมพันธ์ที่เป็นมาตรฐานกับเวฟเล็ตโดยไม่คำนึงถึงพลังงาน (จริง ๆ แล้วไม่มากข้อแม้ 1) สิ่งนี้ชี้ให้เห็นถึงความแตกต่างที่จะเกิดขึ้นในแอมพลิจูดเวฟเล็ต มาเปรียบเทียบกัน (- coeffs code3 )


มีความสัมพันธ์แตกต่างกันหรือไม่? - สำหรับทุกแปลง blue = scipy, orange = pywt

มาตราส่วนที่เป็นมาตรฐาน : แบ่งเวกเตอร์สเกลแต่ละตัวด้วยค่าสูงสุดของตัวเอง (ความสัมพันธ์สัมบูรณ์สูงสุดระหว่างช่วงเวลาทั้งหมด) พล็อตค่าสัมบูรณ์ของเวกเตอร์สเกลแต่ละตัวเวลาจึงเลื่อนตามแนวนอน ค่าที่มากขึ้นในการเปลี่ยนเวลาที่กำหนดแสดงถึงความสัมพันธ์ที่มากขึ้นของมาตราส่วนที่ลงจุดโดยเทียบกับการเปลี่ยนแปลงเวลาอื่น ๆ ทั้งหมดในระดับนั้น

  • ด้านบนแสดงสเกลเริ่มต้นของ Scipy ที่มีความสัมพันธ์เทียบเคียงกันในแต่ละสเกลสำหรับทั้งสองครึ่งของสัญญาณในขณะที่ pywt ครึ่งขวานั้นเด่นกว่า
  • สิ่งนี้หมายความว่า scipy มีความสัมพันธ์อย่างมากกับความถี่ต่ำที่สเกลต่ำกว่า pywt (เช่นสำหรับแอมพลิจูดเวฟเล็ตเดียวกัน) หรือไม่? ครับ ; เราจะได้มาตราฐานสเกลที่เหมือนกันถ้าเราบังคับให้แอมพลิจูดของเวฟเล็ตเหมือนกัน ดูพล็อตการปรับขนาดแอมพลิจูดที่ซูมได้ในรูปที่ 2 สังเกตว่าที่ดัชนี 2 และ 4 pywt เกิน scipy อย่างไรและสังเกต gif ด้านบน

Timeshift-standardized : หารเวกเตอร์ไทม์ชิฟต์แต่ละตัวด้วยค่าสูงสุดของตัวเอง (ความสัมพันธ์สัมบูรณ์สูงสุดในทุกสเกล ) พล็อตค่าสัมบูรณ์ของเวกเตอร์สเกลแต่ละตัวเวลาจึงเลื่อนตามแนวนอน ค่าที่มากขึ้นในการเปลี่ยนเวลาที่กำหนดแสดงถึงความสัมพันธ์ที่มากขึ้นของมาตราส่วนที่พล็อตเมื่อเทียบกับสเกลอื่น ๆ ทั้งหมดที่ไทม์ชิฟต์

  • ด้านบนแสดงให้เห็นว่าสำหรับครึ่งซ้ายมีความแข็งแรงสหสัมพันธ์เท่ากันสำหรับเครื่องชั่งทั้ง 20 เครื่องเมื่อเทียบกับมาตราส่วนที่มีความสัมพันธ์ที่แข็งแกร่งที่สุด ครึ่งขวามีความผันผวนมากขึ้นสำหรับทั้งคู่ แต่ scipy ยังคงทวีคูณตัวเองเหนือ pywt นี่แสดงถึงความคลาดเคลื่อนของพลังงานส่วนใหญ่ที่สเกลเหล่านี้เกิดจากครึ่งขวา
  • แต่ทำไมถึงเกิดครึ่งขวา? แล้วทำไมครึ่งซ้ายถึงค่อนข้างคงที่? รูปที่ 1; ไปทางสเกลที่สูงขึ้น (ความถี่ต่ำกว่าครึ่งซ้าย) scipy และ pywt ตกลงทั้งในแอมพลิจูดและรูปร่างของเวฟเล็ต

การเปรียบเทียบแอมพลิจูดของเวฟเล็ต

แทนที่จะดูที่แอมพลิจูดสูงสุดฉันกำหนดหน่วยวัดของ "แอมพลิจูดเฉลี่ย": ค่าเฉลี่ยของค่าสัมบูรณ์ของเวฟเล็ตที่ตัดแต่งหางโดยที่ "tail" = absval 1e7 เท่าน้อยกว่าแอมพลิจูดสูงสุด (แทนที่จะเป็นศูนย์โดยเคร่งครัดซึ่งหายากกว่า) นี่คือการทำให้เป็นกลางสำหรับเวฟเล็ตที่มีหางยาว: (- code2 )

left  = [i for i, v in enumerate(x)       if abs(v) > x.max() / 1e7][0]
right = [i for i, v in enumerate(x[::-1]) if abs(v) > x.max() / 1e7][0]
meanamp = np.mean(np.abs(x[left:-(right + 1)]))

ที่scales[0]อัตราส่วนคือ 2.58 - เมื่อกำลังสองสำหรับพลังงานนั่นคือค่าสัมประสิทธิ์ที่ใหญ่กว่า x6.64 สำหรับ scipy เนื่องจากความแตกต่างของแอมพลิจูดของเวฟเล็ตเพียงอย่างเดียว อย่างไรก็ตามอัตราส่วนของพลังงานของสัมประสิทธิ์ในระดับนั้นคือ 8.33 ดังนั้นจึงมีอีกปัจจัยหนึ่ง - และปัจจัยนี้ก็คือความสัมพันธ์ที่แข็งแกร่งของ Scipy กับส่วนความถี่ต่ำของสัญญาณดังที่แสดงไว้ก่อนหน้านี้

หากต้องการดูว่าแอมพลิจูดคิดเป็นเท่าใดเราสามารถทำให้เป็นมาตรฐานได้ ค่าสัมประสิทธิ์สเกลตามอัตราส่วนของแอมพลิจูด (ค่าเฉลี่ย):

เราเห็นว่าพลังของ Scipy ของสเกลที่ต่ำกว่าส่วนใหญ่จะมีขนาดใหญ่กว่าแม้จะมีแอมพลิจูดที่คิดเป็นก็ตามเหลือเพียงความสัมพันธ์ที่เป็นที่มาของความแตกต่าง นอกจากนี้ยังน่าสนใจที่จะเห็น pywt มีความสัมพันธ์กันอย่างมากในโหมดจริงแรก (~ สเกล 50)


Caveat1: รูปที่ 0 ทำให้เข้าใจผิด

สังเกตเห็น scipy กระโดดเหนือ pywt ที่ขอบด้านขวา แต่ถ้าเราดูที่แอมพลิจูดค่าเฉลี่ย logscale pywt จะมากกว่าและมีความสัมพันธ์กันมากขึ้นตามพล็อตที่กำหนดแอมพลิจูด ข้อตกลงคืออะไร? จำได้ว่ามีการกำหนดพล็อตเรื่องมาตราส่วนอย่างไร สิ่งนี้เหมือนกัน แต่ตอนนี้สำหรับสัมประสิทธิ์ - เวกเตอร์สเกลจะถูกปรับขนาดโดยสัมพันธ์กับตัวมันเองแทนที่จะอยู่ระหว่าง pywt และ scipy

ค่าที่มากขึ้นในรูปที่ 0 จะส่งผลให้หากคะแนนส่วนใหญ่ไม่ได้ต่ำกว่าค่าสูงสุด (เนื่องจากคะแนนทั้งหมดหารด้วยสูงสุด) ตลอดการเปลี่ยนเวลาหรือเวฟเล็ตที่มาตราส่วนมีความสัมพันธ์อย่างสม่ำเสมอมากขึ้นสำหรับการเปลี่ยนเวลาแต่ละครั้ง ดังนั้นจึงเป็นการวัดความสม่ำเสมอมากกว่า นี่คือมาตราส่วนสุดท้ายที่แสดงสำหรับการเปลี่ยนเวลาทุกครั้ง:


ดังนั้น ... pywt จะดีกว่าที่เกล็ดต่ำ? - ไม่แน่นอน แต่ pywt ชนะในสองกรณีการทดสอบที่สำคัญ:

ความถี่สูงสุดที่สูงขึ้น

สัญญาณความถี่รวมที่มีเสียงดัง