blog posts

Python’da Optimizasyon SciPy ile Python’da Optimizasyon Kapsamlı bir rehber

SciPy Python ile optimizasyon yazısında sunulan kümeleme örneğinde spam mesajları sağlıklı mesajlardan ayırmak için bir algoritma geliştirildi. Kmeans() kullanılarak, içinde 20’den fazla rakam bulunan iletilerin spam olma ihtimalinin çok yüksek olduğu keşfedildi. Optimizasyon örneğinde, önce tek değişkenli şeffaf bir matematiksel fonksiyonda minimum değer kontrol edildi.

Python’da Optimizasyon

İnsanlar Python programlama dilinde bilimsel çalışma yapmak istediğinde kullanılabilecek ilk kütüphane SciPy’dir. Python’da Optimizasyon makalesinde bahsedildiği gibi, psypy yalnızca bir kitaplık değil, insanların karmaşık bilimsel görevleri hızlı ve güvenilir bir şekilde yapmasına yardımcı olmak için birlikte çalışan kitaplıklardan oluşan eksiksiz bir ekosistemdir . Bu kılavuzda aşağıdaki konular incelenmektedir:

  • SciPy kitaplığı kullanılarak neler yapılabileceğini kontrol edin
  • SciPy’yi bilgisayara yükleyin
  • Birden çok değişken içeren bir veri kümesini kümelemek için SciPy’yi kullanma
  • Bir fonksiyonun optimumunu bulmak için SciPy’yi kullanma

>> import scipy >>> help(scipy)

Yukarıdaki komutu kullanmak, tüm Saipy kitaplığı çevresinde çıktılar üretecektir. Bu çıktının bir kısmı aşağıda gösterilmiştir.

-----------

Bu alt paketlerden herhangi birini kullanmak, açık bir içe aktarma gerektirir. Örneğin,
``scipy.cluster'ı içe aktar''.

::

 küme --- Vektör Niceleme / Kmeans
 fft --- Ayrık Fourier dönüşümleri
 fftpack --- Eski ayrık Fourier dönüşümleri
 entegre --- Entegrasyon rutinleri
...

Bu kod bloğu, aslında SciPy’de bulunan ve hesaplamaları gerçekleştirmek için kullanılabilecek tüm modüllerin bir listesi olan yardım komutunun çıktısının Alt Paketler bölümünü görüntüler. Çıktının üst kısmında görüntülenen metin dikkat çekicidir. Bu bölüm şu anlama gelir: “Bu alt paketlerden herhangi birini kullanmak, açık bir içe aktarma gerektirir”. Kullanıcılar Saipy’de bir modülün fonksiyonlarını kullanmak istediklerinde kullanmak istedikleri modülü import etmeleri gerekmektedir. Bu konudaki örnekler, bu konuyu daha iyi anlamaya yardımcı olan Python’da optimizasyonla ilgili aşağıdaki makalede sunulmuştur.

Kullanıcı hangi modülü kullanacağına karar verdiğinde, SciPy’deki her bir modülle ilgili tüm detayları içeren SciPy API Referansını kontrol edebilir. Ayrıca, kullanıcı daha fazla açıklama içeren kılavuzlar arıyorsa, bu kütüphanenin web sitesinde bulunan Saipy’de verilen derslerin transkriptini kullanması tavsiye edilir. Bu ders transkriptleri, Python modüllerine daha derinlemesine bakmak için harika kaynaklardır. Bu kılavuzun devamında Saipay’in en önemli ve faydalı modüllerinden ikisi olan cluster ve optimize incelenecektir. Ancak öncelikle kullanıcının Saipy kütüphanesini bilgisayarına kurması gerekiyor.

SciPy bir bilgisayara nasıl kurulur

Python ile optimizasyon yazımızın bu bölümünde SciPy’yi bilgisayara kurma yöntemi incelenmektedir. Diğer Python paketlerinde olduğu gibi, SciPy’yi bir bilgisayara kurmanın iki temel yolu vardır:

  • anakonda
  • PyPI ve pip

Python’daki optimizasyonun devamında, yukarıda açıklanan her iki yaklaşımı kullanarak SciPy’yi kurma yöntemi açıklanmaktadır. psypy’nin tek önkoşulu ve aslında yazılım bağımlılığı, nampy kitaplığıdır. Python’da Optimizasyon makalesinin devamında açıklanan her iki yükleme yöntemi de, gerekirse psypy kitaplığına ek olarak nampy kitaplığını da otomatik olarak kurar. “Gerekirse” terimi, Saipai kurulmadan önce Nampai kitaplığının uygun bir sürümü sistemde kurulu değilse, bu kitaplığın kurulum işlemi sırasında otomatik olarak kurulacağı anlamına gelir.

anakonda

Anaconda Python Distribution popülerliğini Windows, macOS ve Linux için yerleşik bilimsel kitaplıklarına borçlu olan popüler .dağıtımıdırPythonbir

Anaconda, sistemlerinde Python kurulu olmayan kullanıcılar için oldukça uygun bir seçenektir. Anaconda’yı kurarak, Saipy gerekli tüm kitaplıklar ve aslında bağımlılıkları ile birlikte kullanıcının sistemine varsayılan olarak kurulacaktır. Bu nedenle, sistemlerinde Anaconda kurulu olan kullanıcıların herhangi bir şey kurmasına gerek kalmayacak ve Saipy varsayılan olarak sistemlerine kurulacaktır. Anaconda Python dağıtımı hakkında daha fazla ve ek okuma için aşağıdaki materyalleri okumanız önerilir.

  • Anaconda Python Dağıtımı — sade bir dille
  • Anaconda’yı Windows’a Kurmak – basit terimlerle
"Python'da

Python optimizasyon makalesini okurken veya okuduktan sonra Anaconda’yı kurmayı düşünen kullanıcıların Python’un en son sürümünü kurmaları şiddetle tavsiye edilir.SciPy  Anaconda yükleyiciyi kullanıcının sisteminde çalıştırırken, sistemde Anaconda uygulaması için varsayılan yükleme yordamı gerçekleştirilebilir.

Not: Kullanıcılar, Anaconda’nın sistem yöneticisine (Yönetici İzinleri) erişim gerektirmeyen bir klasöre kurulduğuna dikkat etmelidir. Bu ayarlar, yükleyicide varsayılan olarak mevcuttur.

Sisteminde Anaconda yüklü olan ancak Saipy’yi yüklemeyi veya güncellemeyi düşünen kullanıcılar, bunu Python’daki optimizasyon makalesinin bu bölümünün geri kalanında açıklanan komutları kullanarak yapabilirler. Kullanıcının öncelikle “macOS”ta “Terminal” veya Windows’ta “Linux” veya “Anaconda Prompt” yazıp aşağıdaki kod satırlarından (kurulum amacına veya güncelleme amacına göre) birini yazıp import etmesi ve çalıştırması gerekmektedir.

$ conda install scipy
$ conda update scipy

Kullanıcı, SciPy’yi kurması gerekiyorsa ilk satırı kullanmalı ve sisteminde kurulu SciPy’yi güncellemek istiyorsa, yukarıda verilen ikinci komutu kullanmalıdır.

>>> import scipy
>>> print(scipy.__file__)
/.../lib/python3.7/site-packages/scipy/__init__.py

Yukarıdaki kod kutusunda görülebilen kod parçasında SciPy kitaplığı girilir (Import | Import) ve SciPy dosyasının yüklendiği konum da yazdırılır. Yukarıdaki örnek macOS içindir. Muhtemelen, kullanıcının bilgisayarı farklı bir durum gösterir. Artık kullanıcı Saipy’i sistemine kurmuştur ve bu kütüphane kullanıma hazırdır. Bu makalenin okuyucuları, pip’e tam olarak aşinalarsa, Python’da optimizasyonla ilgili makalenin bir sonraki bölümünü, yani Pip ile ilgili bölümü okumadan atlayabilir ve doğrudan Python’da optimizasyon hakkındaki makalenin devamını inceleyebilir ve Aslında, SciPy kitaplığı ile ilgili bölümler. Ancak genel olarak okuyucuların yazının tamamını okuması tavsiye edilir.

SciPy’yi pip kullanarak kurun

Şu anda sistemlerinde Python’un bir sürümü kurulu olan ancak kurulu sürüm Anaconda Python dağıtımı olmayan veya Anaconda’yı hiç kullanmayı düşünmeyen kullanıcılar pip’i psypy’yi yüklemek için kullanabilirler.

Not: pip, paketleri tekerlekler adı verilen bir biçim kullanarak kurar. Tekerlek biçiminde, kod kullanıcının bilgisayarına gönderilmeden önce derlenir .

Bu, Anaconda tarafından alınana çok benzer bir yaklaşımdır. Ancak, tekerlek dosya formatı Anaconda dosya formatından biraz farklıdır ve ikisi birbirinin yerine kullanılamaz.

SciPy’yi pip kullanarak kurmak için öncelikle terminali açmalı ve aşağıdaki komutu yazmalısınız.

$ python -m pip install -U scipy

Yukarıdaki kod kutusunda verilen kod, kullanıcının sisteminde kurulu değilse saipy kütüphanesini kuracaktır. Ayrıca Saipy, kullanıcının sisteminde zaten kuruluysa onu yükseltir. Yukarıdaki komutu çalıştırdıktan sonra Python kütüphanesinin doğru kurulduğundan emin olmak için terminalde Python’u çalıştırmalı SciPy ve SciPy kütüphanesini import etmeye çalışmalısınız.

>>> import scipy
>>> print(scipy.__file__)
/.../lib/python3.7/site-packages/scipy/__init__.py

Yukarıda verilen kod parçacığında, içe aktarılan SciPy kitaplığı ve buradan yüklenen dosyanın konumu da yazdırılır. Yukarıdaki örnek, Mac OS ve pyenv kullanılarak yapılmıştır. Her kullanıcının bilgisayarı farklı bir adres gösterebilir. SciPy Python kitaplığı kullanıcının sistemine başarıyla kurulduğuna göre, aşağıdaki Python optimizasyon makalesinde kullanıcının SciPy ile çalışırken karşılaşacağı zorluklarla nasıl başa çıkabileceği tartışılacaktır.

SciPy kitaplığında Küme modülünü kullanma

Python ile optimizasyon yazısının bu bölümünde Cluster modülünün SciPy kütüphanesinde kullanım yöntemi incelenmiştir. “Kümeleme” (Kümeleme) , veri sınıflandırması için mevcut olan popüler yöntemlerden biridir (burada sınıflandırma kelimesinin kullanımı, denetimli bir öğrenme yöntemi olarak kabul edilen sınıflandırma anlamına gelmez ve yalnızca veri bölümlendirme işine atıfta bulunur). Kümelemede, veriler farklı veri gruplarına atanarak sınıflandırma yapılır. Saipy kitaplığı, çeşitli kümeleme algoritmalarının varsayılan uygulamalarına sahiptir.

Saipy kütüphanesinde varsayılan olarak bulunan kümeleme algoritmaları arasında “ K-Means” algoritması ve “Hiyerarşik Kümeleme Algoritmaları” sayılabilir . Python’da optimizasyonla ilgili makalenin bu bölümünde sunulan örnekte, veri kümeleme için varsayılan olarakşu Python kitaplığında ve .cluster.vq’de bulunan K-Means algoritması kullanılır. vq aslında Vector Quantization (VQ) anlamına gelir.

"Python'da

Python’da optimizasyon konulu makalenin bu bölümünün devamında, öncelikle Python’da optimizasyon konulu makalenin bu bölümünde belirtilen örnek için kullanılan “Veri Kümesi” kısaca gözden geçirilecektir. “SMS Spam Collection Data Set” olarak yayınlanan bu veri setinde 4827 gerçek kısa mesaj (SMS) ve 747 “Spam” maddesi bulunmaktadır. Burada kullanılan ham veri seti UCI Makine Öğrenimi Havuzundan [ + ] indirilebilir .

Not:

Bu veri kümesindeki veriler Tiago A Almeida ve José María Gómez Hidalgo tarafından derlenmiştir. Bu veriler “SMS Spam Filtreleme Çalışmasına Katkılar: Yeni Koleksiyon ve Sonuçlar” başlıklı bir makalede yayınlandı. Bu makale, Amerika Birleşik Devletleri’nde (ABD) Mountain View, Santa Clara County’de düzenlenen 2011 ACM Sempozyumu Doküman Mühendisliği | DOCENG’11’de yayınlandı. İndirilebilen ücretsiz ve herkese açık veri kümeleri hakkında daha fazla bilgi edinmek için aşağıdaki içeriği okumanız önerilir.

  • Veri bilimi ve makine öğrenimi için ücretsiz ve indirilebilir veri kümeleri
  • Veri Madenciliği ve Yapay Zeka için Genel Veri Kümeleri – Pratik Bir Kılavuz

SMS Spam Toplama Veri Kümesinde, her ileti aşağıdaki iki etiketten birine sahiptir:

  • “gerçek” ve aslında “doğru” mesajlar için “ham” etiketi
  • “spam” veya “spam” mesajları için “spam” etiketi

Her yama ile ilişkili tam metin mesajı da veri setinde mevcuttur. Veriler kullanıcı tarafından kısaca gözden geçirildiğinde (Tara), bazı kullanıcılar spam mesajlarının büyük bir sayı ile yazılmış rakamlar içerdiğini fark edebilir. Bu spam mesajlar genellikle bir telefon numarası veya ödül mesajı içerir. Aşağıda, SciPy kitaplığı ve varsayılan olarak SciPy kitaplığında bulunan K-Means kümeleme algoritması kullanılarak Python’da yapılan optimizasyon, bir iletinin spam olup olmadığını tahmin edecektir ve aslında, bir iletinin spam olup olmadığını tahmin edecektir. mesaj gerçek mi yoksa spam mı? Bu, kısa metin mesajındaki (SMS) basamak sayısına göre yapılacaktır.

  • İstenmeyen Posta Olmayan: Sayı olarak yazılan en düşük rakamlı iletiler, istenmeyen posta olmayan (orijinal) olarak sınıflandırılır.
  • Bilinmeyen : Sayı olarak yazılan ortalama basamak sayısına sahip mesajlar, bilinmeyen kümeye yerleştirilir ve daha gelişmiş algoritmalar SciPy  tarafından kontrol edilmesi gerekir.
  • Spam: Sayı olarak yazılan en fazla rakam içeren iletiler spam olarak kabul edilir.

Python’da optimizasyonla ilgili makalenin bu bölümünün devamında, kısa metin mesajlarını spam, spam olmayan ve bilinmeyen olmak üzere üç kategoriden birine sınıflandırma görevi, metin mesajlarını kümeleyerek yapılır.

elgorıtm 1

pathlib'den içe aktarma Yolu
numpy'yi np olarak içe aktar
scipy.cluster.vq'dan whiten, kmeans, vq'yi içe aktarın

Yukarıdaki kod parçacığında, scipy.cluster.vq’den üç işlevin (yani beyazlatmak, K-Means ve vq) içe aktarıldığı görülebilir. Bu üç işlevin her biri girdi olarak bir ad dizisi alır. Bu diziler , veri kümesinin sütunlarında “Özellikler” (Özellikler) ve veri kümesinin satırlarında “Gözlemler” (Gözlemler | Örnekler) içermelidir .

” Özellik ” aslında verilerin açıklamasını açıklayan ilginç bir değişkendir. Ancak gözlem, aslında özellikleri kaydedilerek kayıt altına alınan bir durumdur. Bu örnekte, 5.574 görüntüleme veya aslında bağımsız metin mesajları vardır. Bu veri kümesinde, her veri örneği (veya aslında her gözlem) için iki özellik vardır:

  • Metin mesajındaki hane sayısı
  • Kaydedilen basamakların tüm veri setinde tekrarlanma sayısı.

Bu adımda, UCI veritabanındaki veriler yüklenmelidir. Veriler bir metin dosyası olarak yüklenmelidir. Veriler bir metin dosyası olarak içe aktarılırken, mesaj kategorisi (küme) bir sekme karakteri kullanılarak mesajın kendisinden ayrılır.

data = Path("SMSSpamCollection").read_text()
data = data.strip()
data = data.split("\n")

Bu kodda, dosyayı bir dizge olarak okumak için pathlib.Path.read_text() kullanılır . Ardından, strip()’ten. Dize boyunca herhangi bir boşluk kaldırmak için kullanılır. Ayrıca, strip() komutunu kullanarak soyun. Bir listeye girer.

Artık verileri analiz etmeye başlayabiliriz. Bu bağlamda, her metin mesajında ​​görünen basamak sayısı sayılmalıdır. Python’un standart kütüphanesinde, sözlük benzeri bir yapıda nesnelerin sayısını toplama (sayma) imkanı sağlayan collections.Counter vardır. Ancak, scipy.cluster.vq içindeki tüm işlevler giriş olarak pasta adı dizilerini kabul ettiğinden, kullanıcı bu örnek için collections.Counter’ı kullanamaz. Bunun yerine, dizi adları kullanılır ve sayaç elle, aslında sıfırdan uygulanır.

digit_counts = np.empty((len(veri), 2), dtype=int)
for i, line in enumerate(data):
    case, message = line.split("\t")
    num_digits = sum(c.isdigit() for c in message)
    digit_counts[i, 0] = 0 if case == "ham" else 1
    digit_counts[i, 1] = num_digits

Aşağıda bu kodun çalışma şekli satır satır anlatılmıştır.

  • Kodun 8. satırı: verilerde döngü yapılır. Burada enumerate(), listeyi satır içinde değerlendirmek ve bu liste için i indeksini yapmak için kullanılır.
  • Kodun 9. satırı: büyük/küçük harf ve mesaj oluşturmak için sekme karakterini (boşluk) kullanarak satırı keser. case, iletinin tekrar jambon mu yoksa spam mı olduğunu söyleyen bir dizedir; mesaj ise mesajın metnini içeren bir dizedir.
  • 10. satır kod: Sum() kullanılarak mesajda sayısal olarak yazılan basamak sayısını sayar .SciPy  Mesajdaki her karakter isdigit() kullanılarak kontrol edilir. Ardından, öğe sayısal ise True, aksi takdirde False döndürür. Bundan sonra sum(), herhangi bir geçerli değeri bir (1) ve herhangi bir yanlış değeri sıfır (0) olarak ele alır. Bu nedenle, bu gerçekleştirmelerdeki sum()’un sonucu, isdigit()’in True olduğu durum için karakter sayısıdır.
  • Kod satırı 11: Değerler digit_counts’a atanır. Mesaj meşru (ham) veya meşru ise, i satırının ilk sütunu 0’a atanır ve mesaj spam veya spam (Spam) ise, i satırının ilk sütunu 1’e atanır.
  • Satır 12: Değeri digit_counts’a atar. i satırının ikinci sütunu, mesajdaki basamak sayısına atanır.
unique_counts = np.unique(digit_counts[:, 1], return_counts=True)

elgorıtm 2

unique_counts = np.transpose(np.vstack(unique_counts))

np.unique() öğesinin iki 1xN çıktısını np.vstack() kullanarak bir 2xN dizisine dönüştürmeli ve ardından bunları bir 2x Nx dizisine aktarmalıdır . Bu biçim, kullanıcının kümeleme işlevinde kullandığı biçimdir. Bunu yaptıktan sonra unique_counts içindeki her satır, aşağıda açıklanan iki öğeyi içerir.

  • Mesajda sayısal olarak yazılan hane sayısı
  • Sayısal biçimde yazılmış basamak sayısına sahip mesajların sayısı.

Bu iki işlemden elde edilen çıktının bir alt kümesi aşağıda gösterilmiştir.

[[   0 4110]
 [   1  486]
 [   2  160]
 ...
 [  40    4]
 [  41    2]
 [  47    1]]

Veri setinde herhangi bir rakam içermeyen 4110 adet mesaj bulunmaktadır; 486 vakanın sadece bir rakamı vardır ve bu böyle devam eder. Şimdi, kullanıcının bu diziye K-Means kümeleme algoritmasını uygulaması gerekiyor.

whitened_counts = whiten(unique_counts)
codebook, _ = kmeans(whitened_counts, 3)
  • kmeans() tarafından döndürülen değerlerden biri, her grubun ağırlık merkezlerini temsil eden üç satır ve iki sütundan oluşan bir dizidir . kmeans() algoritması, gözlemlerden her merkeze olan mesafeyi en aza indirerek her bir kümenin merkez noktası için en uygun konumu hesaplar. Bu dizi, kod defterine atanır.
  • Bir gözlemden başka bir merkeze olan Öklid mesafesinin medyanı, kmeans() işlevi tarafından döndürülen değerdir. Kullanıcının tüm örnek için bu değere ihtiyacı yoktur, bu nedenle _ öğesine atayabilirler.

Python’da optimizasyon örneğinin devamında, kullanıcı vq() kullanarak her bir gözlemin hangi kümeye ait olduğunu belirtmelidir.

codes, _ = vq(unique_counts, codebook)

vq(), kod defterindeki kodları her bir gözleme atar. Bu işlev ayrıca çıktıda iki değer döndürür.

  • İlk değer, unique_counts ile aynı uzunlukta bir dizidir; burada her öğenin değeri, her gözlemin hangi kümeye atandığını gösteren bir tam sayıdır. Bu örnekte üç küme kullanıldığı düşünülürse, her gözlem 0, 1 veya 2 kümesine atanır.
  • İkinci değer, her gözlem ile merkezi arasındaki Öklid mesafesinin bir dizisidir.

elgorıtm 3

ham_code = codes[0]
spam_code = codes[-1]
unknown_code = list(set(range(3)) ^ set((ham_code, spam_code)))[0]

Bu kodda ilk satır sağlıklı mesajlara atanan kodları bulur. Yukarıda sunulan teoriye göre, sağlıklı mesajlar en az basamak sayısına sahiptir ve basamak dizisi en az basamaktan çoğu basamağa doğru depolanır. Bu nedenle, sağlıklı iletiler kümesi kodun başında başlar.

Benzer şekilde, spam iletileri en fazla rakama sahiptir ve bu nedenle kodlardaki son kümeyi oluşturur. Bu nedenle, istenmeyen mesajların kodu, kodların son öğesine eşit olacaktır. Son olarak, kullanıcının Bilinmeyen Mesajlar ile ilgili kodu bulması gerekir. Kod için yalnızca üç seçenek olduğu ve bunlardan ikisinin şu anda tanımlı olduğu düşünülürse Python setindeki symmetric_difference operatörü kodun son değerini belirlemek için kullanılabilir. Ardından kullanıcı, her mesaj türüne karşılık gelen kümeyi yazdırabilir.

print("definitely ham:", unique_counts[codes == ham_code][-1])
print("definitely spam:", unique_counts[codes == spam_code][-1])
print("unknown:", unique_counts[codes == unknown_code][-1])

Yukarıdaki kod parçacığında, vq()’nin farklı kod değerleri atadığı unique_counts içindeki her satırı bulur. Bu operatörün çıktıda bir dizi döndürdüğü göz önüne alındığında, her bir kümeye atanan en yüksek basamak sayısını belirlemek için dizinin son satırının alınması gerekir. Çıktı aşağıda gösterilmiştir.

kesinlikle jambon: [0 4110]
kesinlikle spam: [47 1]
bilinmeyen: [20 18]

Bu çıktıda, Ham mesajlarının kesinlikle mesajda sıfır haneli mesajlar olduğunu görebilirsiniz; Bilinmeyen mesajların metinlerinde 1 ile 20 arasında rakamlar bulunur ve Kesinlikle Spam mesajları, veri kümesindeki en büyük rakam olan 21 ile 47 haneli mesajlar içerir. Şimdi veri seti üzerinde yapılan tahminlerin ne kadar doğru olduğunun kontrol edilmesi gerekmektedir. İlk olarak digit_counts için maskeler yapılmalı ki mesajların jambon veya spam durumunu kolayca alabilelim.

digits = digit_counts[:, 1]
predicted_hams = digits == 0
predicted_spams = digits > 20
predicted_unknowns = np.logical_and(digits > 0, digits <= 20)

Bu kodda, mesaj içinde herhangi bir rakamın bulunmadığı tahmin edilen_hams maskesi oluşturulur. Ardından, 20 basamaktan fazla olan tüm iletiler için tahmin edilen_istenmeyen postalar maskesi oluşturulur. Son olarak, ortadaki mesajlar tahmin edilen_bilinmeyenlerdir. Ardından, tahminleri kurtarmak için bu maskeler mevcut hane sayımlarına uygulanır.

spam_cluster = digit_counts[predicted_spams]
ham_cluster = digit_counts[predicted_hams]
unk_cluster = digit_counts[predicted_unknowns]

Burada kullanıcının son kod bloğunda oluşturduğu maskeler digit_counts dizisine uygulanır. Bu, yalnızca her üç grupta kümelenmiş iletilerle birlikte üç yeni dizi oluşturacaktır. Son olarak, her kümeye her bir mesaj türünden kaç tane düştüğü görülebilir.

print("hams:", np.unique(ham_cluster[:, 0], return_counts=True))
print("spams:", np.unique(spam_cluster[:, 0], return_counts=True))
print("unknowns:", np.unique(unk_cluster[:, 0], return_counts=True))

Bu kod, kümelerin her benzersiz değerinin sayısını yazdırır. Burada 0’ın sağlıklı mesaj (ham) ve 1’in spam mesaj (spam) anlamına geldiği unutulmamalıdır. Sonuçlar aşağıda gösterilmiştir.

hams: (array([0, 1]), array([4071,   39]))
spams: (array([0, 1]), array([  1, 232]))
unknowns: (array([0, 1]), array([755, 476]))

Bu çıktıda 4110 mesajın “Kesinlikle ham” grubuna yerleştirildiği, bunların 4071’inin gerçekten sağlıklı olduğu ve sadece 39’unun spam olduğu ve yanlış sınıflandırıldığı görülmektedir. Öte yandan, “kesinlikle spam” grubuna dahil olan 233 iletiden yalnızca birinin gerçekten sağlıklı, geri kalanının spam olması, kümelemenin iyi yapıldığı anlamına gelir.

Tabii ki, bilinmeyen kategorisine 1.200’den fazla mesaj yerleştirildi ve bu da yüksek bir sayı. Bu nedenle, bu mesajları kategorize etmek için daha gelişmiş analizlere ihtiyaç vardır. Kullanıcı , tahminlerin doğruluğunu artırmak için Doğal Dil İşleme (NLP) gibi şeyleri kullanabilir ve bu konuda Keras Python kitaplığını kullanabilir . Aşağıdaki makalede, SciPy’deki optimizasyon modülü kullanılarak Python’da optimizasyon ele alınmaktadır.

Ders dışı optimizasyon eğitim videolarının tanıtımı

Aşağıda, ders dışı optimizasyon eğitim videoları kısaca tanıtılmaktadır.

  • MATLAB’de biyocoğrafya tabanlı optimizasyon eğitim videosu veya BBO (Kurs eğitmeni: Dr. Seyed Mustafa Kalami Haris, kurs süresi: bir saat elli bir dakika): Biyocoğrafya tabanlı optimizasyon eğitim videosunu veya MATLAB’da BBO’yu görüntülemek için + öğesini tıklayın .
  • Optimizasyon problemlerini çözmek için su döngüsü algoritması eğitim videosu (kurs eğitmeni: Dr. Ali Sadaleh, kurs süresi: dört saat dört dakika): Eğitim videosunu görüntülemek için + düğmesini tıklayın.
  • SFLA optimizasyon algoritması veya MATLAB’da SFLA eğitim videosu (kurs eğitmeni: Dr. Seyed Mustafa Kalami Haris, kurs süresi: üç saat otuz beş dakika): Optimizasyonu çözmek için su döngüsü algoritmasının eğitim videosunu izlemek için + düğmesini tıklayın problemler _
  • Eğitim ve öğrenmeye dayalı optimizasyon algoritması eğitim videosu veya TLBO (kurs eğitmeni: Dr. Seyed Mustafa Kalami Harris, kurs süresi: bir saat on beş dakika): Eğitim ve öğrenmeye dayalı optimizasyon algoritması eğitim videosunu izlemek için tıklayınız. öğrenme veya TLBO +
  • Teorik ve uygulamalı konuları içeren PSO algoritması eğitim videosu (kurs eğitmeni: Dr. Seyed Mustafa Kalami Haris, kurs süresi: dokuz saat elli üç dakika): Teorik ve pratik konuları içeren PSO algoritması eğitim videosunu izlemek için + düğmesini tıklayın .
  • İkili ayrık parçacık sürüsü algoritmasının (PSO) uygulanması ve programlanması için eğitim videosu (kurs eğitmeni: Dr. Ismail Atashpaz Gregari, kursun süresi: bir saat kırk dakika): ikili ayrık parçacık sürüsü algoritmasının uygulanması ve programlanması için eğitim videosunu izlemek için parçacık sürüsü algoritması (PSO) + tıklayın.
  • MATLAB’de Kültürel Algoritma eğitim videosu (Kurs eğitmeni: Dr. Seyed Mostafa Kalami Haris, ders süresi: iki saat otuz altı dakika): MATLAB’de Kültürel Algoritma eğitim videosunu izlemek için

SciPy’de optimizasyon modülünü kullanma

Python ile optimizasyon konulu yazının bu bölümünde SciPy’de optimizasyon modülünün kullanım yöntemi incelenmektedir. İşlev için giriş parametrelerini optimize etmeye ihtiyaç duyulduğunda, scipy.optimize, Python optimizasyon makalesinin bu bölümünün geri kalanında bahsedilen, farklı işlev türlerini optimize etmek için bir dizi yararlı yöntem içerir.

  • minimize_scalar() ve minimize() yöntemleri, sırasıyla bir veya daha fazla değişkenli işlevleri en aza indirmek için kullanılır.
  • Curve_fit() yöntemi, işlevi bir veri kümesine sığdırmak için kullanılır .
  • Sırasıyla bir ve çok değişkenli fonksiyonların sıfırlarını bulmak için Curve_fit() ve root() yöntemleri kullanılır.
  • linprog(), eşitsizlik ve eşitlik kısıtlamaları ile doğrusal bir amaç fonksiyonunu en aza indirmek için kullanılır.
"Python'da

Uygulamada, tüm bu işlevler optimizasyon çalışması gerçekleştirir. Python’daki optimizasyon makalesinin bir sonraki bölümünde, minimize_scalar() ve minimize() adlı iki işlev ele alınmaktadır. Python’da optimizasyon konulu yazının bu bölümünde incelenen projenin entegre kodu aşağıda eksiksiz olarak verilmiştir.

"""
Clustering example using an SMS spam dataset with SciPy.
Associated with the Real Python article
Scientific Python: Using SciPy for Optimization
Available at: https://realpython.com/python-scipy-cluster-optimize/
"""
from pathlib import Path
import numpy as np
from scipy.cluster.vq import whiten, kmeans, vq

HERE = Path(__file__).parent

data = HERE.joinpath("SMSSpamCollection").read_text().strip().split("\n")

digit_counts = np.empty((len(data), 2), dtype=int)
for i, line in enumerate(data):
    case, message = line.split("\t")
    num_digits = sum(c.isdigit() for c in message)
    digit_counts[i, 0] = 0 if case == "ham" else 1
    digit_counts[i, 1] = num_digits

unique_counts = np.unique(digit_counts[:, 1], return_counts=True)
unique_counts = np.transpose(np.vstack(unique_counts))

whitened_counts = whiten(unique_counts)
codebook, _ = kmeans(whitened_counts, 3)
codes, _ = vq(whitened_counts, codebook)

ham_code = codes[0]
spam_code = codes[-1]
unknown_code = list(set(range(3)) ^ set((ham_code, spam_code)))[0]

print("definitely ham:", unique_counts[codes == ham_code][-1])
print("definitely spam:", unique_counts[codes == spam_code][-1])
print("unknown:", unique_counts[codes == unknown_code][-1])

digits = digit_counts[:, 1]
predicted_hams = digits == 0
predicted_spams = digits > 20
predicted_unknowns = np.logical_and(digits > 0, digits <= 20)

ham_cluster = digit_counts[predicted_hams]
spam_cluster = digit_counts[predicted_spams]
unknown_cluster = digit_counts[predicted_unknowns]

print("hams:", np.unique(ham_cluster[:, 0], return_counts=True))
print("spams:", np.unique(spam_cluster[:, 0], return_counts=True))
print("unknowns:", np.unique(unknown_cluster[:, 0], return_counts=True))

Daha önce de belirtildiği gibi, Python’da matematiksel optimizasyonla ilgili makalede kullanılan veri seti bu bağlantıdan [ + ] indirilebilir . Python’daki optimizasyon makalesinin bir sonraki bölümünde, SciPy’de tek değişkenli bir işlevi en aza indirme yöntemi ele alınmaktadır.

SciPy’de tek değişkenli bir işlevi en aza indirme

Python’daki optimizasyon makalesinin bu bölümünde, SciPy’de tek değişkenli bir işlevi en aza indirme yöntemi incelenmektedir. Bir sayıyı girdi olarak kabul eden ve bir çıktı sağlayan matematiksel bir işleve skaler işlev denir. Bu işlev genellikle birkaç sayı alan ve sonucu birkaç çıktı numarası olarak döndüren “çok değişkenli işlevler” (Multivariate Functions) ile çelişir . Çok değişkenli fonksiyonların optimizasyonuna bir örnek, Python’da optimizasyon hakkındaki makalenin bir sonraki bölümünde sunulmuştur. Python’daki optimizasyon makalesinin bu bölümünde, SciPy’de tek değişkenli bir işlevi en aza indirme yöntemi ele alınmaktadır. Python’da optimizasyon konusunun bu bölümünde, skaler fonksiyon dördüncü dereceden bir polinom fonksiyondur ve amaç, fonksiyonun minimum değerini bulmaktır. Fonksiyon y = 3x⁴ – 2x + 1’dir. Bahsedilen fonksiyon aşağıdaki resimde 0 ile 1 arasında bir x aralığı için çizilmiştir.

"Python'da

Yukarıdaki görselde bu fonksiyonun minimum değerini x = 0,55 olarak görebilirsiniz . minimize_scalar() minimum noktanın x ve y koordinatlarını belirlemek için kullanılabilir. Öncelikle, minimize_scalar() işlevi scipy.optimize’den (İçe Aktar | İçe Aktar) içe aktarılmalıdır. Ardından, minimize edilecek amaç fonksiyonunu tanımlamamız gerekiyor.

from scipy.optimize import minimize_scalar

def objective_function(x):
    return 3 * x ** 4 - 2 * x + 1

Objective_function() işlevi, x girişini alır ve gerekli matematiksel işlemleri bunun üzerinde uygular; Ardından sonucu döndürür. Kullanıcı, fonksiyon tanımında istediği herhangi bir matematiksel fonksiyonu kullanabilir. Tek sınırlama, işlevin sonunda tek bir sayı döndürmesi gerektiğidir. Daha sonra bu fonksiyonun minimum değerini bulmak için minimize_scalar() kullanılır. minimize_scalar(), hedef işlev adının tanımı olan yalnızca bir gerekli girdiye sahiptir.

res = minimize_scalar(objective_function)

minimize_scalar() çıktısı bir OptimizeResult örneğidir. Bu sınıf, optimize edici uygulamasının ilgili ayrıntılarının çoğunu bir araya getirir. Bu ayrıntılar, optimize edicinin başarılı olup olmadığını içerir. Ayrıca, optimize edici başarılı bir şekilde çalıştığında nihai sonuçların ne olduğunu da derler. Bu işlev için minimize_scalar() çıktısı aşağıda gösterilmiştir.

     eğlence: 0.17451818777634331
    Nfev: 16
     NIT: 12
 Başarı: Doğru
       x: 0,5503212087491959

Bu sonuçların tümü OptimizeResult özellikleridir. başarı, optimizasyonun başarıyla tamamlanıp tamamlanmadığını gösteren bir Boolean değeridir. Optimizasyon başarılı bir şekilde tamamlanırsa, eğlence x optimal noktasındaki amaç fonksiyonunun değeridir. Beklendiği gibi bu fonksiyon için en uygun değerin x = 0,55’e yakın olduğu çıktıdan görülebilir.

Not:

Tüm fonksiyonların minimum değeri yoktur. Örneğin ilgilenenler y = x³ fonksiyonunu bu yönde kontrol edebilirler. minimize_scalar() için, minimum değeri olmayan bir amaç işlevi genellikle bir OverflowError ile sonuçlanır, çünkü optimize edici sonunda bilgisayarın kaldıramayacağı kadar büyük bir sayı dener. Minimum değeri olmayan fonksiyonların aksine, birden fazla minimum değeri olan fonksiyonlar da vardır. Bu durumda minimize_scalar() işlevinin, işlevin tüm global minimumlarını bulması garanti edilmez. Ancak minimize_scalar(), optimizasyon için kullanılan problem çözücüyü kontrol etmek için belirtilebilen bir yöntem anahtar kelime bağımsız değişkenine sahiptir. SciPy Python kitaplığı, skaler küçültme için yerleşik üç yönteme sahiptir.

  1. brent, Brent Algoritmasının bir uygulamasıdır. Bu yöntem varsayılandır.
  2. golden , Golden-Section Search’ün bir uygulamasıdır . Belgeler, Burnett’in yönteminin genellikle daha iyi olduğunu gösteriyor.
  3. sınırlı, Brent’in algoritmasının sınırlı bir uygulamasıdır. Bu yöntem genellikle minimum belirli bir aralıkta olduğunda arama alanını sınırlamak için kullanışlıdır.

Yöntem brent veya golden olduğunda, minimize_scalar() parantez adı verilen başka bir argüman alır. Minimum değer bölgesinin sınırları için bir ilk tahmin sağlayan iki veya üç elemanlı bir dizidir. Ancak bu solventler bulunan minimum değerin bu aralıkta olduğunu garanti etmez.

Öte yandan, yöntem sınırlandığında, minimize_scalar(), sınırlar adı verilen başka bir bağımsız değişken alır. Arama bölgesini minimum için tamamen sınırlayan iki öğeden oluşan bir dizidir. Bu konuyu daha iyi anlamak için y = x⁴ – x² fonksiyonu ile birlikte limitli yöntemi deneyebilirsiniz. Bu fonksiyon aşağıdaki resimde çizilmiştir.

"Python'da

Önceki örnek kodu kullanarak, Objective_function() aşağıdaki gibi yeniden tanımlanabilir.

def objective_function(x):
    return x ** 4 - x ** 2

İlk olarak, varsayılan brent yöntemini denemelisiniz.

res = minimize_scalar(objective_function)

Bu kodda, yöntem için herhangi bir değer iletilmez; Bu nedenle, minimize_scalar() varsayılan olarak brent yöntemini kullanır. Bu kod parçasının çıktısı aşağıdaki gibidir.

     eğlence: -0.24999999999999994
    Nfev: 15
     NIT: 11
 Başarı: Doğru
       x: 0,7071067853059209

Optimizasyonun başarılı olduğu görülmektedir. Yukarıdaki kod, x = 0.707 ve y = -1/4’e yakın optimum değeri bulur. Kullanıcı denklemin minimumunu analitik olarak elde ederse, bu değeri x = 1/√2’de bulur, bu da Python fonksiyonunun bulduğu cevaba çok yakındır. Ancak kullanıcı x = -1/√2’de “Simetrik Minimum”u bulmak istiyorsa ne yapmalıdır? Kullanıcı, brent yöntemine bir parantez bağımsız değişkeni sağlayarak benzer sonuçlar döndürebilir.

res = minimize_scalar(objective_function, bracket=(-1, 0))

Bu kodda parantezin -1 ile 0 arasındaki bölgede aramaya başlaması için (-1, 0) dizisi sağlanır. Amaç fonksiyonu y eksenine göre simetrik olduğundan, kullanıcı minimumun bu bölgede olmasını bekler. Bununla birlikte, köşeli ayraçla bile brent yöntemi, x = +1/√2’deki minimum değeri döndürür. x = -1/√2’nin değerini bulmak için, kullanıcı sınırları olan sınırlı yöntemi kullanabilir.

res = minimize_scalar(objective_function, method='bounded', bounds=(-1, 0))

Bu kodda, yöntem ve sınırlar, minimize_scalar() için bağımsız değişken olarak kullanılır ve sınırlar, -1 ile 0 arasında olacak şekilde ayarlanır. Bu yöntemin çıktısı aşağıdaki gibidir.

   eğlence: -0.24999999999998732
 mesaj: 'Çözüm bulundu.'
    Nfev: 10
  Durum: 0
 Başarı: Doğru
       x: -0,707106701474177

Beklendiği gibi, minimum x = −1/√2’de bulundu. Bu yöntemin ek çıktısı kayda değer. Bu çıktı, res’teki mesaj özniteliğini içerir. Bu alan genellikle bazı minimizasyon problem çözücülerinden daha ayrıntılı çıktı almak için kullanılır. Python’daki optimizasyon makalesinin bu bölümünde ele alınan skaler fonksiyon minimizasyon projesinin tam kodu aşağıda verilmiştir. Python’da optimizasyon konusunun bir sonraki bölümünde, SciPy’de çok değişkenli fonksiyonun minimizasyonu ele alınmıştır.

"""
Scalar function minimization example using SciPy.
Associated with the Real Python article
Scientific Python: Using SciPy for Optimization
Available at: https://realpython.com/python-scipy-cluster-optimize/
"""
from scipy.optimize import minimize_scalar


def objective_function(x):
    return 3 * x ** 4 - 2 * x + 1


res = minimize_scalar(objective_function)
print(res)


def objective_function(x):
    return x ** 4 - x ** 2


res = minimize_scalar(objective_function, method="brent")
print(res)

res = minimize_scalar(objective_function, method="bounded", bounds=[-1, 0])
print(res)

SciPy’de çok değişkenli fonksiyon minimizasyonu

Python’daki optimizasyon makalesinin bu bölümünde, SciPy’deki çok değişkenli fonksiyonun minimizasyon yöntemi incelenmektedir. scipy.optimize ayrıca daha genel bir minimize() içerir. Bu işlev, çok değişkenli girdileri ve çıktıları işleyebilir ve bunları işleme yeteneğine sahip daha gelişmiş optimizasyon algoritmalarına sahiptir. Ek olarak, minimize() problem çözümleri üzerindeki kısıtlamaları kaldırabilir. Kullanıcı üç tür kısıtlama belirleyebilir:

  1. LinearConstraint: Çözümün X değerlerinin kullanıcı girdi dizisi ile iç çarpımı alınarak ve sonuçların alt ve üst sınırlar ile karşılaştırılmasıyla çözüm kısıtlanır.
  2. NonlinearConstraint: Fonksiyonun x değerlerine kullanıcı tarafından sağlanan bir fonksiyon uygulanarak ve dönüş değeri üst ve alt sınır ile karşılaştırılarak çözüm kısıtlanır.
  3. Sınırlar: x’in çözüm değerleri, üst ve alt sınırlar arasında kalacak şekilde sınırlandırılmıştır .

Kullanıcı bu kısıtlamaları kullandığında, mevcut tüm yöntemler kısıtlamaları bu şekilde desteklemediğinden, kullanabileceği belirli optimizasyon yöntemleri seçimini sınırlayabilir. Şimdi, minimize() işlevinin nasıl kullanılacağı bir örnekte sunulmuştur. Kullanıcının, sabit sayıda hissesini satarak toplam geliri maksimize etmekle ilgilenen bir borsacı olduğu varsayılmaktadır. Kullanıcı, belirli bir alıcı grubu belirler ve her alıcı için, alıcının her hisse için ödeyeceği fiyatı ve ellerinde ne kadar nakit olduğunu bilir.

Bu problem kısıtlı bir optimizasyon problemi olarak yorumlanabilir. Amaç fonksiyonu, kullanıcının gelirini maksimize etmek istemesidir. minimize() fonksiyonun minimum değerini bulurken; Bu nedenle, x’in en büyük negatif sayıyı veren değerlerini bulmak için amaç fonksiyonunu -1 ile çarpmak gerekir.

"Python'da

Problemde sınırlama var. Bu sınırlama, alıcılar tarafından satın alınan toplam hisse sayısının borsa aracısının elindeki hisse sayısını geçmemesi gerektiğidir. Ayrıca, her alıcının kullanılabilir paranın bir üst sınırı ve sıfırın alt sınırı olduğundan, çözüm değişkenlerinin her birinde sınırlar vardır. x değerlerinin negatif çözümü, komisyoncunun alıcılara ödeme yaptığı anlamına gelir.

Python’daki optimizasyon makalesinin bu bölümünde sunulan bu sorunu çözmek için aşağıdaki kod kullanılabilir. Öncelikle, kullanıcının ihtiyaç duyduğu modüller içe aktarılmalı ve ardından, piyasadaki alıcı sayısını ve komisyoncunun satmayı planladığı hisse sayısını belirlemek için bir dizi değişken girilmelidir.

import numpy as np
from scipy.optimize import minimize, LinearConstraint

n_buyers = 10
n_shares = 15

Bu kodda, kullanıcının scipy.optimize’den numpy kitaplığının yanı sıra minimize() ve LinearConstraint işlevlerini içe aktarması gerekir. Daha sonra kullanıcıdan toplam 15 hisse satın alan 10 alıcı tarafından piyasa belirlenir. Ardından, her bir alıcının ödeyeceği fiyatları, harcamak için önerebilecekleri maksimum tutarı ve her alıcının sunabileceği maksimum hisse miktarını depolamak için diziler oluşturulmalıdır. Bu örnekte, bu dizileri oluşturmak için np.random içindeki rasgele sayı oluşturma işlevini kullanabiliriz.

np.random.seed(10)
prices = np.random.random(n_buyers)
money_available = np.random.randint(1, 4, n_buyers)

Yukarıdaki kod parçacığında, rasgele sayı üretecinin çekirdeği kullanıcı tarafından sağlanmaktadır. Bu işlev, kod parçacığı her yürütüldüğünde kullanıcının aynı rasgele sayı kümesini almasını sağlar. Burada, kullanıcı çıktısının bu yardım makalesine benzer olmasını sağlayabilirsiniz. Bu çalışmanın amacı, Faradars dergisindeki optimizasyon makalesinin çıktısını, makalede sunulması düşünülen çıktı ile karşılaştırma imkanı sağlamaktır.

  • 7. satırda, alıcıların ödediği fiyat dizisi ödemedir. np.random.random(), [0, 1] aralığında bir rasgele sayılar dizisidir. Dizideki öğelerin sayısı, bu durumda alıcıların sayısı olan bağımsız değişkenin değeri tarafından belirlenir.
  • 8. satırda, [1, 4) aralığında bir tamsayı dizisi oluşturulur; Yine alıcı sayısı ile. Bu dizi, her bir alıcının sahip olduğu toplam nakit miktarını gösterir. Şimdi, kullanıcının her bir alıcının karşılayabileceği maksimum stok miktarını hesaplaması gerekiyor.
n_shares_per_buyer = money_available / prices
print(prices, money_available, n_shares_per_buyer, sep="\n")
  • 9. satırda kullanıcı, her bir alıcının satın alabileceği maksimum hisse sayısını belirlemek için para_kullanılabilirin fiyatlara oranını hesaplar. Son olarak, bu dizilerin her biri yeni bir satırla ayrılarak yazdırılır. Çıktı aşağıda gösterilmiştir.
[0,77132064 0,02075195 0,63364823 0,74880388 0,49850701 0,22479665
 0,19806286 0,76053071 0,16911084 0,08833981]
[1 1 1 3 1 3 3 2 1 1]
[ 1,29647768 48,18824404 1,57816269 4,00638948 2,00598984 13,34539487
 15.14670609 2.62974258 5.91328161 11.3199242]

İlk satır, 0 ile 1 arasındaki ondalık sayılar olan fiyat dizisidir. Bu satırı, 1’den 4’e kadar tamsayılarda mevcut olan maksimum nakit miktarı takip eder. Son olarak, her bir alıcının satın alma kabiliyetine sahip olduğu hisse sayısı gözlemlenir.

Şimdi, kullanıcının çözücü için kısıtlamalar ve sınırlar oluşturması gerekiyor. Bu limit, satın alınan toplam hisse sayısıdır ve mevcut toplam hisse sayısını (borsacının sattığı) aşamaz. Bu, bir şarttan çok bir sınırlamadır; Çünkü birden fazla mevcut çözümü içermektedir.

Matematiksel olarak ifade edilenleri sunmak için x[0] + x[1] + … + x[n] = n_hisseler diyebiliriz, burada n toplam alıcı sayısıdır. Kısaca kullanıcı vektörün iç çarpımını çözüm değerleri ile alıp n_shares’e eşit olacak şekilde kısıtlayabilir. LinearConstraint’in girdi dizisinin iç çarpımını çözüm değerleriyle aldığını ve bunları üst ve alt sınırlar ile karşılaştırdığını unutmayın. Aşağıdaki kod parçacığı, n_shares üzerindeki sınırı ayarlamak için kullanılabilir.

constraint = LinearConstraint(np.ones(n_buyers), lb=n_shares, ub=n_shares)

Yukarıdaki kod parçacığında, n_buyers uzunluğunda bir dizi oluşturulur ve ardından bu dizi, ilk argüman olarak LinearConstraint’e iletilir. LinearConstraint, bu belirtilen bağımsız değişken ile çözüm vektörünün iç çarpımını aldığından, satın alınan toplam hisse sayısını döndürür. Bu sonuç, diğer iki argüman arasına sığacak şekilde sınırlandırılmıştır. Bu argümanlar aşağıda belirtilmiştir.

  1. lb’nin alt sınırı
  2. ub’nin üst sınırı

lb = ub = n_shares olduğundan, bu bir eşitlik kısıtlamasıdır, çünkü değerlerin toplamı hem lb hem de ub’ye eşit olmalıdır. lb, ub’den farklıysa, bu bir eşitsizlik kısıtlaması olacaktır. Ardından, çözüm değişkeni için kısıtlamalar yapılır. Kısıtlamalar, satın alınan hisse sayısını düşük tarafta 0 ve yüksek tarafta n_shares_per_buyer ile sınırlar. Minimize()’nin kısıtlamalar için beklediği format, alt ve üst kısıtlamalardan bir demet dizisidir.

bounds = [(0, n) for n in n_shares_per_buyer]

Bu kodda, anlama, her alıcı için bir demet listesi oluşturmak için kullanılır. Optimizasyonu çalıştırmadan önceki son adım, amaç fonksiyonunu tanımlamaktır. Brokerin gelirini maksimize etmeye çalıştığı unutulmamalıdır. Eşdeğer olarak, komisyoncu negatif gelirini mümkün olduğu kadar maksimize etmek istiyor.

Her bir satıştan elde edilen gelir, alıcı tarafından ödenen fiyat ile satın alınan hisse sayısı çarpılır. Matematiksel olarak bu durum fiyatlar[0]*x[0] ​​​​+ fiyatlar[1]*x[1] + … + fiyatlar[n]*x[n] şeklinde yazılabilir, burada N toplam sayıdır Alıcılar. Bir kez daha, bu iç çarpım veya x.nokta(fiyatlar) ile daha kısa ve öz bir şekilde temsil edilebilir. Bu, amaç fonksiyonunun mevcut çözümün x değerlerini ve bir dizi fiyatı argüman olarak alması gerektiği anlamına gelir.

def objective_function(x, prices):
    return -x.dot(prices)

Bu kodda kullanıcı, Objective_function() işlevini iki bağımsız değişken alacak şekilde tanımlar. Ardından, x’in fiyatlar ile iç çarpımını alır ve bu değerin negatif değerini verir. Negatif bir değerin döndürülmesi gerektiğini unutmayın. Çünkü amaç, değeri olabildiğince küçük veya negatif sonsuza yakın yapmaktır. Son olarak, minimize() işlevi çağrılabilir.

res = minimize(
    objective_function,
    x0=10 * np.random.random(n_buyers),
    args=(prices,),
    constraints=constraint,
    bounds=bounds,
)

Bu kod parçacığında res, OptimizeResult’un bir örneğidir; Tıpkı minimize_scalar() gibi. Gördüğünüz gibi, sorun tamamen farklı olsa da benzer pek çok alan var. minimize() çağrısında, beş bağımsız değişken iletilir.

  • objektif_işlev: İlk konumsal argüman, kullanıcının optimize ettiği işlev olmalıdır.
  • x0: İkinci argüman, çözüm değerleri için bir ilk tahmindir. Bu örnekte, n_buyer uzunluğunda 0 ile 10 arasında rastgele bir değer dizisi sağlanır. Bazı algoritmalar veya problemler için uygun bir başlangıç ​​tahmini seçmek çok önemli bir görevdir. Ancak, bu örnekte, bu ilk tahmin çok önemli görünmüyor.
  • args: Bir sonraki bağımsız değişken, hedef işleve iletilmesi kritik olan diğer bağımsız değişkenlerin bir demetidir. minimize() her zaman x çözümünün geçerli değerini amaç fonksiyonuna iletir; Dolayısıyla bu argüman, gerekli herhangi bir girdiyi tutacak bir pozisyon gibi davranır. Bu örnekte, kullanıcının oraya ulaşmak için fiyatları Objective_function() işlevine iletmesi gerekir.
  • kısıtlamalar: Bir sonraki argüman, problem üzerindeki bir dizi kısıtlamadır. Kullanıcı, bir dizi kullanılabilir hisse senedi için önceden oluşturulmuş limitleri geçer.
  • sınırlar: Son bağımsız değişken, kullanıcının daha önce oluşturduğu çözüm değişkenlerindeki sınırların sırasıdır.

Problem çözücü çalıştırıldığında, res kullanılarak kontrol edilmelidir.

     eğlence: -8.783020157087478
     jac: dizi([-0.7713207 , -0.02075195, -0.63364828, -0.74880385,
       -0,49850702, -0,22479665, -0,1980629, -0,76053071, -0,16911089,
       -0,08833981])
 mesaj: 'Optimizasyon başarıyla sonlandırıldı.'
    nfev: 204
     NIT: 17
    yeni: 17
  Durum: 0
 Başarı: Doğru
       x: dizi([1.29647768e+00, 2.78286565e-13, 1.57816269e+00,
       4.00638948e+00, 2.00598984e+00, 3.48323773e+00, 3.19744231e-14,
       2,62974258e+00, 2,38121197e-14, 8,84962214e-14])

Bu çıktıda, optimizasyonun son durumunu gösteren mesajı ve durumu görebilirsiniz. Bu iyileştirici için sıfır (0) durumu, mesajda görülebileceği üzere optimizasyonun başarıyla tamamlandığı anlamına gelir. Optimizasyonun başarılı olduğu düşünüldüğünde fun, optimal çözüm değerlerinde amaç fonksiyonunun değerini gösterir. Aslında komisyoncu bu satıştan 8,78 dolar kazanıyor.

Fonksiyonu optimize eden x değerleri res’te görülebilir. Bu durumda, komisyoncu hisselerinin yaklaşık 1,3’ünü ilk alıcıya vermeli, ikinci alıcıya hiçbir şey vermemeli, üçüncü alıcıya 1,6’sını, dördüncü alıcıya 4,0’ını vb. vermelidir. Kullanıcı, belirlediği limit ve kısıtlamaların karşılandığını kontrol etmeli ve temin etmelidir. Bu, aşağıdaki kod kullanılarak yapılabilir.

print("The total number of shares is:", sum(res.x))
print("Leftover money for each buyer:" money_available - res.x * prices)

Bu kodda kullanıcı, her bir alıcı tarafından satın alınan toplam hisse sayısını yazdırır, bu da n_shares’e eşittir. Kullanıcı daha sonra her bir müşterinin kullanabileceği nakit ile harcadıkları miktar arasındaki farkı yazdırır. Bu değerlerin her biri pozitif olmalıdır. Bu öğelerin çıktıları aşağıda gösterilmiştir.

Toplam hisse sayısı: 15.000000000000002
Her alıcı için kalan para: [3.08642001e-14 1.00000000e+00
 3,09752224e-14 6,48370246e-14 3,28626015e-14 2,21697984e+00
 3.00000000e+00 6.46149800e-14 1.00000000e+00 1.00000000e+00]

Görüldüğü gibi problem üzerindeki tüm kısıtlar ve kısıtlar karşılanmıştır. Şimdi sorunu değiştirmek için bir girişimde bulunulmalıdır, aksi takdirde çözücü çözümü bulamayacaktır. 1000 hissenin benzer alıcılara dağıtılabilmesi için n_shares 1000 olarak değiştirilmelidir. Minimize () işlevi çalıştırıldığında, sonuçlar aşağıdaki gibi görülebilir.

     eğlence: nan
     jac: dizi([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])
 mesaj: 'Yineleme sınırı aşıldı'
    nfev: 2182
     NIT: 101
    sayı: 100
  Durum: 9
 Başarı: Yanlış
       x: dizi([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])

Durum özniteliğinin artık 9 değerine sahip olduğunu ve mesajın tekrar sınırının aşıldığını gösterdiğini belirtmekte fayda var. Her alıcının verdiği para miktarı ve piyasadaki alıcı sayısı ile 1000 hisseyi satmanın bir yolu yoktur. Ancak, bir hata atmak yerine, minimize() yine de bir OptimizeResult örneği döndürür. Kullanıcı, daha fazla hesaplamaya geçmeden önce kodun durumunu kontrol ettiğinden emin olmalıdır. Python’daki optimizasyon makalesinin bu bölümünde sunulan örnek projenin entegre kodu aşağıda tam olarak verilmiştir.

"""
Constrained minimization example code using SciPy.
Associated with the Real Python article
Scientific Python: Using SciPy for Optimization
Available at: https://realpython.com/python-scipy-cluster-optimize/
"""
import numpy as np
from scipy.optimize import minimize, LinearConstraint

n_buyers = 10
n_shares = 15
np.random.seed(10)
prices = np.random.random(n_buyers)
money_available = np.random.randint(1, 4, n_buyers)
n_shares_per_buyer = money_available / prices
print(prices, money_available, n_shares_per_buyer, sep="\n")
constraint = LinearConstraint(np.ones(n_buyers), lb=n_shares, ub=n_shares)
bounds = [(0, n) for n in n_shares_per_buyer]


def objective_function(x, prices):
    return -x.dot(prices)


res = minimize(
    objective_function,
    10 * np.random.random(n_buyers),
    args=(prices,),
    constraints=constraint,
    bounds=bounds,
)
print(res)

print("The total number of shares is:", sum(res.x))
print("Leftover money for each buyer:", money_available - res.x * prices)

Python eğitim videolarına giriş ve Python eğitimi ile optimizasyon

Python’u öğrenmek ve Python’da optimizasyon yapmak için aşağıda tanıtılan Farsça eğitim videolarının kullanılması önerilir.

Python’a giriş eğitim videosu

 

Tanıtım Python eğitim videosunun süresi ondokuz saat elli üç dakika olup, hocası mühendis Pejman Iqbali’dir. Python’da optimizasyon konulu makalenin bu bölümünde tanıtılan giriş niteliğindeki Python eğitim videosu , Python programlama dünyasına yeni başlayanlar  ve Python’a biraz aşina olan ve bilgi ve becerilerini daha da geliştirmek isteyenler için uygundur . Python’a giriş eğitim videosunda Python’u tanıtırken ve nasıl  kuracağınızı öğretirken, Python’da veri yapısı ,  fonksiyonlar  ve  modüller ,  class , dosya okuma ve yazma ve diğer konular  incelenmektedir.

 

Python’da NumPy ve Matplotlib kitaplıklarıyla çalışmak için eğitim videosu

 

Python’da NumPy ve Matplotlib kütüphaneleri ile çalışmaya yönelik eğitim videosunun süresi dört saat kırk altı dakika olup, eğitmen deneyimli mühendis Mitra’dır. şu optimizasyon konulu makalenin bu bölümünde tanıtılan bu derste, Python programlama eğitiminin daha ileri ve aslında tamamlayıcı konuları incelenmiştir. Bu nedenle, bu kurs Python tanıtım videosunu izlemiş veya Python’un temellerine tamamen aşina olan kişiler için uygundur. Ek Python eğitim videosunda ele alınan konular arasında Python’da dizilere giriş ve tanımlama,  NumPy paketinin tanıtımı ,  Python’da grafik çizme ve diğer şeylerden  bahsedebiliriz .

Pratik örneklerle Python eğitim videosu

 

Pratik örneklerle Python eğitim videosunun süresi on üç saat yirmi dakikadır. Uygulamalı örneklerle ders dışı Python eğitim kursunun eğitmeni Farshid Shirafken’dir. Python optimizasyonu makalesinin bu bölümünde tanıtılan bu Python eğitim videosu, Python programlamayı kullanarak örnekleri inceleme ve örnek problemleri çözmenin yanı sıra Python’u temelden ve pratik bir şekilde öğrenmek isteyenler için uygundur.  Bu dersin konuları arasında Python’da veri türlerinin tanıtılması ,  işleçler ,  koşullu komutlar ,  döngüler ,  dizeler ,  listeler , demetler,  sözlükler ,  işlevler ,  düzenli ifadeler  ve  sıralama algoritmalarından bahsedebiliriz  .

  • Pratik örneklerle öğretici Python eğitim videosunu izlemek için  buraya tıklayın .

Nesne yönelimli programlama ile Python eğitim videosu

 

Nesne yönelimli programlama ile Python eğitim videosunun süresi yedi saat yirmi dokuz dakika olup, eğitmeni mühendis Farshid Shirafken’dir. Python optimizasyonu makalesinin bu bölümünde tanıtılan bu kurs, Python programlama diline aşina olan ve bu dilde nesne yönelimi öğrenmek isteyen kişiler için uygundur. Bu eğitim kursunda, nesne ,  sınıf ,  nesne yönelimi ,  kalıtım , polimorfizm ve  operatör aşırı yüklemesi dahil olmak üzere nesne yönelimi ile ilgili çeşitli konular  incelenmiştir.

Python eğitim videosu ve makine öğrenimi

 

Python eğitimi ve makine öğrenimi videosunun süresi on saattir ve eğitmen mühendis Saeed Mazloumi Rad. Python’da optimizasyon konulu makalenin bu bölümünde tanıtılan bu eğitim kursu, Python programlama dili hakkında temel bilgiye sahip olan ve Python dilini kullanarak makine öğrenimini öğrenmek ve ilgili uygulamaları uygulamak isteyen kişiler için uygundur. Python ile makine öğrenimini öğrenme konulu videoda ele alınan konular arasında makine öğrenimine giriş, Nampi paketini tanıma, Pandas paketini tanıtma ve onunla nasıl çalışılacağını öğrenme, matplotlib kullanarak verileri nasıl çizeceğimizi öğrenmeyi içerebiliriz. kütüphane, istatistik konularını tanıma ve uygulamaları Makine öğreniminde veri ön işleme, denetimli öğrenme, denetimsiz öğrenme ve boyut indirgeme yöntemlerinden bahsedildi.

  • Python eğitim ve makine öğrenimi videosunu izlemek için  tıklayınız .

Makine öğrenimine giriş için Python eğitim videosu

 

Bu eğitim kursunun süresi 16 saat 50 dakika olup eğitmeni mühendis Farshid Shirafken’dir. Python’da optimizasyon konusunun bu bölümünde tanıtılan bu derste, makine öğreniminin giriş ve ikincil konuları temelden başlayarak kapsamlı ve basit bir dille incelenir ve tüm uygulamalarda Python programlama dili ve kütüphaneleri anlatılır. kullanılmış. Bu eğitim kursunda tartışılan konular arasında makine öğrenimine giriş, veri ve türleri, veri ön işleme, regresyon, lojistik regresyon, yapay sinir ağları, destek vektör makinesi ve karar ağacı sayılabilir.

  • Makine öğrenimine giriş için Python eğitim videosunu görmek için  buraya tıklayın .

Tamamlayıcı makine öğrenimi için Python eğitim videosu

 

Bu eğitim kursunun süresi 10 saat 33 dakika olup eğitmeni Farshid Shirafken’dir. Bu eğitim, Python ile makine öğrenimine giriş ve ara konulara aşina olan kişiler için uygundur. Tamamlayıcı makine öğrenimi için Python eğitim videosunda, Bayes sınıflandırması, K-en yakın komşu sınıflandırması, toplu öğrenme, özellik seçimi, boyut indirgeme, kümeleme, aykırı veri keşfi ve ilişkisel kural keşfi dahil olmak üzere makine öğreniminin tüm tamamlayıcı konuları incelenmiştir.

  • Ek makine öğrenimi için Python eğitim videosunu görmek için  buraya tıklayın .

Optimizasyon problemlerini uygulamaya yönelik Python eğitim videosu

 

Bu eğitim kursunun süresi dört saat üç dakika olup, eğitmeni Mühendis Pejman Iqbali Shamsabadi’dir. şu kursu, temel Python programlama dili bilgisine sahip olan ve matematiksel optimizasyonu ve Python kullanarak uygulanmasını öğrenmek isteyen kişiler için uygundur. Bu eğitim kursunun konuları arasında sırt çantası optimizasyon probleminin çözümü, grafik optimizasyon problemleri ve dinamik programlama sayılabilir.

Çözüm

Makalede Python ekosistemi “SciPy” (SciPy) içerisindeki optimizasyon ve Python SciPy kütüphanesi ile farkı incelenmiştir. Ayrıca SciPy Bayan’daki bazı modüller ve SciPy’nin Anaconda python dağıtımı (conda paket yöneticisi) ve pip kullanılarak kurulum yöntemi Python’da optimizasyonla ilgili aşağıdaki makalede öğretildi. Daha sonra Saipai’de kümeleme ve optimizasyon fonksiyonlarının kullanıldığı örnekler anlatılmıştır.

Python ile optimizasyon yazısında sunulan kümeleme örneğinde spam mesajları sağlıklı mesajlardan ayırmak için bir algoritma geliştirildi. Kmeans() kullanılarak, içinde 20’den fazla rakam bulunan iletilerin spam olma ihtimalinin çok yüksek olduğu keşfedildi. Optimizasyon örneğinde, önce tek değişkenli şeffaf bir matematiksel fonksiyonda minimum değer kontrol edildi.

Ardından Python ile optimizasyon makalesinin devamında hisse senedi portföyünün kârını maksimize etmenin daha karmaşık bir örneği incelenmiştir. Minimize() kullanılarak, bir alıcı grubuna satılacak en uygun hisse sayısı açıklandı. Saipy, birçok modülü olan çok büyük bir kütüphanedir. Python’da optimizasyon konusunda edinilen bilgilerle, kullanıcılar Python ile optimizasyon alanını keşfetmeye başlayabilirler. Matematiksel optimizasyon ve bunun için kullanılabilen çeşitli algoritmalar hakkında daha fazla bilgi edinmek için ” Makine Öğreniminde Optimizasyon Yöntemleri – Pratik Kılavuz ” bölümünü okumanız şiddetle tavsiye edilir.