SciPy - Hướng dẫn nhanh
SciPy, phát âm là Sigh Pi, là một mã nguồn mở python khoa học, được phân phối theo thư viện được cấp phép BSD để thực hiện các phép tính Toán học, Khoa học và Kỹ thuật.
Thư viện SciPy phụ thuộc vào NumPy, cung cấp khả năng thao tác mảng N chiều thuận tiện và nhanh chóng. Thư viện SciPy được xây dựng để làm việc với các mảng NumPy và cung cấp nhiều thực hành số hiệu quả và thân thiện với người dùng, chẳng hạn như các quy trình để tích hợp và tối ưu hóa số. Cùng với nhau, chúng chạy trên tất cả các hệ điều hành phổ biến, cài đặt nhanh chóng và miễn phí. NumPy và SciPy rất dễ sử dụng, nhưng đủ mạnh để phụ thuộc vào một số nhà khoa học và kỹ sư hàng đầu thế giới.
Gói phụ SciPy
SciPy được tổ chức thành các gói con bao gồm các lĩnh vực máy tính khoa học khác nhau. Những điều này được tóm tắt trong bảng sau:
scipy.cluster | Lượng tử hóa vector / Kmeans |
scipy.constants | Hằng số vật lý và toán học |
scipy.fftpack | Biến đổi Fourier |
scipy.integrate | Quy trình tích hợp |
scipy.interpolate | Nội suy |
scipy.io | Đầu vào và đầu ra dữ liệu |
scipy.linalg | Các quy trình đại số tuyến tính |
scipy.ndimage | gói hình ảnh n-chiều |
scipy.odr | Hồi quy khoảng cách trực giao |
scipy.optimize | Tối ưu hóa |
scipy.signal | Xử lý tín hiệu |
scipy.sparse | Ma trận thưa thớt |
scipy.spatial | Cấu trúc dữ liệu không gian và thuật toán |
scipy.special | Bất kỳ hàm toán học đặc biệt nào |
scipy.stats | Số liệu thống kê |
Cấu trúc dữ liệu
Cấu trúc dữ liệu cơ bản được SciPy sử dụng là một mảng đa chiều được cung cấp bởi mô-đun NumPy. NumPy cung cấp một số hàm cho Đại số tuyến tính, Biến đổi Fourier và Tạo số ngẫu nhiên, nhưng không cung cấp tính tổng quát của các hàm tương đương trong SciPy.
Bản phân phối Python chuẩn không đi kèm với bất kỳ mô-đun SciPy nào. Một giải pháp thay thế nhẹ là cài đặt SciPy bằng trình cài đặt gói Python phổ biến,
pip install pandas
Nếu chúng tôi cài đặt Anaconda Python package, Pandas sẽ được cài đặt theo mặc định. Sau đây là các gói và liên kết để cài đặt chúng trong các hệ điều hành khác nhau.
các cửa sổ
Anaconda (từ https://www.continuum.io) là một bản phân phối Python miễn phí cho ngăn xếp SciPy. Nó cũng có sẵn cho Linux và Mac.
Canopy (https://www.enthought.com/products/canopy/) có sẵn miễn phí, cũng như để phân phối thương mại với ngăn xếp SciPy đầy đủ cho Windows, Linux và Mac.
Python (x,y)- Đây là một bản phân phối Python miễn phí với ngăn xếp SciPy và Spyder IDE cho hệ điều hành Windows. (Có thể tải xuống từhttps://python-xy.github.io/)
Linux
Trình quản lý gói của các bản phân phối Linux tương ứng được sử dụng để cài đặt một hoặc nhiều gói trong ngăn xếp SciPy.
Ubuntu
Chúng ta có thể sử dụng đường dẫn sau để cài đặt Python trong Ubuntu.
sudo apt-get install python-numpy python-scipy
python-matplotlibipythonipython-notebook python-pandas python-sympy python-nose
Fedora
Chúng ta có thể sử dụng đường dẫn sau để cài đặt Python trong Fedora.
sudo yum install numpyscipy python-matplotlibipython python-pandas
sympy python-nose atlas-devel
Theo mặc định, tất cả các chức năng NumPy đã có sẵn thông qua không gian tên SciPy. Không cần nhập các chức năng NumPy một cách rõ ràng, khi SciPy được nhập. Đối tượng chính của NumPy là mảng đa chiều thuần nhất. Nó là một bảng các phần tử (thường là số), tất cả đều cùng kiểu, được lập chỉ mục bởi một bộ số nguyên dương. Trong NumPy, các thứ nguyên được gọi là trục. Số lượngaxes được gọi là rank.
Bây giờ, chúng ta hãy sửa lại chức năng cơ bản của Vectơ và Ma trận trong NumPy. Vì SciPy được xây dựng dựa trên các mảng NumPy nên bạn cần hiểu những điều cơ bản về NumPy. Vì hầu hết các phần của đại số tuyến tính chỉ đề cập đến ma trận.
NumPy Vector
Một Vector có thể được tạo theo nhiều cách. Một số trong số chúng được mô tả dưới đây.
Chuyển đổi các đối tượng giống mảng Python thành NumPy
Chúng ta hãy xem xét ví dụ sau.
import numpy as np
list = [1,2,3,4]
arr = np.array(list)
print arr
Kết quả của chương trình trên sẽ như sau.
[1 2 3 4]
Tạo mảng NumPy nội tại
NumPy có các chức năng tích hợp để tạo mảng từ đầu. Một số chức năng này được giải thích bên dưới.
Sử dụng số không ()
Hàm số không (hình dạng) sẽ tạo một mảng chứa các giá trị 0 với hình dạng được chỉ định. Loại mặc định là float64. Chúng ta hãy xem xét ví dụ sau.
import numpy as np
print np.zeros((2, 3))
Kết quả của chương trình trên sẽ như sau.
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
Sử dụng những cái ()
Hàm ones (shape) sẽ tạo một mảng chứa 1 giá trị. Nó giống hệt với số không trong tất cả các khía cạnh khác. Chúng ta hãy xem xét ví dụ sau.
import numpy as np
print np.ones((2, 3))
Kết quả của chương trình trên sẽ như sau.
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
Sử dụng arange ()
Hàm arange () sẽ tạo mảng có giá trị tăng đều đặn. Chúng ta hãy xem xét ví dụ sau.
import numpy as np
print np.arange(7)
Chương trình trên sẽ tạo ra kết quả sau.
array([0, 1, 2, 3, 4, 5, 6])
Xác định kiểu dữ liệu của các giá trị
Chúng ta hãy xem xét ví dụ sau.
import numpy as np
arr = np.arange(2, 10, dtype = np.float)
print arr
print "Array Data Type :",arr.dtype
Chương trình trên sẽ tạo ra kết quả sau.
[ 2. 3. 4. 5. 6. 7. 8. 9.]
Array Data Type : float64
Sử dụng linspace ()
Hàm linspace () sẽ tạo mảng với một số phần tử được chỉ định, các phần tử này sẽ được đặt cách đều giữa các giá trị đầu và cuối được chỉ định. Chúng ta hãy xem xét ví dụ sau.
import numpy as np
print np.linspace(1., 4., 6)
Chương trình trên sẽ tạo ra kết quả sau.
array([ 1. , 1.6, 2.2, 2.8, 3.4, 4. ])
Ma trận
Ma trận là một mảng 2-D chuyên biệt vẫn giữ bản chất 2-D của nó thông qua các phép toán. Nó có một số toán tử đặc biệt, chẳng hạn như * (phép nhân ma trận) và ** (sức mạnh ma trận). Chúng ta hãy xem xét ví dụ sau.
import numpy as np
print np.matrix('1 2; 3 4')
Chương trình trên sẽ tạo ra kết quả sau.
matrix([[1, 2],
[3, 4]])
Liên hợp Transpose of Matrix
Tính năng này trả về chuyển vị liên hợp (phức tạp) của self. Chúng ta hãy xem xét ví dụ sau.
import numpy as np
mat = np.matrix('1 2; 3 4')
print mat.H
Chương trình trên sẽ tạo ra kết quả sau.
matrix([[1, 3],
[2, 4]])
Chuyển vị của ma trận
Tính năng này trả về chuyển vị của bản thân. Chúng ta hãy xem xét ví dụ sau.
import numpy as np
mat = np.matrix('1 2; 3 4')
mat.T
Chương trình trên sẽ tạo ra kết quả sau.
matrix([[1, 3],
[2, 4]])
Khi chúng ta chuyển một ma trận, chúng ta tạo một ma trận mới có các hàng là các cột của ma trận ban đầu. Mặt khác, một phép chuyển vị liên hợp sẽ thay đổi chỉ số hàng và cột cho mỗi phần tử ma trận. Nghịch đảo của một ma trận là một ma trận mà nếu nhân với ma trận ban đầu, kết quả là một ma trận đồng nhất.
K-means clusteringlà một phương pháp để tìm các cụm và trung tâm cụm trong một tập hợp dữ liệu chưa được gắn nhãn. Theo trực giác, chúng ta có thể nghĩ về một cụm - bao gồm một nhóm các điểm dữ liệu, có khoảng cách giữa các điểm là nhỏ so với khoảng cách đến các điểm bên ngoài cụm. Cho trước một tập K tâm ban đầu, thuật toán K-mean lặp lại hai bước sau:
Đối với mỗi trung tâm, tập hợp con của các điểm đào tạo (cụm của nó) gần với nó được xác định hơn bất kỳ trung tâm nào khác.
Giá trị trung bình của mỗi đối tượng cho các điểm dữ liệu trong mỗi cụm được tính toán và vectơ trung bình này trở thành trung tâm mới cho cụm đó.
Hai bước này được lặp đi lặp lại cho đến khi các tâm không còn di chuyển hoặc các nhiệm vụ không còn thay đổi. Sau đó, một điểm mớixcó thể được gán cho cụm của nguyên mẫu gần nhất. Thư viện SciPy cung cấp triển khai tốt thuật toán K-Means thông qua gói cụm. Hãy để chúng tôi hiểu cách sử dụng nó.
Triển khai K-Means trong SciPy
Chúng ta sẽ hiểu cách triển khai K-Means trong SciPy.
Nhập K-Means
Chúng ta sẽ thấy việc triển khai và sử dụng từng hàm được nhập.
from SciPy.cluster.vq import kmeans,vq,whiten
Tạo dữ liệu
Chúng ta phải mô phỏng một số dữ liệu để khám phá sự phân cụm.
from numpy import vstack,array
from numpy.random import rand
# data generation with three features
data = vstack((rand(100,3) + array([.5,.5,.5]),rand(100,3)))
Bây giờ, chúng ta phải kiểm tra dữ liệu. Chương trình trên sẽ tạo ra kết quả sau.
array([[ 1.48598868e+00, 8.17445796e-01, 1.00834051e+00],
[ 8.45299768e-01, 1.35450732e+00, 8.66323621e-01],
[ 1.27725864e+00, 1.00622682e+00, 8.43735610e-01],
…………….
Chuẩn hóa một nhóm quan sát trên cơ sở từng đối tượng địa lý. Trước khi chạy K-Means, sẽ có lợi khi bán lại từng kích thước tính năng của bộ quan sát với việc làm trắng. Mỗi đặc điểm được chia cho độ lệch chuẩn của nó trên tất cả các quan sát để tạo ra phương sai đơn vị.
Làm trắng dữ liệu
Chúng ta phải sử dụng đoạn mã sau để làm trắng dữ liệu.
# whitening of data
data = whiten(data)
Tính toán K-Means với ba cụm
Bây giờ chúng ta hãy tính K-Means với ba cụm bằng cách sử dụng đoạn mã sau.
# computing K-Means with K = 3 (2 clusters)
centroids,_ = kmeans(data,3)
Đoạn mã trên thực hiện K-Means trên một tập các vectơ quan sát tạo thành K cụm. Thuật toán K-Means điều chỉnh các trọng tâm cho đến khi không thể thực hiện đủ tiến độ, tức là sự thay đổi về độ méo, vì lần lặp cuối cùng nhỏ hơn một số ngưỡng. Ở đây, chúng ta có thể quan sát trung tâm của cụm bằng cách in biến centroid bằng cách sử dụng mã được đưa ra bên dưới.
print(centroids)
Đoạn mã trên sẽ tạo ra kết quả sau.
print(centroids)[ [ 2.26034702 1.43924335 1.3697022 ]
[ 2.63788572 2.81446462 2.85163854]
[ 0.73507256 1.30801855 1.44477558] ]
Gán mỗi giá trị cho một cụm bằng cách sử dụng mã được cung cấp bên dưới.
# assign each sample to a cluster
clx,_ = vq(data,centroids)
Các vq hàm so sánh từng vectơ quan sát trong 'M' với 'N' obsmảng với các trung tâm và chỉ định quan sát cho cụm gần nhất. Nó trả về cụm của mỗi quan sát và sự biến dạng. Chúng tôi cũng có thể kiểm tra độ méo. Hãy để chúng tôi kiểm tra cụm của mỗi quan sát bằng cách sử dụng mã sau.
# check clusters of observation
print clx
Đoạn mã trên sẽ tạo ra kết quả sau.
array([1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 2, 0, 2, 0, 1, 1, 1,
0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0,
0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0,
2, 2, 2, 1, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int32)
Các giá trị khác biệt 0, 1, 2 của mảng trên chỉ ra các cụm.
Gói hằng số SciPy cung cấp một loạt các hằng số, được sử dụng trong lĩnh vực khoa học nói chung.
Gói SciPy Constants
Các scipy.constants packagecung cấp các hằng số khác nhau. Chúng ta phải nhập hằng số được yêu cầu và sử dụng chúng theo yêu cầu. Hãy để chúng tôi xem các biến hằng số này được nhập và sử dụng như thế nào.
Để bắt đầu, chúng ta hãy so sánh giá trị 'pi' bằng cách xem xét ví dụ sau.
#Import pi constant from both the packages
from scipy.constants import pi
from math import pi
print("sciPy - pi = %.16f"%scipy.constants.pi)
print("math - pi = %.16f"%math.pi)
Chương trình trên sẽ tạo ra kết quả sau.
sciPy - pi = 3.1415926535897931
math - pi = 3.1415926535897931
Danh sách các hằng số có sẵn
Các bảng sau đây mô tả ngắn gọn các hằng số khác nhau.
Hằng số toán học
Sơ không. | Không thay đổi | Sự miêu tả |
---|---|---|
1 | số Pi | số Pi |
2 | vàng | Tỉ lệ vàng |
Hằng số vật lý
Bảng sau liệt kê các hằng số vật lý được sử dụng phổ biến nhất.
Sơ không. | Không đổi & Mô tả |
---|---|
1 | c Tốc độ ánh sáng trong chân không |
2 | speed_of_light Tốc độ ánh sáng trong chân không |
3 | h Hằng số Planck |
4 | Planck Hằng số Planck h |
5 | G Hằng số hấp dẫn của Newton |
6 | e Phí cơ bản |
7 | R Hằng số mol khí |
số 8 | Avogadro Hằng số Avogadro |
9 | k Hằng số Boltzmann |
10 | electron_mass(OR) m_e Khối lượng điện tử |
11 | proton_mass (OR) m_p Khối lượng proton |
12 | neutron_mass(OR)m_n Khối lượng nơtron |
Các đơn vị
Bảng sau đây có danh sách các đơn vị SI.
Sơ không. | Đơn vị | Giá trị |
---|---|---|
1 | milli | 0,001 |
2 | vi mô | 1e-06 |
3 | kg | 1000 |
Các đơn vị này bao gồm từ yotta, zetta, exa, peta, tera …… kilo, hector,… nano, pico,… đến zepto.
Các hằng số quan trọng khác
Bảng sau liệt kê các hằng số quan trọng khác được sử dụng trong SciPy.
Sơ không. | Đơn vị | Giá trị |
---|---|---|
1 | gram | 0,001 kg |
2 | khối lượng nguyên tử | Hằng số khối lượng nguyên tử |
3 | trình độ | Độ tính bằng radian |
4 | phút | Một phút trong vài giây |
5 | ngày | Một ngày trong vài giây |
6 | inch | Một inch tính bằng mét |
7 | micromet | Một micrômet trong mét |
số 8 | năm ánh sáng | Một năm ánh sáng tính bằng mét |
9 | ATM | Bầu không khí tiêu chuẩn trong pascal |
10 | mẫu Anh | Một mẫu Anh tính theo mét vuông |
11 | lít | Một lít sang mét khối |
12 | gallon | Một gallon tính bằng mét khối |
13 | kmh | Kilomét trên giờ tính bằng mét trên giây |
14 | độ_Fahrenheit | Một Fahrenheit tính bằng kelvins |
15 | eV | Một electron vôn tính bằng jun |
16 | hp | Một mã lực tính bằng watt |
17 | dyn | Một dyne trong newton |
18 | lambda2nu | Chuyển đổi bước sóng sang tần số quang học |
Nhớ tất cả những điều này là một chút khó khăn. Cách dễ dàng để lấy khóa nào dành cho chức năng nào vớiscipy.constants.find()phương pháp. Chúng ta hãy xem xét ví dụ sau.
import scipy.constants
res = scipy.constants.physical_constants["alpha particle mass"]
print res
Chương trình trên sẽ tạo ra kết quả sau.
[
'alpha particle mass',
'alpha particle mass energy equivalent',
'alpha particle mass energy equivalent in MeV',
'alpha particle mass in u',
'electron to alpha particle mass ratio'
]
Phương thức này trả về danh sách các khóa, không có gì khác nếu từ khóa không khớp.
Fourier Transformationđược tính toán trên một tín hiệu miền thời gian để kiểm tra hành vi của nó trong miền tần số. Phép biến đổi Fourier được ứng dụng trong các lĩnh vực như xử lý tín hiệu và tiếng ồn, xử lý hình ảnh, xử lý tín hiệu âm thanh, v.v. SciPy cung cấp mô-đun fftpack, cho phép người dùng tính toán các phép biến đổi Fourier nhanh chóng.
Sau đây là một ví dụ về một hàm sin, sẽ được sử dụng để tính toán biến đổi Fourier bằng cách sử dụng mô-đun fftpack.
Biến đổi Fourier nhanh
Hãy để chúng tôi hiểu chi tiết về biến đổi Fourier nhanh là gì.
Biến đổi Fourier rời rạc một chiều
FFT y [k] độ dài N của dãy-N độ dài x [n] được tính bằng fft () và phép biến đổi nghịch đảo được tính bằng ifft (). Chúng ta hãy xem xét ví dụ sau
#Importing the fft and inverse fft functions from fftpackage
from scipy.fftpack import fft
#create an array with random n numbers
x = np.array([1.0, 2.0, 1.0, -1.0, 1.5])
#Applying the fft function
y = fft(x)
print y
Chương trình trên sẽ tạo ra kết quả sau.
[ 4.50000000+0.j 2.08155948-1.65109876j -1.83155948+1.60822041j
-1.83155948-1.60822041j 2.08155948+1.65109876j ]
Hãy để chúng tôi xem xét một ví dụ khác
#FFT is already in the workspace, using the same workspace to for inverse transform
yinv = ifft(y)
print yinv
Chương trình trên sẽ tạo ra kết quả sau.
[ 1.0+0.j 2.0+0.j 1.0+0.j -1.0+0.j 1.5+0.j ]
Các scipy.fftpackmô-đun cho phép tính toán các phép biến đổi Fourier nhanh chóng. Như hình minh họa, tín hiệu đầu vào (nhiễu) có thể trông như sau:
import numpy as np
time_step = 0.02
period = 5.
time_vec = np.arange(0, 20, time_step)
sig = np.sin(2 * np.pi / period * time_vec) + 0.5 *np.random.randn(time_vec.size)
print sig.size
Chúng tôi đang tạo ra một tín hiệu với bước thời gian là 0,02 giây. Câu lệnh cuối cùng in ra kích thước của tín hiệu sig. Kết quả đầu ra sẽ như sau:
1000
Chúng tôi không biết tần số tín hiệu; chúng ta chỉ biết bước thời gian lấy mẫu của tín hiệu sig. Tín hiệu được cho là đến từ một hàm thực, vì vậy biến đổi Fourier sẽ là đối xứng. Cácscipy.fftpack.fftfreq() hàm sẽ tạo ra các tần số lấy mẫu và scipy.fftpack.fft() sẽ tính toán biến đổi Fourier nhanh.
Hãy để chúng tôi hiểu điều này với sự trợ giúp của một ví dụ.
from scipy import fftpack
sample_freq = fftpack.fftfreq(sig.size, d = time_step)
sig_fft = fftpack.fft(sig)
print sig_fft
Chương trình trên sẽ tạo ra kết quả sau.
array([
25.45122234 +0.00000000e+00j, 6.29800973 +2.20269471e+00j,
11.52137858 -2.00515732e+01j, 1.08111300 +1.35488579e+01j,
…….])
Biến đổi Cosine rời rạc
A Discrete Cosine Transform (DCT)biểu diễn một chuỗi hữu hạn các điểm dữ liệu dưới dạng tổng các hàm cosin dao động ở các tần số khác nhau. SciPy cung cấp một DCT với chức năngdct và một IDCT tương ứng với chức năng idct. Chúng ta hãy xem xét ví dụ sau.
from scipy.fftpack import dct
print dct(np.array([4., 3., 5., 10., 5., 3.]))
Chương trình trên sẽ tạo ra kết quả sau.
array([ 60., -3.48476592, -13.85640646, 11.3137085, 6., -6.31319305])
Phép biến đổi cosin rời rạc nghịch đảo tái tạo lại một chuỗi từ các hệ số biến đổi cosin rời rạc (DCT) của nó. Hàm idct là nghịch đảo của hàm dct. Hãy để chúng tôi hiểu điều này với ví dụ sau.
from scipy.fftpack import dct
print idct(np.array([4., 3., 5., 10., 5., 3.]))
Chương trình trên sẽ tạo ra kết quả sau.
array([ 39.15085889, -20.14213562, -6.45392043, 7.13341236,
8.14213562, -3.83035081])
Khi một chức năng không thể được tích hợp phân tích hoặc rất khó tích hợp phân tích, người ta thường chuyển sang phương pháp tích phân số. SciPy có một số quy trình để thực hiện tích hợp số. Hầu hết chúng được tìm thấy trong cùng mộtscipy.integratethư viện. Bảng sau liệt kê một số hàm thường được sử dụng.
Sr không. | Mô tả chức năng |
---|---|
1 | quad Tích hợp đơn lẻ |
2 | dblquad Tích hợp kép |
3 | tplquad Tích hợp ba |
4 | nquad tích hợp n- gấp nhiều lần |
5 | fixed_quad Cầu phương Gaussian, bậc n |
6 | quadrature Cầu phương Gaussian để dung sai |
7 | romberg Tích hợp Romberg |
số 8 | trapz Quy luật trapezoidal |
9 | cumtrapz Quy tắc hình thang để tính tích phân tích lũy |
10 | simps Quy tắc Simpson |
11 | romb Tích hợp Romberg |
12 | polyint Tích phân đa thức phân tích (NumPy) |
13 | poly1d Chức năng trợ giúp cho polyint (NumPy) |
Tích phân đơn
Hàm Quad là tập hợp các hàm tích hợp của SciPy. Tích hợp số đôi khi được gọi làquadrature, do đó có tên. Nó thường là lựa chọn mặc định để thực hiện các tích phân đơn lẻ của một hàm f (x) trên một phạm vi cố định nhất định từ a đến b.
$$\int_{a}^{b} f(x)dx$$
Dạng tổng quát của quad là scipy.integrate.quad(f, a, b), Trong đó 'f' là tên của hàm được tích hợp. Trong khi, 'a' và 'b' lần lượt là giới hạn dưới và giới hạn trên. Chúng ta hãy xem một ví dụ về hàm Gaussian, được tích hợp trên phạm vi 0 và 1.
Đầu tiên chúng ta cần xác định hàm → $f(x) = e^{-x^2}$ , điều này có thể được thực hiện bằng cách sử dụng biểu thức lambda và sau đó gọi phương thức quad trên hàm đó.
import scipy.integrate
from numpy import exp
f= lambda x:exp(-x**2)
i = scipy.integrate.quad(f, 0, 1)
print i
Chương trình trên sẽ tạo ra kết quả sau.
(0.7468241328124271, 8.291413475940725e-15)
Hàm quad trả về hai giá trị, trong đó số đầu tiên là giá trị của tích phân và giá trị thứ hai là ước tính của sai số tuyệt đối trong giá trị của tích phân.
Note- Vì quad yêu cầu hàm là đối số đầu tiên nên chúng ta không thể truyền trực tiếp exp làm đối số. Hàm Quad chấp nhận vô cùng dương và âm làm giới hạn. Hàm Quad có thể tích hợp các hàm NumPy tiêu chuẩn được xác định trước của một biến duy nhất, chẳng hạn như exp, sin và cos.
Nhiều tích phân
Cơ chế tích hợp gấp đôi và gấp ba đã được gói gọn trong các chức năng dblquad, tplquad và nquad. Các hàm này tích hợp bốn hoặc sáu đối số tương ứng. Giới hạn của tất cả các tích phân bên trong cần được xác định dưới dạng hàm số.
Tích phân kép
Hình thức chung của dblquadlà scipy.integrate.dblquad (func, a, b, gfun, hfun). Trong đó, func là tên của hàm được tích hợp, 'a' và 'b' lần lượt là giới hạn dưới và trên của biến x, trong khi gfun và hfun là tên của các hàm xác định giới hạn dưới và giới hạn trên của biến y.
Ví dụ, chúng ta hãy thực hiện phương pháp tích phân kép.
$$\int_{0}^{1/2} dy \int_{0}^{\sqrt{1-4y^2}} 16xy \:dx$$
Chúng tôi xác định các hàm f, g và h, sử dụng các biểu thức lambda. Lưu ý rằng ngay cả khi g và h là hằng số, vì chúng có thể là hằng số trong nhiều trường hợp, chúng phải được định nghĩa dưới dạng hàm, như chúng ta đã làm ở đây cho giới hạn dưới.
import scipy.integrate
from numpy import exp
from math import sqrt
f = lambda x, y : 16*x*y
g = lambda x : 0
h = lambda y : sqrt(1-4*y**2)
i = scipy.integrate.dblquad(f, 0, 0.5, g, h)
print i
Chương trình trên sẽ tạo ra kết quả sau.
(0.5, 1.7092350012594845e-14)
Ngoài các quy trình được mô tả ở trên, scipy.integrate có một số quy trình tích hợp khác, bao gồm nquad, thực hiện tích hợp nhiều lần gấp n, cũng như các quy trình khác triển khai các thuật toán tích hợp khác nhau. Tuy nhiên, quad và dblquad sẽ đáp ứng hầu hết các nhu cầu của chúng ta về tích hợp số.
Trong chương này, chúng ta sẽ thảo luận về cách nội suy giúp ích trong SciPy.
Nội suy là gì?
Nội suy là quá trình tìm giá trị giữa hai điểm trên một đường thẳng hoặc một đường cong. Để giúp chúng ta nhớ ý nghĩa của nó, chúng ta nên nghĩ phần đầu tiên của từ, 'inter,' có nghĩa là 'enter', điều này nhắc chúng ta nhìn vào 'bên trong' dữ liệu mà chúng ta có ban đầu. Công cụ nội suy này không chỉ hữu ích trong thống kê mà còn hữu ích trong khoa học, kinh doanh hoặc khi cần dự đoán các giá trị nằm trong hai điểm dữ liệu hiện có.
Hãy để chúng tôi tạo một số dữ liệu và xem cách nội suy này có thể được thực hiện bằng cách sử dụng scipy.interpolate gói hàng.
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.linspace(0, 4, 12)
y = np.cos(x**2/3+4)
print x,y
Chương trình trên sẽ tạo ra kết quả sau.
(
array([0., 0.36363636, 0.72727273, 1.09090909, 1.45454545, 1.81818182,
2.18181818, 2.54545455, 2.90909091, 3.27272727, 3.63636364, 4.]),
array([-0.65364362, -0.61966189, -0.51077021, -0.31047698, -0.00715476,
0.37976236, 0.76715099, 0.99239518, 0.85886263, 0.27994201,
-0.52586509, -0.99582185])
)
Bây giờ, chúng ta có hai mảng. Giả sử hai mảng đó là hai kích thước của các điểm trong không gian, chúng ta hãy vẽ biểu đồ bằng chương trình sau và xem chúng trông như thế nào.
plt.plot(x, y,’o’)
plt.show()
Chương trình trên sẽ tạo ra kết quả sau.
Nội suy 1-D
Lớp interp1d trong scipy.interpolate là một phương pháp thuận tiện để tạo một hàm dựa trên các điểm dữ liệu cố định, có thể được đánh giá ở bất kỳ đâu trong miền được xác định bởi dữ liệu đã cho bằng cách sử dụng nội suy tuyến tính.
Bằng cách sử dụng dữ liệu trên, chúng ta hãy tạo một hàm nội suy và vẽ một đồ thị nội suy mới.
f1 = interp1d(x, y,kind = 'linear')
f2 = interp1d(x, y, kind = 'cubic')
Sử dụng hàm interp1d, chúng tôi tạo ra hai hàm f1 và f2. Các hàm này, đối với một đầu vào cho trước x trả về y. Loại biến thứ ba đại diện cho loại kỹ thuật nội suy. 'Tuyến tính', 'Gần nhất', 'Không', 'Tuyến tính', 'Bậc hai', 'Lập thể' là một vài kỹ thuật nội suy.
Bây giờ, chúng ta hãy tạo một đầu vào mới có độ dài hơn để thấy sự khác biệt rõ ràng của phép nội suy. Chúng tôi sẽ sử dụng cùng một chức năng của dữ liệu cũ trên dữ liệu mới.
xnew = np.linspace(0, 4,30)
plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')
plt.legend(['data', 'linear', 'cubic','nearest'], loc = 'best')
plt.show()
Chương trình trên sẽ tạo ra kết quả sau.
Splines
Để vẽ các đường cong mượt mà qua các điểm dữ liệu, các nhà soạn thảo đã từng sử dụng các dải gỗ, cao su cứng, kim loại hoặc nhựa dẻo mỏng được gọi là đường cong cơ học. Để sử dụng spline cơ học, các chốt được đặt tại một lựa chọn hợp lý của các điểm dọc theo một đường cong trong một thiết kế, và sau đó spline được uốn cong để nó chạm vào từng chốt này.
Rõ ràng, với cấu trúc này, spline nội suy đường cong tại các chốt này. Nó có thể được sử dụng để tái tạo đường cong trong các bản vẽ khác. Các điểm đặt các chốt được gọi là các nút thắt. Chúng ta có thể thay đổi hình dạng của đường cong được xác định bởi spline bằng cách điều chỉnh vị trí của các nút thắt.
Spline đơn biến
Đường spline làm mịn một chiều phù hợp với một tập hợp các điểm dữ liệu nhất định. Lớp UnivariateSpline trong scipy.interpolate là một phương pháp thuận tiện để tạo một hàm, dựa trên lớp điểm dữ liệu cố định - scipy.interpolate.UnivariateSpline (x, y, w = None, bbox = [None, None], k = 3, s = Không, ext = 0, check_finite = False).
Parameters - Sau đây là các tham số của Spline đơn biến.
Điều này phù hợp với spline y = spl (x) độ k với dữ liệu x, y đã cho.
'w' - Chỉ định trọng lượng để lắp spline. Phải tích cực. Nếu không có (mặc định), trọng số đều bằng nhau.
's' - Chỉ định số lượng nút thắt bằng cách chỉ định điều kiện làm mịn.
'k' - Độ mịn của spline. Phải <= 5. Mặc định là k = 3, một spline khối.
Ext - Điều khiển chế độ ngoại suy cho các phần tử không nằm trong khoảng được xác định bởi trình tự nút.
nếu ext = 0 hoặc 'ngoại suy', trả về giá trị ngoại suy.
nếu ext = 1 hoặc 'không', trả về 0
nếu ext = 2 hoặc 'tăng', tăng một ValueError
nếu ext = 3 của 'const', trả về giá trị biên.
check_finite - Kiểm tra xem các mảng đầu vào chỉ chứa các số hữu hạn hay không.
Chúng ta hãy xem xét ví dụ sau.
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
x = np.linspace(-3, 3, 50)
y = np.exp(-x**2) + 0.1 * np.random.randn(50)
plt.plot(x, y, 'ro', ms = 5)
plt.show()
Sử dụng giá trị mặc định cho tham số làm mịn.
spl = UnivariateSpline(x, y)
xs = np.linspace(-3, 3, 1000)
plt.plot(xs, spl(xs), 'g', lw = 3)
plt.show()
Thay đổi lượng làm mịn theo cách thủ công.
spl.set_smoothing_factor(0.5)
plt.plot(xs, spl(xs), 'b', lw = 3)
plt.show()
Gói Scipy.io (Đầu vào và Đầu ra) cung cấp một loạt các chức năng để làm việc với các định dạng tệp khác nhau. Một số định dạng này là -
- Matlab
- IDL
- Thị trường ma trận
- Wave
- Arff
- Netcdf, v.v.
Hãy để chúng tôi thảo luận chi tiết về các định dạng tệp được sử dụng phổ biến nhất -
MATLAB
Sau đây là các hàm được sử dụng để tải và lưu tệp .mat.
Sơ không. | Mô tả chức năng |
---|---|
1 | loadmat Tải tệp MATLAB |
2 | savemat Lưu tệp MATLAB |
3 | whosmat Liệt kê các biến bên trong tệp MATLAB |
Chúng ta hãy xem xét ví dụ sau.
import scipy.io as sio
import numpy as np
#Save a mat file
vect = np.arange(10)
sio.savemat('array.mat', {'vect':vect})
#Now Load the File
mat_file_content = sio.loadmat(‘array.mat’)
Print mat_file_content
Chương trình trên sẽ tạo ra kết quả sau.
{
'vect': array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]), '__version__': '1.0',
'__header__': 'MATLAB 5.0 MAT-file Platform: posix, Created on: Sat Sep 30
09:49:32 2017', '__globals__': []
}
Chúng ta có thể thấy mảng cùng với thông tin Meta. Nếu chúng ta muốn kiểm tra nội dung của tệp MATLAB mà không đọc dữ liệu vào bộ nhớ, hãy sử dụngwhosmat command như hình bên dưới.
import scipy.io as sio
mat_file_content = sio.whosmat(‘array.mat’)
print mat_file_content
Chương trình trên sẽ tạo ra kết quả sau.
[('vect', (1, 10), 'int64')]
SciPy được xây dựng bằng cách sử dụng ATLAS LAPACK và BLAScác thư viện. Nó có khả năng đại số tuyến tính rất nhanh. Tất cả các quy trình đại số tuyến tính này mong đợi một đối tượng có thể được chuyển đổi thành một mảng hai chiều. Đầu ra của các thói quen này cũng là một mảng hai chiều.
SciPy.linalg vs NumPy.linalg
Một scipy.linalg chứa tất cả các hàm có trong numpy.linalg. Ngoài ra, scipy.linalg cũng có một số chức năng nâng cao khác không có trong numpy.linalg. Một ưu điểm khác của việc sử dụng scipy.linalg so với numpy.linalg là nó luôn được biên dịch với hỗ trợ BLAS / LAPACK, trong khi đối với NumPy thì điều này là tùy chọn. Do đó, phiên bản SciPy có thể nhanh hơn tùy thuộc vào cách NumPy được cài đặt.
Các phương trình tuyến tính
Các scipy.linalg.solve tính năng giải phương trình tuyến tính a * x + b * y = Z, với các giá trị x, y chưa biết.
Ví dụ, giả sử rằng bạn muốn giải các phương trình đồng thời sau.
x + 3y + 5z = 10
2x + 5y + z = 8
2x + 3y + 8z = 3
Để giải phương trình trên cho các giá trị x, y, z, chúng ta có thể tìm véc tơ nghiệm bằng cách sử dụng nghịch đảo ma trận như hình dưới đây.
$$\begin{bmatrix} x\\ y\\ z \end{bmatrix} = \begin{bmatrix} 1 & 3 & 5\\ 2 & 5 & 1\\ 2 & 3 & 8 \end{bmatrix}^{-1} \begin{bmatrix} 10\\ 8\\ 3 \end{bmatrix} = \frac{1}{25} \begin{bmatrix} -232\\ 129\\ 19 \end{bmatrix} = \begin{bmatrix} -9.28\\ 5.16\\ 0.76 \end{bmatrix}.$$
Tuy nhiên, tốt hơn là sử dụng linalg.solve , có thể nhanh hơn và ổn định hơn về mặt số.
Hàm giải quyết nhận hai đầu vào 'a' và 'b' trong đó 'a' đại diện cho các hệ số và 'b' đại diện cho giá trị bên phải tương ứng và trả về mảng giải pháp.
Chúng ta hãy xem xét ví dụ sau.
#importing the scipy and numpy packages
from scipy import linalg
import numpy as np
#Declaring the numpy arrays
a = np.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]])
b = np.array([2, 4, -1])
#Passing the values to the solve function
x = linalg.solve(a, b)
#printing the result array
print x
Chương trình trên sẽ tạo ra kết quả sau.
array([ 2., -2., 9.])
Tìm một yếu tố quyết định
Định thức của ma trận vuông A thường được ký hiệu là | A | và là một đại lượng thường được sử dụng trong đại số tuyến tính. Trong SciPy, điều này được tính bằng cách sử dụngdet()chức năng. Nó nhận một ma trận làm đầu vào và trả về một giá trị vô hướng.
Chúng ta hãy xem xét ví dụ sau.
#importing the scipy and numpy packages
from scipy import linalg
import numpy as np
#Declaring the numpy array
A = np.array([[1,2],[3,4]])
#Passing the values to the det function
x = linalg.det(A)
#printing the result
print x
Chương trình trên sẽ tạo ra kết quả sau.
-2.0
Vectơ riêng
Bài toán eigenvalue-eigenvector là một trong những phép toán đại số tuyến tính được sử dụng phổ biến nhất. Chúng ta có thể tìm các giá trị Eigen (λ) và vectơ Eigen tương ứng (v) của ma trận vuông (A) bằng cách xem xét quan hệ sau:
Av = λv
scipy.linalg.eigtính toán các giá trị riêng từ một bài toán giá trị riêng thông thường hoặc tổng quát. Hàm này trả về giá trị Eigen và vectơ Eigen.
Chúng ta hãy xem xét ví dụ sau.
#importing the scipy and numpy packages
from scipy import linalg
import numpy as np
#Declaring the numpy array
A = np.array([[1,2],[3,4]])
#Passing the values to the eig function
l, v = linalg.eig(A)
#printing the result for eigen values
print l
#printing the result for eigen vectors
print v
Chương trình trên sẽ tạo ra kết quả sau.
array([-0.37228132+0.j, 5.37228132+0.j]) #--Eigen Values
array([[-0.82456484, -0.41597356], #--Eigen Vectors
[ 0.56576746, -0.90937671]])
Phân rã giá trị đơn lẻ
Phân hủy giá trị số ít (SVD) có thể được coi là một phần mở rộng của vấn đề giá trị riêng cho các ma trận không phải là hình vuông.
Các scipy.linalg.svd phân tích nhân tử ma trận 'a' thành hai ma trận đơn nhất 'U' và 'Vh' và mảng 1-D 's' các giá trị đơn (thực, không âm) sao cho a == U * S * Vh, trong đó 'S 'là một ma trận có hình dạng phù hợp gồm các số không với đường chéo chính' s '.
Chúng ta hãy xem xét ví dụ sau.
#importing the scipy and numpy packages
from scipy import linalg
import numpy as np
#Declaring the numpy array
a = np.random.randn(3, 2) + 1.j*np.random.randn(3, 2)
#Passing the values to the eig function
U, s, Vh = linalg.svd(a)
# printing the result
print U, Vh, s
Chương trình trên sẽ tạo ra kết quả sau.
(
array([
[ 0.54828424-0.23329795j, -0.38465728+0.01566714j,
-0.18764355+0.67936712j],
[-0.27123194-0.5327436j , -0.57080163-0.00266155j,
-0.39868941-0.39729416j],
[ 0.34443818+0.4110186j , -0.47972716+0.54390586j,
0.25028608-0.35186815j]
]),
array([ 3.25745379, 1.16150607]),
array([
[-0.35312444+0.j , 0.32400401+0.87768134j],
[-0.93557636+0.j , -0.12229224-0.33127251j]
])
)
Mô-đun con SciPy ndimage dành riêng cho xử lý hình ảnh. Ở đây, ndimage có nghĩa là một hình ảnh n chiều.
Một số tác vụ phổ biến nhất trong xử lý ảnh như sau & miuns;
- Đầu vào / Đầu ra, hiển thị hình ảnh
- Các thao tác cơ bản - Cắt, lật, xoay, v.v.
- Lọc hình ảnh - Khử nhiễu, làm sắc nét, v.v.
- Phân đoạn hình ảnh - Gắn nhãn pixel tương ứng với các đối tượng khác nhau
- Classification
- Khai thác tính năng
- Registration
Hãy để chúng tôi thảo luận về cách có thể đạt được một số trong số này bằng cách sử dụng SciPy.
Mở và ghi vào tệp hình ảnh
Các misc packagetrong SciPy đi kèm với một số hình ảnh. Chúng tôi sử dụng những hình ảnh đó để học các thao tác hình ảnh. Chúng ta hãy xem xét ví dụ sau.
from scipy import misc
f = misc.face()
misc.imsave('face.png', f) # uses the Image module (PIL)
import matplotlib.pyplot as plt
plt.imshow(f)
plt.show()
Chương trình trên sẽ tạo ra kết quả sau.
Bất kỳ hình ảnh nào ở định dạng thô của nó là sự kết hợp của các màu được biểu thị bằng các số ở định dạng ma trận. Một cỗ máy hiểu và xử lý các hình ảnh chỉ dựa trên những con số đó. RGB là một cách biểu diễn phổ biến.
Hãy cùng chúng tôi xem thông tin thống kê của hình ảnh trên.
from scipy import misc
face = misc.face(gray = False)
print face.mean(), face.max(), face.min()
Chương trình trên sẽ tạo ra kết quả sau.
110.16274388631184, 255, 0
Bây giờ, chúng ta biết rằng hình ảnh được tạo ra từ các con số, vì vậy bất kỳ sự thay đổi nào về giá trị của con số sẽ làm thay đổi hình ảnh ban đầu. Hãy để chúng tôi thực hiện một số biến đổi hình học trên hình ảnh. Phép toán hình học cơ bản là cắt xén
from scipy import misc
face = misc.face(gray = True)
lx, ly = face.shape
# Cropping
crop_face = face[lx / 4: - lx / 4, ly / 4: - ly / 4]
import matplotlib.pyplot as plt
plt.imshow(crop_face)
plt.show()
Chương trình trên sẽ tạo ra kết quả sau.
Chúng ta cũng có thể thực hiện một số thao tác cơ bản như lật ngược hình ảnh như mô tả bên dưới.
# up <-> down flip
from scipy import misc
face = misc.face()
flip_ud_face = np.flipud(face)
import matplotlib.pyplot as plt
plt.imshow(flip_ud_face)
plt.show()
Chương trình trên sẽ tạo ra kết quả sau.
Bên cạnh đó, chúng tôi có rotate() function, xoay hình ảnh với một góc xác định.
# rotation
from scipy import misc,ndimage
face = misc.face()
rotate_face = ndimage.rotate(face, 45)
import matplotlib.pyplot as plt
plt.imshow(rotate_face)
plt.show()
Chương trình trên sẽ tạo ra kết quả sau.
Bộ lọc
Hãy để chúng tôi thảo luận về cách bộ lọc giúp xử lý hình ảnh.
Lọc trong xử lý ảnh là gì?
Lọc là một kỹ thuật để sửa đổi hoặc nâng cao hình ảnh. Ví dụ: bạn có thể lọc một hình ảnh để nhấn mạnh các tính năng nhất định hoặc loại bỏ các tính năng khác. Các hoạt động xử lý hình ảnh được thực hiện với bộ lọc bao gồm Làm mịn, Làm sắc nét và Tăng cường cạnh.
Lọc là một hoạt động lân cận, trong đó giá trị của bất kỳ pixel nhất định nào trong hình ảnh đầu ra được xác định bằng cách áp dụng một số thuật toán cho giá trị của các pixel trong vùng lân cận của pixel đầu vào tương ứng. Bây giờ chúng ta hãy thực hiện một vài thao tác bằng SciPy ndimage.
Làm mờ
Làm mờ được sử dụng rộng rãi để giảm nhiễu trong hình ảnh. Chúng ta có thể thực hiện thao tác lọc và xem sự thay đổi trong ảnh. Chúng ta hãy xem xét ví dụ sau.
from scipy import misc
face = misc.face()
blurred_face = ndimage.gaussian_filter(face, sigma=3)
import matplotlib.pyplot as plt
plt.imshow(blurred_face)
plt.show()
Chương trình trên sẽ tạo ra kết quả sau.
Giá trị sigma cho biết mức độ mờ trên thang điểm năm. Chúng ta có thể thấy sự thay đổi về chất lượng hình ảnh bằng cách điều chỉnh giá trị sigma. Để biết thêm chi tiết về làm mờ, hãy nhấp vào → Hướng dẫn DIP (Xử lý hình ảnh kỹ thuật số).
Phát hiện cạnh
Hãy để chúng tôi thảo luận về cách phát hiện cạnh giúp xử lý hình ảnh.
Phát hiện cạnh là gì?
Phát hiện cạnh là một kỹ thuật xử lý hình ảnh để tìm ranh giới của các đối tượng trong hình ảnh. Nó hoạt động bằng cách phát hiện sự gián đoạn về độ sáng. Phát hiện cạnh được sử dụng để phân đoạn hình ảnh và trích xuất dữ liệu trong các lĩnh vực như Xử lý hình ảnh, Thị giác máy tính và Thị giác máy.
Các thuật toán phát hiện cạnh được sử dụng phổ biến nhất bao gồm
- Sobel
- Canny
- Prewitt
- Roberts
- Các phương pháp Logic mờ
Chúng ta hãy xem xét ví dụ sau.
import scipy.ndimage as nd
import numpy as np
im = np.zeros((256, 256))
im[64:-64, 64:-64] = 1
im[90:-90,90:-90] = 2
im = ndimage.gaussian_filter(im, 8)
import matplotlib.pyplot as plt
plt.imshow(im)
plt.show()
Chương trình trên sẽ tạo ra kết quả sau.
Hình ảnh trông giống như một khối màu vuông. Bây giờ, chúng ta sẽ phát hiện các cạnh của các khối màu đó. Ở đây, ndimage cung cấp một hàm được gọi làSobelđể thực hiện thao tác này. Trong khi đó, NumPy cung cấpHypot hàm để kết hợp hai ma trận kết quả thành một.
Chúng ta hãy xem xét ví dụ sau.
import scipy.ndimage as nd
import matplotlib.pyplot as plt
im = np.zeros((256, 256))
im[64:-64, 64:-64] = 1
im[90:-90,90:-90] = 2
im = ndimage.gaussian_filter(im, 8)
sx = ndimage.sobel(im, axis = 0, mode = 'constant')
sy = ndimage.sobel(im, axis = 1, mode = 'constant')
sob = np.hypot(sx, sy)
plt.imshow(sob)
plt.show()
Chương trình trên sẽ tạo ra kết quả sau.
Các scipy.optimize packagecung cấp một số thuật toán tối ưu hóa thường được sử dụng. Mô-đun này chứa các khía cạnh sau:
Tối thiểu hóa không bị giới hạn và hạn chế của các hàm vô hướng đa biến (tối thiểu hóa ()) bằng cách sử dụng nhiều thuật toán (ví dụ: BFGS, Nelder-Mead simplex, Newton Conjugate Gradient, COBYLA hoặc SLSQP)
Các quy trình tối ưu hóa toàn cầu (brute-force) (ví dụ: anneal (), basinhopping ())
Thuật toán thu nhỏ bình phương tối thiểu (ít nhất ()) và phù hợp đường cong (curve_fit ())
Bộ giảm thiểu hàm đơn biến vô hướng (Minimalar_scalar ()) và bộ tìm gốc (newton ())
Bộ giải hệ phương trình đa biến (root ()) bằng cách sử dụng nhiều thuật toán khác nhau (ví dụ: hybrid Powell, Levenberg-Marquardt hoặc các phương pháp quy mô lớn như Newton-Krylov)
Giảm thiểu không bị ràng buộc & bị ràng buộc của các hàm vô hướng đa biến
Các minimize() function cung cấp một giao diện chung cho các thuật toán giảm thiểu không bị ràng buộc và hạn chế cho các hàm vô hướng đa biến trong scipy.optimize. Để chứng minh hàm tối thiểu hóa, hãy xem xét vấn đề tối thiểu hóa hàm Rosenbrock của các biến NN -
$$f(x) = \sum_{i = 1}^{N-1} \:100(x_i - x_{i-1}^{2})$$
Giá trị nhỏ nhất của hàm này là 0, giá trị này đạt được khi xi = 1.
Thuật toán Nelder – Mead Simplex
Trong ví dụ sau, quy trình thu nhỏ () được sử dụng với Nelder-Mead simplex algorithm (method = 'Nelder-Mead')(được chọn thông qua tham số phương thức). Chúng ta hãy xem xét ví dụ sau.
import numpy as np
from scipy.optimize import minimize
def rosen(x):
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead')
print(res.x)
Chương trình trên sẽ tạo ra kết quả sau.
[7.93700741e+54 -5.41692163e+53 6.28769150e+53 1.38050484e+55 -4.14751333e+54]
Thuật toán simplex có lẽ là cách đơn giản nhất để giảm thiểu một hàm hoạt động khá tốt. Nó chỉ yêu cầu đánh giá chức năng và là một lựa chọn tốt cho các vấn đề giảm thiểu đơn giản. Tuy nhiên, vì nó không sử dụng bất kỳ đánh giá gradient nào, nên có thể mất nhiều thời gian hơn để tìm ra mức tối thiểu.
Một thuật toán tối ưu hóa khác chỉ cần gọi hàm để tìm giá trị tối thiểu là Powell‘s method, có sẵn bằng cách đặt method = 'powell' trong hàm Reduce ().
Bình phương nhỏ nhất
Giải bài toán bình phương nhỏ nhất phi tuyến với giới hạn của các biến. Cho phần dư f (x) (một hàm thực m chiều của n biến thực) và hàm mất mát rho (s) (một hàm vô hướng), các hàm giá trị nhỏ nhất tìm thấy điểm cực tiểu cục bộ của hàm chi phí F (x). Chúng ta hãy xem xét ví dụ sau.
Trong ví dụ này, chúng tôi tìm thấy mức tối thiểu của hàm Rosenbrock mà không có giới hạn trên các biến độc lập.
#Rosenbrock Function
def fun_rosenbrock(x):
return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])
from scipy.optimize import least_squares
input = np.array([2, 2])
res = least_squares(fun_rosenbrock, input)
print res
Lưu ý rằng, chúng tôi chỉ cung cấp véc tơ của các phần dư. Thuật toán xây dựng hàm chi phí dưới dạng tổng bình phương của các phần dư, cho hàm Rosenbrock. Giá trị nhỏ nhất chính xác là x = [1.0,1.0].
Chương trình trên sẽ tạo ra kết quả sau.
active_mask: array([ 0., 0.])
cost: 9.8669242910846867e-30
fun: array([ 4.44089210e-15, 1.11022302e-16])
grad: array([ -8.89288649e-14, 4.44089210e-14])
jac: array([[-20.00000015,10.],[ -1.,0.]])
message: '`gtol` termination condition is satisfied.'
nfev: 3
njev: 3
optimality: 8.8928864934219529e-14
status: 1
success: True
x: array([ 1., 1.])
Tìm kiếm gốc rễ
Hãy cho chúng tôi hiểu cách tìm gốc giúp ích cho SciPy.
Các hàm vô hướng
Nếu một phương trình có một biến, có bốn thuật toán tìm căn khác nhau, có thể được thử. Mỗi thuật toán này yêu cầu các điểm cuối của một khoảng trong đó gốc được mong đợi (vì hàm thay đổi dấu hiệu). Nói chung,brentq là lựa chọn tốt nhất, nhưng các phương pháp khác có thể hữu ích trong những trường hợp nhất định hoặc cho mục đích học tập.
Giải quyết điểm cố định
Một bài toán liên quan chặt chẽ đến việc tìm các số không của một hàm là bài toán tìm một điểm cố định của một hàm. Điểm cố định của một hàm là điểm mà tại đó đánh giá của hàm trả về điểm: g (x) = x. Rõ ràng là điểm cố định củagglà căn của f (x) = g (x) −x. Tương tự, gốc củafflà điểm cố định của g (x) = f (x) + x. Điểm cố định thường trình cung cấp một phương pháp lặp lại đơn giản bằng cách sử dụngAitkens sequence acceleration để ước tính điểm cố định của gg, nếu một điểm bắt đầu được đưa ra.
Bộ phương trình
Tìm nghiệm nguyên của một tập phương trình phi tuyến tính có thể đạt được bằng cách sử dụng root() function. Một số phương pháp có sẵn, trong đóhybr (mặc định) và lm, tương ứng sử dụng hybrid method of Powell và Levenberg-Marquardt method từ MINPACK.
Ví dụ sau đây xem xét phương trình siêu việt một biến.
x2 + 2cos(x) = 0
Một gốc trong số đó có thể được tìm thấy như sau:
import numpy as np
from scipy.optimize import root
def func(x):
return x*2 + 2 * np.cos(x)
sol = root(func, 0.3)
print sol
Chương trình trên sẽ tạo ra kết quả sau.
fjac: array([[-1.]])
fun: array([ 2.22044605e-16])
message: 'The solution converged.'
nfev: 10
qtf: array([ -2.77644574e-12])
r: array([-3.34722409])
status: 1
success: True
x: array([-0.73908513])
Tất cả các chức năng thống kê nằm trong gói phụ scipy.stats và một danh sách khá đầy đủ về các chức năng này có thể được lấy bằng cách sử dụng info(stats)chức năng. Danh sách các biến ngẫu nhiên có sẵn cũng có thể được lấy từdocstringcho gói con số liệu thống kê. Mô-đun này chứa một số lượng lớn các phân phối xác suất cũng như một thư viện các hàm thống kê đang phát triển.
Mỗi phân phối đơn biến có lớp con riêng của nó như được mô tả trong bảng sau:
Sơ không. | Lớp & Mô tả |
---|---|
1 | rv_continuous Một lớp biến ngẫu nhiên liên tục chung chung dành cho phân lớp |
2 | rv_discrete Một lớp biến ngẫu nhiên rời rạc chung chung dành cho phân lớp |
3 | rv_histogram Tạo phân phối được cung cấp bởi biểu đồ |
Biến ngẫu nhiên liên tục bình thường
Phân phối xác suất trong đó biến ngẫu nhiên X có thể nhận bất kỳ giá trị nào là biến ngẫu nhiên liên tục. Từ khóa location (loc) chỉ định giá trị trung bình. Từ khóa thang đo (scale) chỉ định độ lệch chuẩn.
Như một ví dụ của rv_continuous lớp học, norm đối tượng kế thừa từ nó một tập hợp các phương thức chung và hoàn thiện chúng với các chi tiết cụ thể cho bản phân phối cụ thể này.
Để tính CDF tại một số điểm, chúng ta có thể chuyển một danh sách hoặc một mảng NumPy. Chúng ta hãy xem xét ví dụ sau.
from scipy.stats import norm
import numpy as np
print norm.cdf(np.array([1,-1., 0, 1, 3, 4, -2, 6]))
Chương trình trên sẽ tạo ra kết quả sau.
array([ 0.84134475, 0.15865525, 0.5 , 0.84134475, 0.9986501 ,
0.99996833, 0.02275013, 1. ])
Để tìm giá trị trung bình của phân phối, chúng ta có thể sử dụng Hàm phần trăm điểm (PPF), hàm này là nghịch đảo của CDF. Hãy để chúng tôi hiểu bằng cách sử dụng ví dụ sau.
from scipy.stats import norm
print norm.ppf(0.5)
Chương trình trên sẽ tạo ra kết quả sau.
0.0
Để tạo một chuỗi các biến thể ngẫu nhiên, chúng ta nên sử dụng đối số từ khóa kích thước, được hiển thị trong ví dụ sau.
from scipy.stats import norm
print norm.rvs(size = 5)
Chương trình trên sẽ tạo ra kết quả sau.
array([ 0.20929928, -1.91049255, 0.41264672, -0.7135557 , -0.03833048])
Đầu ra trên không thể tái tạo. Để tạo các số ngẫu nhiên giống nhau, hãy sử dụng hàm hạt giống.
Phân bố đồng đều
Một phân phối đồng đều có thể được tạo ra bằng cách sử dụng hàm đồng nhất. Chúng ta hãy xem xét ví dụ sau.
from scipy.stats import uniform
print uniform.cdf([0, 1, 2, 3, 4, 5], loc = 1, scale = 4)
Chương trình trên sẽ tạo ra kết quả sau.
array([ 0. , 0. , 0.25, 0.5 , 0.75, 1. ])
Xây dựng phân phối rời rạc
Hãy để chúng tôi tạo một mẫu ngẫu nhiên và so sánh các tần số quan sát được với các xác suất.
Phân phối nhị thức
Như một ví dụ của rv_discrete class, các binom objectkế thừa từ đó một bộ sưu tập các phương pháp chung và hoàn thiện chúng với các chi tiết cụ thể cho bản phân phối cụ thể này. Chúng ta hãy xem xét ví dụ sau.
from scipy.stats import uniform
print uniform.cdf([0, 1, 2, 3, 4, 5], loc = 1, scale = 4)
Chương trình trên sẽ tạo ra kết quả sau.
array([ 0. , 0. , 0.25, 0.5 , 0.75, 1. ])
Thống kê mô tả
Các thống kê cơ bản như Min, Max, Mean và Variance lấy mảng NumPy làm đầu vào và trả về các kết quả tương ứng. Một số hàm thống kê cơ bản có sẵn trongscipy.stats package được mô tả trong bảng sau.
Sơ không. | Mô tả chức năng |
---|---|
1 | describe() Tính toán một số thống kê mô tả của mảng đã truyền |
2 | gmean() Tính toán trung bình hình học dọc theo trục được chỉ định |
3 | hmean() Tính toán trung bình điều hòa dọc theo trục xác định |
4 | kurtosis() Tính kurtosis |
5 | mode() Trả về giá trị phương thức |
6 | skew() Kiểm tra độ lệch của dữ liệu |
7 | f_oneway() Thực hiện ANOVA 1 chiều |
số 8 | iqr() Tính toán phạm vi liên phần của dữ liệu dọc theo trục được chỉ định |
9 | zscore() Tính điểm z của mỗi giá trị trong mẫu, so với giá trị trung bình của mẫu và độ lệch chuẩn |
10 | sem() Tính toán sai số chuẩn của giá trị trung bình (hoặc sai số chuẩn của phép đo) của các giá trị trong mảng đầu vào |
Một số chức năng này có phiên bản tương tự trong scipy.stats.mstats, hoạt động cho các mảng bị che. Hãy để chúng tôi hiểu điều này với ví dụ dưới đây.
from scipy import stats
import numpy as np
x = np.array([1,2,3,4,5,6,7,8,9])
print x.max(),x.min(),x.mean(),x.var()
Chương trình trên sẽ tạo ra kết quả sau.
(9, 1, 5.0, 6.666666666666667)
T-test
Hãy để chúng tôi hiểu T-test hữu ích như thế nào trong SciPy.
ttest_1samp
Tính toán T-test cho giá trị trung bình của MỘT nhóm điểm. Đây là phép thử hai mặt đối với giả thuyết rỗng rằng giá trị kỳ vọng (trung bình) của một mẫu quan sát độc lập 'a' bằng giá trị trung bình tổng thể đã cho,popmean. Chúng ta hãy xem xét ví dụ sau.
from scipy import stats
rvs = stats.norm.rvs(loc = 5, scale = 10, size = (50,2))
print stats.ttest_1samp(rvs,5.0)
Chương trình trên sẽ tạo ra kết quả sau.
Ttest_1sampResult(statistic = array([-1.40184894, 2.70158009]),
pvalue = array([ 0.16726344, 0.00945234]))
So sánh hai mẫu
Trong các ví dụ sau, có hai mẫu, có thể đến từ cùng một hoặc từ phân bố khác nhau và chúng tôi muốn kiểm tra xem các mẫu này có cùng thuộc tính thống kê hay không.
ttest_ind- Tính toán kiểm tra T cho phương tiện của hai mẫu điểm độc lập. Đây là một phép thử hai phía đối với giả thuyết rỗng rằng hai mẫu độc lập có giá trị trung bình (kỳ vọng) giống hệt nhau. Thử nghiệm này giả định rằng các quần thể có các phương sai giống hệt nhau theo mặc định.
Chúng ta có thể sử dụng thử nghiệm này, nếu chúng ta quan sát hai mẫu độc lập từ cùng một quần thể hoặc khác nhau. Chúng ta hãy xem xét ví dụ sau.
from scipy import stats
rvs1 = stats.norm.rvs(loc = 5,scale = 10,size = 500)
rvs2 = stats.norm.rvs(loc = 5,scale = 10,size = 500)
print stats.ttest_ind(rvs1,rvs2)
Chương trình trên sẽ tạo ra kết quả sau.
Ttest_indResult(statistic = -0.67406312233650278, pvalue = 0.50042727502272966)
Bạn có thể kiểm tra tương tự với một mảng mới có cùng độ dài, nhưng với giá trị trung bình khác nhau. Sử dụng một giá trị khác trongloc và kiểm tra tương tự.
CSGraph là viết tắt của Compressed Sparse Graph, tập trung vào các thuật toán đồ thị nhanh dựa trên biểu diễn ma trận thưa thớt.
Biểu diễn đồ thị
Để bắt đầu, chúng ta hãy hiểu biểu đồ thưa thớt là gì và nó giúp ích như thế nào trong việc biểu diễn đồ thị.
Chính xác thì đồ thị thưa thớt là gì?
Biểu đồ chỉ là một tập hợp các nút, có các liên kết giữa chúng. Đồ thị có thể đại diện cho hầu hết mọi thứ - kết nối mạng xã hội, trong đó mỗi nút là một người và được kết nối với những người quen; hình ảnh, trong đó mỗi nút là một pixel và được kết nối với các pixel lân cận; các điểm trong phân bố chiều cao, nơi mỗi nút được kết nối với các nút lân cận gần nhất của nó; và thực tế là bất cứ điều gì khác mà bạn có thể tưởng tượng.
Một cách rất hiệu quả để biểu diễn dữ liệu đồ thị là trong một ma trận thưa thớt: chúng ta hãy gọi nó là G. Ma trận G có kích thước N x N và G [i, j] cung cấp giá trị của kết nối giữa nút 'i' và nút 'j'. Một biểu đồ thưa thớt chứa hầu hết các số không - nghĩa là hầu hết các nút chỉ có một vài kết nối. Tính chất này hóa ra đúng trong hầu hết các trường hợp quan tâm.
Việc tạo ra mô-đun con đồ thị thưa thớt được thúc đẩy bởi một số thuật toán được sử dụng trong scikit-learning bao gồm những điều sau:
Isomap - Một thuật toán học đa tạp, yêu cầu tìm các đường đi ngắn nhất trong đồ thị.
Hierarchical clustering - Một thuật toán phân cụm dựa trên cây bao trùm tối thiểu.
Spectral Decomposition - Một thuật toán chiếu dựa trên laplacian đồ thị thưa thớt.
Như một ví dụ cụ thể, hãy tưởng tượng rằng chúng tôi muốn biểu diễn đồ thị vô hướng sau:
Đồ thị này có ba nút, trong đó nút 0 và 1 được nối với nhau bằng một cạnh trọng số 2, và các nút 0 và 2 được nối với nhau bằng một cạnh trọng số 1. Chúng ta có thể xây dựng các biểu diễn dày đặc, che khuất và thưa thớt như trong ví dụ sau , hãy nhớ rằng đồ thị vô hướng được biểu diễn bằng ma trận đối xứng.
G_dense = np.array([ [0, 2, 1],
[2, 0, 0],
[1, 0, 0] ])
G_masked = np.ma.masked_values(G_dense, 0)
from scipy.sparse import csr_matrix
G_sparse = csr_matrix(G_dense)
print G_sparse.data
Chương trình trên sẽ tạo ra kết quả sau.
array([2, 1, 2, 1])
Điều này giống với đồ thị trước, ngoại trừ các nút 0 và 2 được nối với nhau bằng một cạnh có trọng số bằng không. Trong trường hợp này, biểu diễn dày đặc ở trên dẫn đến sự không rõ ràng - làm thế nào có thể biểu diễn các cạnh không, nếu số 0 là một giá trị có nghĩa. Trong trường hợp này, phải sử dụng biểu diễn có mặt nạ hoặc biểu diễn thưa thớt để loại bỏ sự mơ hồ.
Chúng ta hãy xem xét ví dụ sau.
from scipy.sparse.csgraph import csgraph_from_dense
G2_data = np.array
([
[np.inf, 2, 0 ],
[2, np.inf, np.inf],
[0, np.inf, np.inf]
])
G2_sparse = csgraph_from_dense(G2_data, null_value=np.inf)
print G2_sparse.data
Chương trình trên sẽ tạo ra kết quả sau.
array([ 2., 0., 2., 0.])
Thang từ sử dụng đồ thị thưa thớt
Thang chữ là một trò chơi do Lewis Carroll phát minh, trong đó các từ được liên kết với nhau bằng cách thay đổi một chữ cái ở mỗi bước. Ví dụ -
APE → APT → AIT → BIT → BIG → BAG → MAG → MAN
Ở đây, chúng ta đã chuyển từ "APE" sang "MAN" trong bảy bước, thay đổi một ký tự mỗi lần. Câu hỏi đặt ra là - Chúng ta có thể tìm ra đường đi ngắn hơn giữa những từ này bằng cách sử dụng cùng một quy tắc không? Bài toán này được thể hiện một cách tự nhiên như một bài toán đồ thị thưa thớt. Các nút sẽ tương ứng với các từ riêng lẻ và chúng tôi sẽ tạo kết nối giữa các từ chỉ khác nhau nhiều nhất - một chữ cái.
Lấy một danh sách các từ
Đầu tiên, tất nhiên, chúng ta phải có được một danh sách các từ hợp lệ. Tôi đang chạy Mac và Mac có một từ điển từ ở vị trí được cung cấp trong khối mã sau. Nếu bạn đang sử dụng một kiến trúc khác, bạn có thể phải tìm kiếm một chút để tìm từ điển hệ thống của mình.
wordlist = open('/usr/share/dict/words').read().split()
print len(wordlist)
Chương trình trên sẽ tạo ra kết quả sau.
235886
Bây giờ chúng ta muốn xem xét các từ có độ dài 3, vì vậy chúng ta hãy chỉ chọn những từ có độ dài chính xác. Chúng tôi cũng sẽ loại bỏ các từ bắt đầu bằng chữ hoa (danh từ riêng) hoặc chứa các ký tự không phải chữ và số như dấu nháy đơn và dấu gạch nối. Cuối cùng, chúng tôi sẽ đảm bảo mọi thứ đều ở dạng chữ thường để so sánh sau này.
word_list = [word for word in word_list if len(word) == 3]
word_list = [word for word in word_list if word[0].islower()]
word_list = [word for word in word_list if word.isalpha()]
word_list = map(str.lower, word_list)
print len(word_list)
Chương trình trên sẽ tạo ra kết quả sau.
1135
Bây giờ, chúng tôi có một danh sách gồm 1135 từ gồm ba chữ cái hợp lệ (con số chính xác có thể thay đổi tùy thuộc vào danh sách cụ thể được sử dụng). Mỗi từ này sẽ trở thành một nút trong biểu đồ của chúng tôi và chúng tôi sẽ tạo các cạnh nối các nút được liên kết với mỗi cặp từ, chúng chỉ khác nhau một chữ cái.
import numpy as np
word_list = np.asarray(word_list)
word_list.dtype
word_list.sort()
word_bytes = np.ndarray((word_list.size, word_list.itemsize),
dtype = 'int8',
buffer = word_list.data)
print word_bytes.shape
Chương trình trên sẽ tạo ra kết quả sau.
(1135, 3)
Chúng tôi sẽ sử dụng khoảng cách Hamming giữa mỗi điểm để xác định cặp từ nào được kết nối với nhau. Khoảng cách Hamming đo tỷ lệ mục nhập giữa hai vectơ, khác nhau: hai từ bất kỳ có khoảng cách hamming bằng 1 / N1 / N, trong đó NN là số chữ cái, được kết nối trong thang từ.
from scipy.spatial.distance import pdist, squareform
from scipy.sparse import csr_matrix
hamming_dist = pdist(word_bytes, metric = 'hamming')
graph = csr_matrix(squareform(hamming_dist < 1.5 / word_list.itemsize))
Khi so sánh các khoảng cách, chúng tôi không sử dụng bình đẳng vì điều này có thể không ổn định đối với các giá trị dấu phẩy động. Bất đẳng thức tạo ra kết quả mong muốn miễn là không có hai mục nào trong danh sách từ giống nhau. Bây giờ, đồ thị của chúng ta đã được thiết lập, chúng ta sẽ sử dụng tìm kiếm đường đi ngắn nhất để tìm đường đi giữa hai từ bất kỳ trong đồ thị.
i1 = word_list.searchsorted('ape')
i2 = word_list.searchsorted('man')
print word_list[i1],word_list[i2]
Chương trình trên sẽ tạo ra kết quả sau.
ape, man
Chúng ta cần kiểm tra xem các từ này có khớp nhau không, vì nếu các từ không có trong danh sách sẽ có lỗi trong đầu ra. Bây giờ, tất cả những gì chúng ta cần là tìm đường đi ngắn nhất giữa hai chỉ số này trong biểu đồ. Chúng tôi sẽ sử dụngdijkstra’s vì nó cho phép chúng ta tìm đường dẫn cho chỉ một nút.
from scipy.sparse.csgraph import dijkstra
distances, predecessors = dijkstra(graph, indices = i1, return_predecessors = True)
print distances[i2]
Chương trình trên sẽ tạo ra kết quả sau.
5.0
Do đó, chúng ta thấy rằng con đường ngắn nhất giữa 'vượn' và 'người' chỉ có năm bước. Chúng ta có thể sử dụng các giá trị tiền nhiệm được thuật toán trả về để tạo lại đường dẫn này.
path = []
i = i2
while i != i1:
path.append(word_list[i])
i = predecessors[i]
path.append(word_list[i1])
print path[::-1]i2]
Chương trình trên sẽ tạo ra kết quả sau.
['ape', 'ope', 'opt', 'oat', 'mat', 'man']
Các scipy.spatial package có thể tính toán Tam giác, Sơ đồ Voronoi và Lồi lồi của một tập hợp các điểm, bằng cách tận dụng Qhull library. Hơn nữa, nó chứaKDTree implementations cho các truy vấn điểm lân cận gần nhất và các tiện ích để tính toán khoảng cách trong các số liệu khác nhau.
Các tam giác Delaunay
Hãy để chúng tôi hiểu Triangulation Delaunay là gì và cách chúng được sử dụng trong SciPy.
Delaunay Tam giác là gì?
Trong toán học và hình học tính toán, một tam giác Delaunay cho một tập hợp nhất định P các điểm rời rạc trong một mặt phẳng là một tam giác DT(P) đến nỗi không có ích lợi gì P nằm bên trong đường tròn ngoại tiếp tam giác bất kỳ trong DT (P).
Chúng ta có thể tính toán tương tự thông qua SciPy. Chúng ta hãy xem xét ví dụ sau.
from scipy.spatial import Delaunay
points = np.array([[0, 4], [2, 1.1], [1, 3], [1, 2]])
tri = Delaunay(points)
import matplotlib.pyplot as plt
plt.triplot(points[:,0], points[:,1], tri.simplices.copy())
plt.plot(points[:,0], points[:,1], 'o')
plt.show()
Chương trình trên sẽ tạo ra kết quả sau.
Điểm Coplanar
Hãy để chúng tôi hiểu điểm Coplanar là gì và cách chúng được sử dụng trong SciPy.
Điểm Coplanar là gì?
Điểm đồng phẳng là ba hoặc nhiều điểm nằm trong cùng một mặt phẳng. Nhớ lại rằng mặt phẳng là một mặt phẳng, mở rộng không kết thúc theo mọi hướng. Nó thường được thể hiện trong sách giáo khoa toán dưới dạng hình bốn cạnh.
Hãy để chúng tôi xem cách chúng tôi có thể tìm thấy điều này bằng SciPy. Chúng ta hãy xem xét ví dụ sau.
from scipy.spatial import Delaunay
points = np.array([[0, 0], [0, 1], [1, 0], [1, 1], [1, 1]])
tri = Delaunay(points)
print tri.coplanar
Chương trình trên sẽ tạo ra kết quả sau.
array([[4, 0, 3]], dtype = int32)
Điều này có nghĩa là điểm 4 nằm gần tam giác 0 và đỉnh 3, nhưng không nằm trong tam giác.
Vỏ lồi
Hãy để chúng tôi hiểu vỏ lồi là gì và cách chúng được sử dụng trong SciPy.
Convex Hulls là gì?
Trong toán học, convex hull hoặc là convex envelope của một tập hợp các điểm X trong mặt phẳng Euclide hoặc trong không gian Euclid (hay nói chung là trong không gian afin trên các số thực) là nhỏ nhất convex set chứa X.
Chúng ta hãy xem xét ví dụ sau để hiểu nó một cách chi tiết.
from scipy.spatial import ConvexHull
points = np.random.rand(10, 2) # 30 random points in 2-D
hull = ConvexHull(points)
import matplotlib.pyplot as plt
plt.plot(points[:,0], points[:,1], 'o')
for simplex in hull.simplices:
plt.plot(points[simplex,0], points[simplex,1], 'k-')
plt.show()
Chương trình trên sẽ tạo ra kết quả sau.
ODR là viết tắt của Orthogonal Distance Regression, được sử dụng trong các nghiên cứu hồi quy. Hồi quy tuyến tính cơ bản thường được sử dụng để ước tính mối quan hệ giữa hai biếny và x bằng cách vẽ đường phù hợp nhất trên biểu đồ.
Phương pháp toán học được sử dụng cho việc này được gọi là Least Squaresvà nhằm mục đích giảm thiểu tổng sai số bình phương cho mỗi điểm. Câu hỏi quan trọng ở đây là làm thế nào để bạn tính toán sai số (còn được gọi là phần dư) cho mỗi điểm?
Trong hồi quy tuyến tính tiêu chuẩn, mục đích là dự đoán giá trị Y từ giá trị X - vì vậy điều hợp lý cần làm là tính toán sai số trong các giá trị Y (được hiển thị dưới dạng các đường màu xám trong hình ảnh sau). Tuy nhiên, đôi khi sẽ hợp lý hơn nếu tính đến lỗi ở cả X và Y (như thể hiện bằng các đường chấm màu đỏ trong hình ảnh sau).
Ví dụ - Khi bạn biết số đo X của mình là không chắc chắn, hoặc khi bạn không muốn tập trung vào sai số của một biến này hơn một biến khác.
Hồi quy khoảng cách trực giao (ODR) là một phương pháp có thể thực hiện điều này (trực giao trong ngữ cảnh này có nghĩa là vuông góc - vì vậy nó tính toán các lỗi vuông góc với đường thẳng, thay vì chỉ 'theo chiều dọc').
Triển khai scipy.odr cho hồi quy đơn biến
Ví dụ sau minh họa triển khai scipy.odr cho hồi quy đơn biến.
import numpy as np
import matplotlib.pyplot as plt
from scipy.odr import *
import random
# Initiate some data, giving some randomness using random.random().
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([i**2 + random.random() for i in x])
# Define a function (quadratic in our case) to fit the data with.
def linear_func(p, x):
m, c = p
return m*x + c
# Create a model for fitting.
linear_model = Model(linear_func)
# Create a RealData object using our initiated data from above.
data = RealData(x, y)
# Set up ODR with the model and data.
odr = ODR(data, linear_model, beta0=[0., 1.])
# Run the regression.
out = odr.run()
# Use the in-built pprint method to give us results.
out.pprint()
Chương trình trên sẽ tạo ra kết quả sau.
Beta: [ 5.51846098 -4.25744878]
Beta Std Error: [ 0.7786442 2.33126407]
Beta Covariance: [
[ 1.93150969 -4.82877433]
[ -4.82877433 17.31417201
]]
Residual Variance: 0.313892697582
Inverse Condition #: 0.146618499389
Reason(s) for Halting:
Sum of squares convergence
Các chức năng có sẵn trong gói đặc biệt là các chức năng phổ quát, tuân theo phát sóng và lặp lại mảng tự động.
Hãy để chúng tôi xem xét một số chức năng đặc biệt được sử dụng thường xuyên nhất -
- Hàm gốc khối
- Hàm số mũ
- Hàm số mũ lỗi tương đối
- Ghi tổng hàm số mũ
- Hàm Lambert
- Hoán vị và chức năng kết hợp
- Hàm gamma
Bây giờ chúng ta hãy hiểu ngắn gọn từng hàm này.
Hàm gốc khối
Cú pháp của hàm căn bậc ba này là - scipy.special.cbrt (x). Thao tác này sẽ tìm nạp gốc khối thông minh phần tử củax.
Chúng ta hãy xem xét ví dụ sau.
from scipy.special import cbrt
res = cbrt([10, 9, 0.1254, 234])
print res
Chương trình trên sẽ tạo ra kết quả sau.
[ 2.15443469 2.08008382 0.50053277 6.16224015]
Hàm số mũ
Cú pháp của hàm mũ là - scipy.special.exp10 (x). Điều này sẽ tính toán 10 ** x phần tử khôn ngoan.
Chúng ta hãy xem xét ví dụ sau.
from scipy.special import exp10
res = exp10([2, 9])
print res
Chương trình trên sẽ tạo ra kết quả sau.
[1.00000000e+02 1.00000000e+09]
Hàm số mũ lỗi tương đối
Cú pháp của hàm này là - scipy.special.exprel (x). Nó tạo ra lỗi tương đối theo cấp số nhân, (exp (x) - 1) / x.
Khi nào xgần 0, exp (x) gần 1, vì vậy phép tính số exp (x) - 1 có thể bị mất độ chính xác nghiêm trọng. Sau đó exprel (x) được triển khai để tránh mất độ chính xác, xảy ra khix gần bằng không.
Chúng ta hãy xem xét ví dụ sau.
from scipy.special import exprel
res = exprel([-0.25, -0.1, 0, 0.1, 0.25])
print res
Chương trình trên sẽ tạo ra kết quả sau.
[0.88479687 0.95162582 1. 1.05170918 1.13610167]
Ghi tổng hàm số mũ
Cú pháp của hàm này là - scipy.special.logsumexp (x). Nó giúp tính toán nhật ký của tổng số mũ của các phần tử đầu vào.
Chúng ta hãy xem xét ví dụ sau.
from scipy.special import logsumexp
import numpy as np
a = np.arange(10)
res = logsumexp(a)
print res
Chương trình trên sẽ tạo ra kết quả sau.
9.45862974443
Hàm Lambert
Cú pháp của hàm này là - scipy.special.lambertw (x). Nó còn được gọi là hàm Lambert W. Hàm Lambert W W (z) được định nghĩa là hàm ngược của w * exp (w). Nói cách khác, giá trị của W (z) sao cho z = W (z) * exp (W (z)) với mọi số phức z.
Hàm Lambert W là một hàm đa giá trị với vô số nhánh. Mỗi nhánh đưa ra một nghiệm riêng biệt của phương trình z = w exp (w). Ở đây, các nhánh được lập chỉ mục bởi số nguyên k.
Chúng ta hãy xem xét ví dụ sau. Ở đây, hàm Lambert W là nghịch đảo của w exp (w).
from scipy.special import lambertw
w = lambertw(1)
print w
print w * np.exp(w)
Chương trình trên sẽ tạo ra kết quả sau.
(0.56714329041+0j)
(1+0j)
Hoán vị & Kết hợp
Chúng ta hãy thảo luận riêng về hoán vị và tổ hợp để hiểu chúng một cách rõ ràng.
Combinations- Cú pháp cho hàm kết hợp là - scipy.special.comb (N, k). Chúng ta hãy xem xét ví dụ sau:
from scipy.special import comb
res = comb(10, 3, exact = False,repetition=True)
print res
Chương trình trên sẽ tạo ra kết quả sau.
220.0
Note- Đối số mảng chỉ được chấp nhận cho trường hợp chính xác = Sai. Nếu k> N, N <0 hoặc k <0, thì trả về 0.
Permutations- Cú pháp cho hàm kết hợp là - scipy.special.perm (N, k). Hoán vị của N vật lấy k tại một thời điểm, tức là k hoán vị của N. Đây còn được gọi là “hoán vị từng phần”.
Chúng ta hãy xem xét ví dụ sau.
from scipy.special import perm
res = perm(10, 3, exact = True)
print res
Chương trình trên sẽ tạo ra kết quả sau.
720
Hàm gamma
Hàm gamma thường được gọi là giai thừa tổng quát vì z * gamma (z) = gamma (z + 1) và gamma (n + 1) = n !, đối với một số tự nhiên 'n'.
Cú pháp cho hàm kết hợp là - scipy.special.gamma (x). Hoán vị của N vật lấy k tại một thời điểm, tức là k hoán vị của N. Đây còn được gọi là “hoán vị từng phần”.
Cú pháp cho hàm kết hợp là - scipy.special.gamma (x). Hoán vị của N vật lấy k tại một thời điểm, tức là k hoán vị của N. Đây còn được gọi là “hoán vị từng phần”.
from scipy.special import gamma
res = gamma([0, 0.5, 1, 5])
print res
Chương trình trên sẽ tạo ra kết quả sau.
[inf 1.77245385 1. 24.]