Doğru noktayı seçmek için hangi algoritma uygulanacak


9

Aşağıdaki resim başlangıç ​​noktasında 7 noktayı göstermektedir. Bunlardan biri kurallar ve deneyime dayanarak bir insan tarafından seçildi ve kırmızı renkte (sol alt çeyrekte bulunan).

resim açıklamasını buraya girin

Şimdi bu nokta kümelerinden 1000'den fazla var ve her set için bir insan tek bir nokta seçti. Bu koşullar tüm setler için geçerlidir:

  • Her setin yaklaşık 3 - 10 puanı vardır
  • Aykırı değer yok
  • Puanların pozitif ve negatif değerleri olabilir
  • Bir nokta seçerken hata yapılmadı

Benim sorum: Bu setlerden ve insan yapımı seçimlerden öğrenmek için bir makine öğrenme algoritması var mı, böylece yeni bir nokta seti verildiğinde hangi noktayı seçeceğine otomatik olarak karar verebilir mi? Bu yeni set elbette yukarıdan ilk 3 koşulu karşılar.

2 son açıklama:

  • Verdiğim örnek, seçilen biriyle birlikte orijin etrafındaki bir düzlemdeki noktalar hakkındaki fikri desteklemek için sadece rastgele oluşturulmuş bir örnektir. Gerçek hayatta daha fazla yapı olabilir ama şimdilik merak ediyorum ve bu dava için neyin mümkün olduğunu bilmek istiyorum.
  • Varyasyonlar mümkün olabilir mi? Diyelim ki yaklaşık 2 seçilmiş nokta veya nokta yerine belirli bir yarıçapa sahip daireler var.

2
Sadece yüksek sesle düşünmek, Çekirdek numarası belki yardımcı olabilir mi? Seçilen nokta diğer noktalara (örneğin daha yüksek boyut) ayrılabilirken diğer noktalara çok yakın oturuyor gibi görünüyor, o zaman orada sınıflandırma yapıyorsunuz! Düşünmeye değer olduğunu söyleyebilirim.
TwinPenguins

1
@MajidMortazavi Kulağa hoş geliyor. Dürüst olmak gerekirse, makine öğrenimi benim için yeni bir alandır. Bildiğim tek şey çok şey var ama nasıl ve ne hakkında clueless. Çekirdek öneriniz hakkında okumaya çalışacağız.
Elmex80s

2
Her bir noktaya diğer noktalardan uzaklık, diğer noktaların sayısı vb. Gibi özellikler eklerseniz, hangi eğitim noktalarının en çok benzediğini belirlemek için muhtemelen K-En Yakın Komşular gibi basit bir şey kullanabilirsiniz. yeni puan (lar) ınızı ve bu sınıflandırmayı kullanın. Karar ağaçları veya Sinir Ağları bu tür doğrusal olmayan sınırlar için daha uygun olabilir.
Dan Carter

1
@ DanCarter'ın yorumundan kaçmak için hangi ML algoritmasının kullanılacağını sormak yanlış soru. Tasarlayabileceğiniz özellikleri düşünün ve hangi yöntemlerin kullanılacağını belirlemesine izin verin (burada çoğul önemlidir; sorun çok iyi anlaşılmadıkça asla tek bir yöntem denememelisiniz). Denenmesi gereken diğer bazı özellikler: merkezden uzaklık (hem mutlak hem de ortalama nokta-merkez mesafesine göre), başlangıç ​​noktasından uzaklık, başlangıç ​​noktasından vektörün bir eksenle yaptığı açı.
Paul

1
İki veya daha fazla nokta keyfi olarak birbirine yakın olabilir mi?
İmran

Yanıtlar:


6

Bu büyüleyici bir problem! İki şey onu özellikle zorlaştırıyor:

  • İki nokta kümesini nasıl karşılaştırmalıyız? Makine Öğrenimi'ndeki klasik problemlerin sabit sayıda niteliği vardır ve bu nitelikler birbirinin yerine kullanılamaz: Örneğin, nitelikleri ageve height(santimetre cinsinden) farklı kişiler hakkında verilerim olabilir . Her numunenin her biri için bir girişi vardır ve elbette (age, height) = (22, 180)aynı değildir (age, height) = (180, 22). Sorununuzda da doğru değil. Bir nokta kümesinin 3 ila 10 nokta vardır ve noktalara girme sırası iki nokta kümesini karşılaştırırken bir fark yaratmamalıdır.
  • Nasıl tahmin yapabiliriz? Diyelim ki, eğitim setimizden, yukarıda belirlediğiniz noktaya benzer nokta setleri seçmenin bir yolunu bulduk. Tahminimizin resminizdeki 7 noktadan biri olması gerektiği sorunuyla karşı karşıyayız; ancak bu noktaların hiçbiri benzer nokta kümelerinde bulunmayabilir.

Her iki zorluğu da ele alan bir algoritma çizeyim. Tahmin doğruluğu çok iyi değil; ama belki de bunun nasıl iyileştirilebileceğini görüyorsunuz. Ve en azından tahmin şey doğru?

1. örnekleri simüle

Algoritmayı test edebilmek için örnekler ve etiketler üreten fonksiyonlar yazdım.

Örnek oluşturma: Her örnek 3 ila 10 puan içerir. Nokta sayısı rastgele, düzgün bir dağılımdan alınmıştır. Her nokta biçimdedir (x_coordinate, y_coordinate). Koordinatlar tekrar rastgele, normal bir dağılımdan çizilir.

import numpy as np
from random import randint

def create_samples(number_samples, min_points, max_points):

    def create_single_sample(min_points, max_points):
        n = randint(min_points, max_points)
        return np.array([np.random.normal(size=2) for _ in range(n)]) 

    return np.array([create_single_sample(min_points, max_points) for _ in range(number_samples)])

Etiket oluşturma: Oyuncak örneği olarak, bir nokta seçme kuralının aşağıdaki gibi olduğunu varsayalım: Her zaman en yakın noktayı seçin, (0, 0)'en yakın' Öklid normuna göre anlaşılmalıdır.

def decision_function_minnorm(sample):
    norms = np.apply_along_axis(np.linalg.norm, axis=1, arr=sample)
    return sample[norms.argmin()]

def create_labels(samples, decision_function):
    return np.array([decision_function(sample) for sample in samples])

Şimdi tren ve test setlerimizi oluşturabiliriz:

n_train, n_test = 1000, 100
dec_fun = decision_function_minnorm

X_train = create_samples(number_samples=n_train, min_points=3, max_points=10)
X_test = create_samples(number_samples=n_test, min_points=3, max_points=10)
y_train = create_labels(X_train, dec_fun)
y_test = create_labels(X_test, dec_fun)

2. Hausdorff mesafesi ile nokta kümelerinin karşılaştırılması

İlk sorunu ele alalım: Farklı nokta kümelerini nasıl karşılaştırmalıyız? Nokta kümelerindeki nokta sayısı farklıdır. Ayrıca, noktaları yazdığımız sıranın önemli olmadığını unutmayın: Belirlenen noktaya kıyasla, belirlenen noktaya kıyasla [(0,0), (1,1), (2,2)]aynı sonucu vermelidir [(2,2), (0,0), (1,1)]. Benim yaklaşımım nokta kümelerini Hausdorff mesafeleriyle karşılaştırmak :

def hausdorff(A, B):

    def dist_point_to_set(x, A):
        return min(np.linalg.norm(x - a) for a in A)

    def dist_set_to_set(A, B):
        return max(dist_point_set(a, B) for a in A)

    return max(dist_set_to_set(A, B), dist_set_to_set(B, A))

3. En yakın k komşuları ile tahmin ve ortalama

Artık nokta kümeleri arasında mesafe kavramımız var. Bu, en yakın komşu sınıflandırmasını kullanmayı mümkün kılar: Bir test noktası seti verildiğinde, keğitim örneğimizde, test noktası setine göre en küçük Hausdorff mesafesine sahip nokta setlerini bulur ve etiketlerini alırız. Şimdi ikinci sorun geliyor: Bu ketiketleri, test noktası seti için bir öngörüye nasıl dönüştürürüz? En basit yaklaşımı kullandım: etiketlerin ortalamasını alın ve test noktası kümesinde ortalamanın en yakın noktasını tahmin edin.

def predict(x, num_neighbors):
    # Find num_neighbors closest points in X_train.
    distances_to_train = np.array([hausdorff(x, x_train) for x_train in X_train])
    neighbors_idx = np.argpartition(distances_to_train, -num_neighbors)[-num_neighbors:]

    # Get labels of the neighbors and calculate the average.
    targets_neighbors = y_train[neighbors_idx]
    targets_mean = sum(targets_neighbors) / num_neighbors

    # Find point in x that is closest to targets_mean and use it as prediction.
    distances_to_mean = np.array([np.linalg.norm(p - targets_mean) for p in x])
    closest_point = x[distances_to_mean.argmin()]

    return closest_point

4. Test

Algoritmamızın performansını test etmek için her şey hazır.

num_neighbors = 70
successes = 0
for i, x in enumerate(X_test):
    print('%d/%d' % (i+1, n_test))
    prediction = predict(x, num_neighbors)
    successes += np.array_equal(prediction, y_test[i])

Verilen karar fonksiyonu için ve num_neighbors = 70% 84 tahmin doğruluğu elde ediyoruz. Bu çok iyi değil ve elbette tahmin edilmesi oldukça kolay görünen karar fonksiyonumuza özgü.

Bunu görmek için farklı bir karar fonksiyonu tanımlayın:

decision_function_maxaverage(sample):
    avgs = (sample[:, 0] + sample[:, 1]) / 2
    return sample[norms.argmin()]

Bu işlevi kullanarak dec_fun = decision_function_maxaveragetahmin doğruluğunu% 45'e düşürür. Bu, etiketlerinizi oluşturan karar kurallarını düşünmenin ne kadar önemli olduğunu gösterir. İnsanların neden belirli noktaları seçtiği hakkında bir fikriniz varsa , bu en iyi algoritmayı bulmanıza yardımcı olacaktır.

Bu algoritmayı geliştirmenin bazı yolları: (1) Hausdorff mesafesi yerine farklı bir mesafe fonksiyonu kullanın, (2) k-en yakın komşularından daha karmaşık bir şey kullanın, (3) seçilen eğitim etiketlerinin nasıl bir tahmine dönüştürüldüğünü geliştirin.


3

Bu sorunu çözmek için sinir ağlarını kullanmanın birkaç yolu:

Basit bir İleri Beslemeli Sinir Ağı ile:

  • Verilerinizi (-1, -1) ile (1,1) arasındaki karenin ortasına sığacak şekilde ölçeklendirin
  • Her noktayı x ve y koordinatlarına karşılık gelen iki girişle veya kbu nokta mevcut değil
  • Her nokta için o noktanın mevcut olup olmadığını gösteren üçüncü bir gösterge girişi ekleyin
  • Gizli katmanların sayısını ve boyutunu seçin
  • Çıktıda 10 beden softmax katman kullanın

Yani her bir giriş örneği, son 3 * (10-10)k) değerler sıfır olduğunda sıfırdır k sette mevcut olan ve çıktı, en büyük değerin öngörülen noktaya (pozisyonu girişteki o pozisyona karşılık gelen) karşılık gelip gelmediği, 1'i toplayan 10 uzunluklu bir vektördür.

Evrimsel Bir Sinir Ağı ile:

  • Uçağınızı ızgaraya bölün n x n ve girdinizi bir n x n matris k Eğer varsa k kare içindeki noktalar (ben,j) ve 0aksi takdirde. Umarım puanlar üst üste gelmez, bu yüzden bir matrisiniz var1s ve 0s.
  • Girdi matrisleriniz üzerinde bir CNN eğitin. Çıktı şekliniz softmax boyutunda olmalıdırn*n, düzleştirilmiş giriş şekline karşılık gelir. İlgili çıkış koordinatlarında en yüksek değere sahip noktayı seçin.

CNN, verileriniz doğal olarak uzamsal olduğundan daha iyi performans gösterebilir. Ancak, iki veya daha fazla nokta çakışırsa ne yapacağınıza karar vermelisiniz. En basit çözüm, rastgele bir seçim yapmaktır, bu da belirli görevinize bağlı olarak iyi olabilir.

Tekrarlayan Sinir Ağı ile:

  • Ölçekli (x, y) noktaların değişken uzunluktaki dizilerini besleyin ve 10 boyut softmax tahmini çıktı

Evet, RNN'lerde olduğu kadar kolay! Değişken uzunluk girişlerini iyi idare ederler, ancak yine de mekansal verileri işlemede CNN'lerin avantajlarından yoksundurlar.

Uyarılar:

Bir FNN veya RNN kullanıyorsanız, giriş verilerinizi nasıl sipariş ettiğiniz de vardır. Gerçek verilerinizde doğal bir düzen yoksa, ağımızın farklı siparişlerde kodlanan aynı veriler için farklı tahminler yapmasını istemeyiz. Bunu ele almanın bir yolu, veri artırımıdır : her eğitim örneğini farklı giriş sıralarıyla birkaç kez çoğaltın, böylece ağınız uygun simetrileri öğrenebilir.

Sadece bir yaklaşımı denemek için vaktiniz varsa, CNN'yi seçerdim. CNN'ler, uzamsal verilerle iyi çalışacak şekilde tasarlanmıştır ve girdi sıralamasında bir sorun yoktur.


1
Buradaki sorun, tahminin düzene bağlı olmasıdır. Algoritmanın bir nokta kümesinin (0,0), (1,1), (2,2)beslenmesi, bir nokta kümesinin beslenmesinden farklı bir etkiye sahip olacaktır (1,1), (2,2), (0,0).
Elias Strehle

İyi bir nokta Elias - Bunu hafifletmek için bir öneride bulunacağım.
İmran

@EliasStrehle bundan bahsetmekte fayda var, düzen bu problemle alakasız. Bir takım noktalarımız var (hepsi benzersiz, sıra yok).
Elmex80s
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.