Sıralı verilerden oluşan bir koleksiyon nasıl 'akıllıca' depolanır?


11

Akıllı bir şekilde sıralanmış bir koleksiyon bin çalışıyorum. adet veri koleksiyonum var . Ama içine bu veri uyan biliyoruz eşit olmayan bidonları büyüklüğünde. Verilere tam olarak uyacak şekilde uç noktaları akıllıca nasıl seçeceğimi bilmiyorum. Örneğin:mnm

Koleksiyonumda 12 ürün olduğunu ve verilerin 3 kutuya sığacağını biliyorum:

Index:  1 2 3 4 5 6 7 8 9 10 11 12
Value:  1 1 1 3 3 3 3 3 3 5  5  6

kutuları için kesme noktalarını nasıl akıllıca seçebilirim ?i={13},{49},{1012}

Mevcut uygulama, verileri eşit boyutlu kutulara ayırır ve daha sonra kutuların sonu için endeksleri bulmak için uç noktaların ortalamasını alır. Yani şu şekilde çalışır:

Index:  1 2 3 4 5 6 7 8 9 10 11 12
Value:  1 1 1 3 3 3 3 3 3 5  5  6

first break evenly: i = 1-4, 5-8, 9-12
mean endpoints:  between 4 and 5: (3+3)/2 = 3
                 between 8 and 9: (3+3)/2 = 3

Yani şimdi kutu 1'de 3'ün altında olan herhangi bir şey, kutu 2'de 3'ün üzerinde ancak 3'ün altında olan herhangi bir şey ve kutu 3'te 3'ün üzerinde olan herhangi bir şey. Sorunumun ne olduğunu görebilirsiniz. Verilerin eşit olmayan bölmeleri varsa yöntemim başarısız olur.

Bir arkadaşım k-en yakın komşu algoritmasından bahsetti ama emin değilim.


1
"Akıllıca" ne anlama geldiğini açıklar mısınız? Binning ile ne yapmaya çalışıyorsunuz? Neden ilk etapta biniyorsun?
whuber

İkinci-son paragrafınız için , ve musunuz? Aksi takdirde, benim için bir anlam ifade etmiyor.3 & < 4 b i n 2 4 b i n 3<3bin13&<4bin24bin3
gung - Monica'yı eski durumuna getirin

Kutuların eşit aralıklarla olduğunu varsayarak akıllıca yaptığım gibi akıllıca demek istiyorum. bir veri parçası, o veri parçası hakkında bana çok önemli bir şey söyleyen belirli bir kutuya düşerse. Bin bölme endekslerini belirlemek için verileri sıralıyorum ve sonra her bir veri parçasının tek tek düştüğüne karar veriyorum.
Matthew Kemnetz

ortalamamda yanlış bir şey yapmazsam doğru olduğunu düşünüyorum. çift ​​seçerek, y aralıklı kutular tüm uç noktalarım 3'tür. Bu yüzden verilerimi düzgün bir şekilde depolayamıyorum. Uygulamamın aralıksız dağılmasının nedeni budur; aralıklı kutular.
Matthew Kemnetz

İşte biraz farklı bir ortamda yaptığım bir şey .
Makro

Yanıtlar:


9

Bence yapmak istediğin şey kümelenme. Benzer değerlerin aynı kutuda toplanması ve toplam kutu sayısının önceden ayarlanması için "Değer" lerinizi gruplandırmak istiyorsunuz.

Bu sorunu k-ortalamaları kümeleme algoritmasını kullanarak çözebilirsiniz . MATLAB'da bunu şu şekilde yapabilirsiniz:

bin_ids = kmeans(Values,3); 

Yukarıdaki çağrı, grup Valuesiçi varyans minimum olacak şekilde değerleri üç grupta toplar.


1
Bunu ben de buldum. Bu tam olarak uyguladığım şeydi ve mükemmel çalıştı. Buraya kendi sorumu cevaplamak için geldim ama sen beni yendin! Kümeleme yapmaya çalıştığım şeydi.
Matthew Kemnetz

8

k-ortalamaları bir seçenektir, ancak 1 boyutlu veriler için pek mantıklı değildir. Tek boyutlu verilerde çok büyük bir avantajınız vardır: veriler tamamen sıralanabilir.

Bunun yerine doğal mola optimizasyonuna bir göz atın :
http://en.wikipedia.org/wiki/Jenks_natural_breaks_optimization


Bu son derece ilginç. Bunun neden k'den daha iyi olabileceğiyle ilgili daha ayrıntılı bilgi verebilir misiniz?
Matthew Kemnetz

Sormamın ana nedeni algoritmam için MATLAB kullanıyorum ve herhangi bir araç kutusu vb. Herhangi bir Jenks doğal sonları optimizasyonu bulamadım. Vites değiştirmeden ve bunu uygulamadan önce bunun ne kadar iyi / hızlı olabileceğini bilmek istedim.
Matthew Kemnetz

1
k-demek oldukça aptalca. Bu araçlara sahiptir ve her zaman iki yolun ortasında bölünecektir . Yani 0 1 2 3 4 5 7 7 7, k-ortalamalar 4 ve bazen hatta 3 ve 4 arasında bölünmüş olacaktır 5 arasında bölünmüş tercih edecektir örneğin verilen
ÇIK Has - Anony-Mousse
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.