Deklarasyon Programlama Dili Olarak Python
Programlama dilleri karşılaştırma oyunlarına bakarsanız, Python, en yaygın kullanılan programlama dillerinden biridir . Saf Python ile yazılmış tipik programlar C veya C ++ ile yazılan eşdeğer programdan 40 kat daha yavaşdır.
Performans cezasına rağmen, Python hala Veri Analizi ve Makine Öğrenimi yapmak için orada en popüler dil tercihi. Son Deep Learning çerçevelerinin çoğu, geliştirilmek üzere Python'u hedefliyor: TensorFlow, Theano ve Keras, hepsi Python kullanıyor. Torch, Lua için, LuaJIT kullanırken Python'dan önemli ölçüde daha hızlı olan - ama Torch PyTorch'un serbest bırakılmasıyla Python'a geçene kadar çekiş kazanamadığı için yazılmıştır.
Bunun nedeni, Python'daki programlardaki performans cezasının programlama dili karşılaştırması oyununun önereceği kadar büyük olmamasıdır: En iyi Python Veri kitaplıklarının çoğunun ana yordamları yerel uzantılar olarak yazılmıştır.
Tüm bunlar, bu kütüphanelerden en iyi şekilde yararlanmak için, Python'u bir Deklarasyon Dil olarak ele almanız ve yerel bir katmana mümkün olduğunca fazla kontrol akışı sağlamanız ve sadece Python programının ne yapılması gerektiğini açıklamasına izin vermeniz gerektiği anlamına gelir.
Beyan Programlama Dilleri
Bildirge Programlama Dilleri, neyin hesaplanması gerektiğini açıklamaya odaklanır - ve bu hesaplamaların nasıl yapılacağından bahsetmekten kaçınır. Pratikte bu, kontrol akışının ifadelerinden kaçınmak anlamına gelir: döngüler ve koşullu ifadeler, hesaplanması gereken şeyin mantığını açıklayan daha yüksek düzeyli yapılarla kaldırılır ve değiştirilir.
Bir bildirimsel programlama dilinin olağan örneği SQL'dir. Hangi verileri hesaplamanızı istediğinizi tanımlamanızı sağlar - ve bunu verimli bir şekilde veritabanı şemasına çevirir. Bu, sorguyu yürütme ile ilgili ayrıntıları belirtmekten kaçınmanıza ve bunun yerine, sorgu iyileştiricisinin duruma göre en iyi dizin ve sorgu planını belirlemesine izin verir.
Python tam bir Deklaratif Dil değildir - ancak aynı ilkeleri kullanan Etki Alanı Özel API'leri oluşturmak için durgun hızına katkıda bulunan aynı esneklik kullanılabilir. Bunun nasıl oynadığına dair birkaç özel örneğe bakmanın ilginç olacağını düşündüm.
NumPy
NumPy'nin tasarımı, yalnızca daha temiz ve anlaşılması kolay olmayan, aynı zamanda büyük ölçüde daha hızlı olan kodlara yol açan bir çift düzgün deklarasyon programlama özelliğine sahiptir.
Bunun basit bir örneği, seyrek bir matrise TF-IDF ağırlığını uygulamak olabilir . Aslında, temel öneri kütüphanesi için temel bir temel olarak en yakın bazı en yakın komşu tavsiyesi kodunu eklemek için bunu yapmam gerekiyordu ve bunun hakkında konuştuğum şeyin iyi bir örneğini sağlayacağını düşündüm.
Zorunlu bir tarzda, seyrek bir matris üzerindeki TF-IDF ağırlığı aşağıdaki gibi yazılabilir:
Bu kodda 2 farklı döngü vardır ve bunların her biri farklı NumPy dil yapıları ile değiştirilebilir.
İlk döngü için IDF'nin kendisi hesaplanır. Numpy Eğer değerler diziler yanı sıra tek değerler ve vectorized formunu kullanmak onun çok daha hızlı neredeyse tüm işlemleri yapabilmenizi sağlar: .idf = log(N / (1.0 + bincount(X.col)))
Bu, NumPy'ye işlevden döndürülen dizinin üzerine dönmesini ve uygun şekilde dönüştürülmüş IDF değerine sahip yeni bir dizi oluşturmasını söyler . Aslında, NumPy'ye hangi sonucu istediğimizi ve en iyi şekilde nasıl hesaplanacağını anladığımızı söylüyoruz.bincount(X.col)
Nihai TF-IDF ağırlığı, Numppy'nin dizi endeksleme özelliğini kullanarak benzer bir şekilde yapılabilir . Bu özellik, bir diziyi başka bir diziye dizin olarak kullanmanıza izin verir. Gidip, IDF'deki her bir sütun değerini X'ten arar ve o sütunun IDF ağırlığına sahip bir dizi döndürür.idf[X.col]
Hepsini bir araya getirmek, aşağıdaki gibi kodlara yol açar:
def tfidf_declarative (m):tfidf_declarative ( m ):
X = coo_matrix (m)= coo_matrix ( m )
# IDF'yi hesapla# IDF'yi hesapla
N = yüzer (X.shape [0])= Şamandıra ( x . Şekil [ 0 ])
idf = günlüğü (N / (1 + bincount (X.col)))= Log ( N / ( 1 + bincount ( x . Col )))
# TF-IDF ayarını uygular# TF-IDF ayarını uygular
X.data = sqrt (X.data) * idf [X.col]. Veri = sqrt ( x . veriler ) * IDF [ X . col ]
X dönüşX dönüş
Beyanname versiyonu sadece daha kısa ve daha okunaklı olmakla kalmaz, aynı zamanda daha hızlıdır. Döngüleri kaldırarak, yinelenen C vektörlü çağrılarda gerçekleşebilir ve bu kod , dizüstü bilgisayarımdaki zorunlu sürümden 75 kat daha hızlı çalışır . Herhangi bir döngüyü yazmaktan kaçınarak, gerçekleşmesi gereken işlemleri açıkladık ve NumPy'nin bunu kontrol akışına çevirmesine izin verdik.
TensorFlow
Sıkça sorulan sorulardan biri, TensorFlow gibi Derin Öğrenme çerçevelerinin C ++ gibi daha hızlı bir dil yerine Python için yazılmasının nedenidir .
Cevap, çoğu zaman bu çerçevelerin C ++ gibi bir dilde yazılmış olması, ancak aramayı kolaylaştırmak için bir Python API'si sağlamasıdır. Python kodu sadece gerçekleştirilmesi gereken hesaplamaları açıklar, tüm gerçek çalışmalar kütüphanede C ++ veya CUDA çağrıları GPU'da yapılır.
Doğrusal Regresyon yapmak için TensorFlow kullanan bu basit işleve bir göz atın:
line linear_regression (train_X, train_Y, learn_rate = 0.005):linear_regression ( train_X , train_Y , learn_rate = 0.005 ):
# giriş verileri için yer tutucuları tanımlayın# giriş verileri için yer tutucuları tanımlayın
X, Y = tf.placeholder ("float"), tf.placeholder ("float"), Y = tf . yer tutucu ( "float" ), tf . yer tutucu ( "float" )
# öğrendiklerimizi tanımla# öğrendiklerimizi tanımla
eğim, kesişme = tf.varisi (0.0), tf.varisi (0.0), kesişme = tf . Değişken ( 0.0 ), tf . Değişken ( 0.0 )
# sıradan en küçük kareler kaybı işlevinde eğimi / kesişmeyi öğrenir# sıradan en küçük kareler kaybı işlevinde eğimi / kesişmeyi öğrenir
loss_function = (Y - (X * eğim + kesişme)) ** 2= ( Y - ( X * eğim + kesişme )) ** 2
# temel bir GD iyileştirici kullanarak eğim / kesişme parametrelerini bulmak# temel bir GD iyileştirici kullanarak eğim / kesişme parametrelerini bulmak
train = tf.train.GradientDescentOptimizer (learn_rate) .minim (loss_function)= tf . tren . GradientDescentOptimizer ( learn_rate ). minimize ( loss_function )
tf.Session () ile oturum olarak:ile tf . Oturum () olarak sess :
tf.global_variables_initializer (). çalıştırın (). global_variables_initializer (). koş ()
# Modeli eğit# Modeli eğit
x aralığında (100):için x olarak aralık ( 100 ):
sess.run (tren, feed_dict = {X: tren_X, Y: tren_Y}). koş ( tren , feed_dict = { X : tren_X , Y : tren_Y })
session.run (eğim), sess.run (kesişme)dönüş oturumu . çalıştırma ( eğim ), sess . çalıştırma ( kesişim )
Hat sayısı açısından, fonksiyonun çoğu, optimize etmeye yönelik değişkenleri, öğrenmeye çalıştığımız lineer modeli ve bu fonksiyonu öğrenmek için kayıp fonksiyonu ve optimizasyon yöntemini tanımlamaktır. Bu çağrıların hiçbiri hiçbir işe yaramıyor - bunların hepsi ne yapılması gerektiğine dair bir hesaplama grafiği ilan etmektir.
Temel olarak burada her şey eğitim fonksiyonunun çağrısında olur . Bu çağrı, değişkende tanımlanan hesaplama grafiğini , yer tutucu değişkenleri X ve Y'yi eğitim verilerine bağlar ve regresyon katsayılarını öğrenmek için grafiği çalıştırır.sess.runtrain
Süper yapıştırıcı olarak piton
Python bir çeşit tutkal gibidir - farklı kütüphaneleri birbirine bağlamak için iyi çalışır, ancak bunun dışında büyük bir hızlı program oluşturmaya çalışırsanız, çabucak geçmesi zor olan bir yapışkan karmaşa ile sonuçlanırsınız.
Veri İşleme ve Makine Öğrenimi görevlerinde bu kadar başarılı olmasının nedeni, kütüphanelerin çoğunun gerçekleştirmek istediğiniz işlemleri bildirdiğiniz API'leri benimsemesi ve kütüphanenin bu beyanları daha düşük bir dilde etkin bir şekilde yürütmesidir. Bu, her iki dünyanın da en iyisine yol açar, Python'da yazmayı kolaylaştıran kod C ++ ile yazılmış kod kadar hızlı çalışır.
Bir zorunluluk stili kullanmak, yapıştırıcıdan çok fazla zaman harcayacağınız, ancak hangi işlemlerin istediğinizi açıkladığına ve etkili ve temiz kodlara yol açtığınız anlamına gelir.
Bunun yan etkisi, harika bir Python programcısı olmak için, daha düşük bir dilde de programlamayı öğrenmeniz gerektiğidir. En popüler Python veri kitaplıklarının tümü yerel uzantılara sahiptir: TensorFlow, scikit-learn, NumPy, Pandalar, SciPy, spaCY vb. Kodların hepsinin ana dilinde yazılmış kodları vardır. Eğer sadece bu kütüphaneleri kullanmanın rahatlığı sadece iyi bir Python programcısı olmak için yeterlidir; Ancak, bu gibi kütüphaneler üretebilen bir programcı türü olmak istiyorsanız, C ++ ya da Cython gibi bir şeyi de öğrenmelisiniz.