Mengubah distribusi eksponensial menjadi python normal

Fungsi boxcox() SciPy mengimplementasikan metode Box-Cox. Dibutuhkan argumen, yang disebut lambda, yang mengontrol jenis transformasi yang akan dilakukan

  • lambda = -1. adalah transformasi timbal balik
  • lambda = -0. 5 adalah transformasi akar kuadrat timbal balik
  • lambda = 0. 0 adalah transformasi log
  • lambda = 0. 5 adalah transformasi akar kuadrat
  • lambda = 1. 0 tidak ada transformasi
from scipy.stats import boxcoxy,fitted_lambda= boxcox(y,lmbda=None)

Di sklearn

from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer(method='box-cox')
data = pt.fit_transform(data)
_

Keterbatasan dari transformasi Box-Cox adalah asumsi bahwa semua nilai dalam sampel data adalah positif

Metode Transformasi Yeo-Johnson

  • Tidak seperti transformasi Box-Cox, transformasi ini tidak memerlukan nilai untuk setiap variabel masukan harus benar-benar positif
  • Ini mendukung nilai nol dan nilai negatif. Ini berarti kita dapat menerapkannya ke kumpulan data kita tanpa menskalakannya terlebih dahulu

Di SciPy

from scipy.stats import yeojohnsony,fitted_lambda = yeojohnson(y,lmbda=None)

Di Sklearn

Kita dapat menerapkan transformasi dengan mendefinisikan objek PowerTransform dan menyetel argumen "metode" menjadi "yeo-johnson"

from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer(method='yeo-johnson')
data = pt.fit_transform(data)

Suka artikel saya? . Selain itu, saya memposting artikel baru setiap hari Minggu jadi tetap terhubung untuk artikel mendatang tentang dasar-dasar ilmu data dan seri pembelajaran mesin

Dalam pencarian saya, saya berfokus pada transformasi eksponensial karena kita dapat dengan mudah menetapkan eksponen sebagai parameter dan menyediakan rentang berkelanjutan untuk dijelajahi. Meskipun pilihan ini mengecualikan beberapa batas non-linier yang kuat, ini mengembalikan hasil yang baik secara umum

Mari kita siapkan data uji dan buat dua variabel terkait x,y, di mana y sama dengan x yang dinaikkan menjadi eksponen e, ditambah beberapa noise Gaussian. Untuk kenyamanan saya telah menetapkan varian noise Gaussian yang bergantung pada eksponen juga

#test data setting
e = 2.465 #exp
x = np.arange(0,25,0.01)
y = x**e + np.random.normal(0,10**e,x.shape)
_

Jika kita memplot data dengan plot regresi seaborn_, kita dapat dengan mudah menemukan relasi non-linier

Fungsi Biaya

Yang kita butuhkan sekarang adalah fungsi biaya, ukuran 'kebaikan' dari hubungan linier yang ingin kita maksimalkan. Indikator yang baik adalah koefisien korelasi momen-produk Pearson r, yang mengidentifikasi kekuatan korelasi linier antara dua variabel
Pearson r memiliki nilai antara -1 dan 1, di mana 1 adalah korelasi linier positif sempurna, 0 bukan korelasi linier, dan −1 mengungkapkan korelasi linier negatif sempurna;
Jadi, untuk menggunakan Pearson r dengan benar, kita akan mengambil nilai absolutnya dan meniadakannya, karena fungsi scipy.optimize mencari minima, sedangkan kita menginginkan maksimumnya

Mari kita definisikan fungsi biaya

#define cost function
def cost_function(e):
#y and x are already defined
r = np.corrcoef(y,x**e) #returns correlation matrix
#print each iteration
print('r value: {:0.4f} exp: {:.4f}'.format(r[0][1],e))
return -abs(r[0][1])

Mengoptimalkan fungsi

Pada titik ini, kita harus memanggil salah satu metode Scipy
Pilihan yang cocok adalah metode

#define cost function
def cost_function(e):
#y and x are already defined
r = np.corrcoef(y,x**e) #returns correlation matrix
#print each iteration
print('r value: {:0.4f} exp: {:.4f}'.format(r[0][1],e))
return -abs(r[0][1])
_1 karena fungsi biaya kita adalah fungsi skalar. Algoritme di balik paket ini adalah metode Brent, sebuah algoritma pencarian akar tanpa estimasi gradien

Saya telah menemukan video yang sangat lengkap dari saluran Oscar Veliz tentang metode Brent dan ketergantungannya pada metode Dekker dan garis potong. Lihat jika Anda ingin tahu lebih banyak tentang ini, dan lainnya, fungsi pengoptimalan

Mari kita mengimpor dan memanggil fungsi

#define cost function
def cost_function(e):
#y and x are already defined
r = np.corrcoef(y,x**e) #returns correlation matrix
#print each iteration
print('r value: {:0.4f} exp: {:.4f}'.format(r[0][1],e))
return -abs(r[0][1])
_1

from scipy.optimize import minimize_scalarminimize_scalar(cost_function)
_

Kami juga dapat mengatur rentang pencarian, menghindari nilai 0 untuk eksponen yang menyiratkan r Pearson untuk mengembalikan nilai yang tidak valid, bahkan jika

#define cost function
def cost_function(e):
#y and x are already defined
r = np.corrcoef(y,x**e) #returns correlation matrix
#print each iteration
print('r value: {:0.4f} exp: {:.4f}'.format(r[0][1],e))
return -abs(r[0][1])
3 dapat menanganinya

Koefisien sebenarnya didefinisikan sebagai

Jika x dinaikkan menjadi 0, standar deviasinya adalah 0, dan rasio mengembalikan nilai yang tidak valid. Untuk melakukan pencarian terbatas, mari kita panggil

minimize_scalar(cost_function,bounds=(0.1, 10), method='bounded')

Daftar yang dihasilkan adalah

r value: 0.9242 exp: 3.8815
r value: 0.8681 exp: 6.2185
r value: 0.9416 exp: 2.4371
r value: 0.9100 exp: 1.2663
r value: 0.9407 exp: 2.7565
r value: 0.9416 exp: 2.4255
r value: 0.9416 exp: 2.4861
r value: 0.9416 exp: 2.4815
r value: 0.9416 exp: 2.4819
r value: 0.9416 exp: 2.4819
r value: 0.9416 exp: 2.4819
r value: 0.9416 exp: 2.4819
fun: -0.9416331392353501
message: 'Solution found.'
nfev: 12
status: 0
success: True
x: 2.4818969221255713

Eksponen yang dihasilkan ditemukan, hanya dalam 12 iterasi, adalah 2. 482, sangat dekat dengan eksponen yang kita gunakan untuk menghasilkan data yaitu 2. 465

Suara

#define cost function
def cost_function(e):
#y and x are already defined
r = np.corrcoef(y,x**e) #returns correlation matrix
#print each iteration
print('r value: {:0.4f} exp: {:.4f}'.format(r[0][1],e))
return -abs(r[0][1])
_4 menunjukkan nilai nilai absolut negatif dari Pearson r, yang tampaknya cukup tinggi. Mari kita plot lagi y dan x menerapkan eksponen yang ditemukan pada x, kita akan melihat hubungan linier yang kuat

Jika kita menyimpan setiap eksponen iterasi dan koefisien Pearson terkait, kita dapat memplot kurva r-eksponen

Tes lainnya

Bagaimana jika kita meningkatkan dampak noise pada data pengujian?

y = (x**e) + np.random.normal(0,20**e,x.shape)

Eksekusi fungsi optimasi mengembalikan hasil berikut

fun: -0.42597730774659237
message: 'Solution found.'
nfev: 13
status: 0
success: True
x: 2.2958258442618553

Eksponen optimal yang ditemukan tidak setepat hasil sebelumnya, tetapi masih memiliki aproksimasi yang baik

Meningkatkan lebih banyak dampak kebisingan akan menyebabkan hasil yang menyesatkan karena mengatasi kebisingan pada data inti

Kesimpulan

Metode pengoptimalan adalah tambang emas bagi banyak aplikasi yang siap dieksplorasi. Dengan artikel ini, saya tidak ingin mengajarkan teknik baru tetapi saya ingin mempromosikan eksperimen metode efektif ini pada masalah 'tidak biasa'

Bagaimana Anda mengubah distribusi eksponensial menjadi distribusi normal?

Lagipula, jika f. R→R adalah fungsi yang f(X) memiliki distribusi Normal(μ,σ) setiap kali X memiliki distribusi Eksponensial(λ), maka fungsi g(x)=τ( . τ. ) distribusi. has a Normal(ν,|τ|) distribution.

Bagaimana Anda mengonversi data ke distribusi normal dengan Python?

Memeriksa distribusi dengan Skewness
Pengecekan distribusi beberapa variabel menggunakan Histogram
Memeriksa distribusi variabel menggunakan plot KDE
Memeriksa distribusi variabel menggunakan plot Q-Q
Transformasi untuk mengubah distribusi fitur

Bagaimana Anda mengonversi non

Pada dasarnya ini hanya meningkatkan distribusi menjadi pangkat lambda (λ) untuk mengubah distribusi non-normal menjadi distribusi normal. Parameter lambda (λ) untuk Box-Cox memiliki rentang -5 < λ < 5. Jika parameter lambda (λ) ditentukan menjadi 2, maka distribusi akan dipangkatkan menjadi 2 — Y2.

Bagaimana cara mengubah data miring ke distribusi normal dengan Python?

Mencatat Transformasi Data Miring untuk mendapatkan Distribusi Normal .
Langkah 1. Muat perpustakaan yang diperlukan
Langkah 2. Muat kumpulan data
Langkah 3. Gambarlah plot distribusi
Langkah 4. Log Mengubah Variabel Miring. Mari kita ubah log variabel ini dan lihat apakah distribusi variabel ini bisa mendekati normal