Làm thế nào để bạn sử dụng tích chập trong python?

Cách tính tích chập trong Python. Dưới đây là 3 gói python phổ biến nhất để tích chập + triển khai Python thuần túy

jake

Ngày 1 tháng 8 năm 2022 6 phút đọc

Tích chập là một trong những phép toán cơ bản trong xử lý tín hiệu. Tương tự như tương quan chéo, nó có thể được sử dụng để phân tích sự giống nhau của hai tín hiệu có độ trễ khác nhau.  

Có nhiều ứng dụng để tích chập. Nó đặc biệt phổ biến trong xử lý hình ảnh và thị giác máy, nơi tích chập đã được phát hiện cạnh và các ứng dụng tương tự. Sự kết hợp của tín hiệu đầu vào và đáp ứng xung tạo ra đầu ra của hệ thống bất biến thời gian tuyến tính. Điều này làm cho nó trở thành một hoạt động rất phổ biến trong kỹ thuật điện.  

Dưới đây, bạn có thể xem hình minh họa về tích chập giữa xung vuông và xung tam giác

Tích chập giữa xung vuông và xung tam giác

Trong các bài viết trước, chúng ta cũng đã tìm hiểu về các thao tác liên quan và cách triển khai chúng trong Python

  • tự tương quan
  • tương quan chéo

Chúng ta sẽ xem xét ba gói để tính tích chập trong Python + triển khai Python thuần túy mà không có bất kỳ phụ thuộc nào

  • Nặng nề
  • scipy
  • thiên văn

tích chập định nghĩa

Tích chập được định nghĩa là tích phân của tích hai tín hiệu [hàm], trong đó một trong các tín hiệu bị đảo ngược theo thời gian. Nó có liên quan chặt chẽ với tương quan chéo. Trên thực tế, đó là mối tương quan chéo sau khi một trong các tín hiệu bị đảo ngược

https. // vi. wikipedia. org/wiki/tích chập

Định nghĩa khá đơn giản, bạn chồng hai tín hiệu với độ trễ nhất định và tương quan với tín hiệu sau theo thứ tự ngược lại. Đó là, một trong những tín hiệu bị đảo ngược. Chúng ta có thể viết điều này cho các tín hiệu rời rạc có giá trị thực như

\[R_{fg}[l] = \sum_{n=0}^N  f[n]g[n - l]\]

Trong phần sau, bạn có thể thấy một hình ảnh động đơn giản làm nổi bật quá trình. Lưu ý cách đảo hàm tam giác trước khi thực hiện tương quan chéo, ban đầu để đảo ngược tín hiệu đầu vào và thực hiện tích chập

Có thể tìm thấy định nghĩa cho các tín hiệu phức tạp, liên tục và ngẫu nhiên, e. g. , từ Wikipedia

Tập dữ liệu và số lượng độ trễ để tính toán

Trước khi đi vào các phương pháp tính tích chập, chúng ta cần có một số dữ liệu. Chúng tôi sử dụng hai tín hiệu làm bộ dữ liệu của mình. Cái đầu tiên là xung vuông và cái thứ hai là xung tam giác

def sig_square[x]:
  return 0 if x < 3 or x > 5 else 2

def sig_triag[x]:
  return 0 if x < 0 or x > 2 else x

# First signal [square pulse]
sig1 = [sig_square[x/100] for x in range[1000]]

# Seconds signal [triangle pulse]
sig2 = [sig_triag[x/100] for x in range[200]]

Để đơn giản, chúng tôi xem xét tập dữ liệu một chiều. Tất cả các gói được xem xét cũng hoạt động với dữ liệu 2D. Điều này cung cấp một ứng dụng rõ ràng để xử lý hình ảnh

tích chập. 3 gói thiết yếu + triển khai python thuần túy

Bây giờ, chúng ta đã sẵn sàng đi sâu vào các triển khai tích chập khác nhau. Chúng tôi bắt đầu với việc triển khai chỉ dành cho Python. Điều này cho chúng ta cơ sở. Sau đó, chúng tôi so sánh kết quả với 3 gói xử lý tín hiệu thiết yếu cung cấp triển khai tích chập của riêng chúng

Triển khai python bản địa

Đây là phương pháp chỉ dành cho Python mà không có bất kỳ phụ thuộc bên ngoài nào để tính toán mối tương quan chéo. Để đơn giản, chúng tôi không xem xét bất kỳ phần đệm nào. Nghĩa là, chúng tôi sẽ chỉ xem xét độ trễ khi các tín hiệu trùng nhau hoàn toàn

''' Python only implementation '''
import matplotlib.pyplot as plt # Plotting only

# Pre-allocate correlation array
conv = [len[sig1] - len[sig2]] * [0]

# Go through lag components one-by-one
for l in range[len[conv]]:
  for i in range[len[sig2]]:
    conv[l] += sig1[l-i+len[sig2]] * sig2[i]

  conv[l] /= len[sig2] # Normalize

plt.plot[conv]
Thực hiện tích chập trong Python

Đầu ra cho việc triển khai vanilla Python sẽ giống như

Triển khai tích chập Python thuần túy

Nặng nề

Khi thực hiện bất kỳ tính toán số hoặc khoa học nào bằng Python, NumPy thường là gói đầu tiên sẽ được nhập. NumPy có sẵn một triển khai tiện lợi để tích chập

Bạn có thể chọn

''' Python only implementation '''
import matplotlib.pyplot as plt # Plotting only

# Pre-allocate correlation array
conv = [len[sig1] - len[sig2]] * [0]

# Go through lag components one-by-one
for l in range[len[conv]]:
  for i in range[len[sig2]]:
    conv[l] += sig1[l-i+len[sig2]] * sig2[i]

  conv[l] /= len[sig2] # Normalize

plt.plot[conv]
1 để xử lý các tín hiệu chồng lấp một phần, tôi. e. , đệm ở đầu và cuối tín hiệu. Chúng tôi sử dụng
''' Python only implementation '''
import matplotlib.pyplot as plt # Plotting only

# Pre-allocate correlation array
conv = [len[sig1] - len[sig2]] * [0]

# Go through lag components one-by-one
for l in range[len[conv]]:
  for i in range[len[sig2]]:
    conv[l] += sig1[l-i+len[sig2]] * sig2[i]

  conv[l] /= len[sig2] # Normalize

plt.plot[conv]
2, chỉ xem xét các tín hiệu chồng chéo hoàn toàn. Điều này làm cho việc so sánh với triển khai tham chiếu chỉ dành cho Python của chúng tôi dễ dàng hơn.  

''' NumPy implementation '''
import matplotlib.pyplot as plt
import numpy as np

conv = np.convolve[sig1, sig2, mode='valid']

conv /= len[sig2] # Normalize

plt.plot[conv]
Thực hiện tích chập bằng NumPy

Đầu ra của triển khai NumPy giống hệt với triển khai chỉ dành cho Python, cũng có thể được sử dụng để xác minh việc triển khai của chúng tôi

Tích chập trong NumPy

Kiểm tra hướng dẫn tham khảo NumPy để biết thêm ví dụ

scipy

SciPy là gói dành cho phân tích số và đặc biệt là nhiều phương pháp dành riêng cho xử lý tín hiệu. Bất cứ khi nào NumPy thiếu phương thức, SciPy sẽ là mục tiêu tiếp theo để thực hiện

Convolution có thể được tìm thấy trong gói

''' Python only implementation '''
import matplotlib.pyplot as plt # Plotting only

# Pre-allocate correlation array
conv = [len[sig1] - len[sig2]] * [0]

# Go through lag components one-by-one
for l in range[len[conv]]:
  for i in range[len[sig2]]:
    conv[l] += sig1[l-i+len[sig2]] * sig2[i]

  conv[l] /= len[sig2] # Normalize

plt.plot[conv]
3. Phương pháp này cung cấp các lựa chọn đệm tương tự như NumPy. Ngoài ra, bạn có thể chọn giữa triển khai
''' Python only implementation '''
import matplotlib.pyplot as plt # Plotting only

# Pre-allocate correlation array
conv = [len[sig1] - len[sig2]] * [0]

# Go through lag components one-by-one
for l in range[len[conv]]:
  for i in range[len[sig2]]:
    conv[l] += sig1[l-i+len[sig2]] * sig2[i]

  conv[l] /= len[sig2] # Normalize

plt.plot[conv]
4 và
''' Python only implementation '''
import matplotlib.pyplot as plt # Plotting only

# Pre-allocate correlation array
conv = [len[sig1] - len[sig2]] * [0]

# Go through lag components one-by-one
for l in range[len[conv]]:
  for i in range[len[sig2]]:
    conv[l] += sig1[l-i+len[sig2]] * sig2[i]

  conv[l] /= len[sig2] # Normalize

plt.plot[conv]
5. Triển khai trực tiếp tuân theo định nghĩa về tích chập tương tự như triển khai Python thuần túy mà chúng ta đã xem xét trước đây. Cách tiếp cận dựa trên
''' Python only implementation '''
import matplotlib.pyplot as plt # Plotting only

# Pre-allocate correlation array
conv = [len[sig1] - len[sig2]] * [0]

# Go through lag components one-by-one
for l in range[len[conv]]:
  for i in range[len[sig2]]:
    conv[l] += sig1[l-i+len[sig2]] * sig2[i]

  conv[l] /= len[sig2] # Normalize

plt.plot[conv]
5 thực hiện tích chập trong miền Fourier, có thể hiệu quả hơn đối với các tín hiệu dài

''' SciPy implementation '''
import matplotlib.pyplot as plt
import scipy.signal as sig

conv = sig.convolve[sig1, sig2, mode='valid']

conv /= len[sig2] # Normalize

plt.plot[conv]

Đầu ra của triển khai SciPy giống hệt với triển khai chỉ dành cho Python và NumPy

Convolution sử dụng SciPy

Kiểm tra hướng dẫn tham khảo SciPy để biết thêm ví dụ

thiên văn

Astropy là gói tập trung vào thiên văn học và ít phổ biến hơn các gói nói trên. Tuy nhiên, nó chứa các chức năng có mục đích chung như

''' Python only implementation '''
import matplotlib.pyplot as plt # Plotting only

# Pre-allocate correlation array
conv = [len[sig1] - len[sig2]] * [0]

# Go through lag components one-by-one
for l in range[len[conv]]:
  for i in range[len[sig2]]:
    conv[l] += sig1[l-i+len[sig2]] * sig2[i]

  conv[l] /= len[sig2] # Normalize

plt.plot[conv]
1 cũng hữu ích cho các miền xử lý tín hiệu khác

Tích chập trong Astropy nhằm cải thiện việc triển khai SciPy, đặc biệt là đối với

''' Python only implementation '''
import matplotlib.pyplot as plt # Plotting only

# Pre-allocate correlation array
conv = [len[sig1] - len[sig2]] * [0]

# Go through lag components one-by-one
for l in range[len[conv]]:
  for i in range[len[sig2]]:
    conv[l] += sig1[l-i+len[sig2]] * sig2[i]

  conv[l] /= len[sig2] # Normalize

plt.plot[conv]
2. Một số cải tiến này bao gồm

  • Xử lý đúng các giá trị NaN [bỏ qua chúng trong quá trình tích chập và thay thế các pixel NaN bằng các giá trị được nội suy]
  • Một chức năng duy nhất cho tích chập 1D, 2D và 3D
  • Các tùy chọn cải tiến để xử lý các cạnh
  • Cả phiên bản Biến đổi Fourier trực tiếp và Nhanh [FFT]
  • Hạt nhân tích hợp thường được sử dụng trong Thiên văn học

Ở đây, chúng tôi chỉ sử dụng tích chập 1D. Những cải tiến này rõ ràng hơn khi thực hiện tích chập chiều cao hơn

Dưới đây, bạn có thể xem cách sử dụng

''' Python only implementation '''
import matplotlib.pyplot as plt # Plotting only

# Pre-allocate correlation array
conv = [len[sig1] - len[sig2]] * [0]

# Go through lag components one-by-one
for l in range[len[conv]]:
  for i in range[len[sig2]]:
    conv[l] += sig1[l-i+len[sig2]] * sig2[i]

  conv[l] /= len[sig2] # Normalize

plt.plot[conv]
3 cho dữ liệu thử nghiệm của chúng tôi. Một hạn chế cần được quản lý là kernel cần có độ dài lẻ. Do đó, đối với độ dài tín hiệu chẵn, chúng tôi sẽ sử dụng phần đệm bằng 0 để làm cho tín hiệu có độ dài không đều

''' Astropy implementation '''
import matplotlib.pyplot as plt
import astropy 

# Astropy convolution requires the kernel dimensions to be odd. 
# Apply zero-padding to ensure odd dimensions
kernel = sig2
if [len[kernel] % 2 == 0]:
  kernel += [0] 

conv = astropy.convolution.convolve[sig1, kernel]

plt.plot[conv]
Thực hiện tích chập 1D trong Astropy

Lưu ý rằng chúng tôi không có chuẩn hóa rõ ràng ở đây, vì việc triển khai Astropy được bật chuẩn hóa theo mặc định

Điều này sẽ dẫn đến biểu đồ sau. Lưu ý cách đỉnh được dịch chuyển từ các phiên bản NumPy và SciPy. Hình dạng của chập là giống hệt nhau

Biểu đồ ví dụ tích chập Astropy

Kiểm tra hướng dẫn tham khảo Astropy để biết thêm ví dụ

Bản tóm tắt

Chúng tôi không so sánh hiệu suất của các phương pháp tích chập. Nếu chúng ta bỏ qua những khác biệt về hiệu suất tiềm năng, thì đó là sự lựa chọn khá thuận tiện giữa các gói. Sử dụng bất kỳ gói nào bạn đang sử dụng. Nếu bạn muốn các tính năng nâng cao hơn một chút thì

''' Python only implementation '''
import matplotlib.pyplot as plt # Plotting only

# Pre-allocate correlation array
conv = [len[sig1] - len[sig2]] * [0]

# Go through lag components one-by-one
for l in range[len[conv]]:
  for i in range[len[sig2]]:
    conv[l] += sig1[l-i+len[sig2]] * sig2[i]

  conv[l] /= len[sig2] # Normalize

plt.plot[conv]
4 có thể là lựa chọn dành cho bạn. Nếu không, tôi sẽ chọn
''' Python only implementation '''
import matplotlib.pyplot as plt # Plotting only

# Pre-allocate correlation array
conv = [len[sig1] - len[sig2]] * [0]

# Go through lag components one-by-one
for l in range[len[conv]]:
  for i in range[len[sig2]]:
    conv[l] += sig1[l-i+len[sig2]] * sig2[i]

  conv[l] /= len[sig2] # Normalize

plt.plot[conv]
5 hoặc
''' Python only implementation '''
import matplotlib.pyplot as plt # Plotting only

# Pre-allocate correlation array
conv = [len[sig1] - len[sig2]] * [0]

# Go through lag components one-by-one
for l in range[len[conv]]:
  for i in range[len[sig2]]:
    conv[l] += sig1[l-i+len[sig2]] * sig2[i]

  conv[l] /= len[sig2] # Normalize

plt.plot[conv]
6. Phiên bản Python thuần túy chỉ nên được sử dụng để tham khảo hoặc nếu bạn thực sự đang cố gắng cắt giảm các phần phụ thuộc, vì rất có khả năng cần xem xét hiệu suất.  

Python hoạt động như thế nào?

Hoạt động của phương thức NumPy Convolve[] trong Python . integrating the first array, reverse it and then convolve onto the second array and then multiply at those points where arrays overlap, which will yield a discrete and linear convolution array.

tích chập giải thích với ví dụ là gì?

Tích chập có thể được định nghĩa cho hàm trên không gian Euclide và các nhóm khác [dưới dạng cấu trúc đại số] . Ví dụ: các hàm tuần hoàn, chẳng hạn như biến đổi Fourier thời gian rời rạc, có thể được xác định trên một vòng tròn và được tích chập bởi phép tích chập tuần hoàn.

Chủ Đề