2016-04-13 17 views
2

Listelerden önce liste listesi daha önce yayınlanmıştır, ancak çalışmakta olduğum python ortamı tüm yöntemleri ve sınıfları tam olarak bütünleyemez. Ben de pandaları ithal edemem.Çok sayıda liste listesinin hızlı bir şekilde karşılaştırılması

Listeleri büyük bir liste içinde karşılaştırmaya çalışıyorum ve büyük listedeki diğer tüm listelere yaklaşık olarak karşılık gelen yaklaşık 8-10 liste buluyorum.

Büyük listede < 50 listesi varsa iyi çalıştığım yaklaşım. Bununla birlikte, en az 20k listelerini ve ideal olarak 1 milyonu + karşılaştırmaya çalışıyorum. Şu anda itertools'a bakıyorum. Büyük veri kümeleri için numpy veya pandalar kullanmadan en hızlı ve en verimli yaklaşım hangisi olabilir?

Bazı yöntem ve sınıfları numpy cinsinden kullanabilirim, ancak hepsini değil. Ne amaçlayan olduğunuz bir kümelenme operasyondur gibi Örneğin, numpy.allclose ve numpy.all düzgün çalışmaz ve bu çünkü çalışıyorum ortamının olduğunu.

global rel_tol, avg_lists 
    rel_tol=.1 
    avg_lists=[] 
    #compare the lists in the big list and output ~8-10 lists that approximate the all the lists in the big list 
    for j in range(len(big_list)): 

     for k in range(len(big_list)): 

      array1=np.array(big_list[j]) 
      array2=np.array(big_list[k]) 
      if j!=k: 
      #if j is not k: 

       diff=np.subtract(array1, array2) 
       abs_diff=np.absolute(diff) 

       #cannot use numpy.allclose 
       #if the deviation for the largest value in the array is < 10% 
       if np.amax(abs_diff)<= rel_tol and big_list[k] not in avg_lists: 

        cntr+=1 
        avg_lists.append(big_list[k]) 
+1

Numpy'yi kullanamaz mısın? Yapamayacağınızı söylüyorsunuz, ama kodunuzun numpy kullanıyormuş gibi gözüküyor! – wnnmaw

+0

'j k değil k' ile bir hatadır. 'J! = K' kullanın. plane_array1 nedir? – Daniel

+1

OP'de belirtildiği gibi, "tüm yöntemleri ve sınıfları tam olarak bütünleştiremiyorum". Bazı numpy yöntemlerini ve sınıflarını kullanabilirim ama hepsini değil. Yorumlardan birinde 'numpy.allclose' – webmaker

cevap

2

Temelde, o (görünüyor yani K < N küme merkezleri aracılığıyla bir N noktası kümesini temsil eder). K-Means clustering yaklaşımını öneririm; burada kümelerinizin boyutu istediğiniz eşiğin altında kaldığında K'yi artırırsınız.

"Tüm yöntemleri ve sınıfları tam anlamıyla bütünleştiremiyorum" ile kastettiğinizden emin değilim, ancak scikit-learn varsa K-means estimator kullanabilirsiniz. Bu mümkün değilse, K-anlamına gelen algoritmanın basit bir sürümü relatively easy to code from scratch'dur ve bunu kullanabilirsiniz. Eğer örneğin uygulanacak Buradan

# 100 lists of length 10 = 100 points in 10 dimensions 
from random import random 
big_list = [[random() for i in range(10)] for j in range(100)] 

# compute eight representative points 
from sklearn.cluster import KMeans 
model = KMeans(n_clusters=8) 
model.fit(big_list) 
centers = model.cluster_centers_ 
print(centers.shape) # (8, 10) 

# this is the sum of square distances of your points to the cluster centers 
# you can adjust n_clusters until this is small enough for your purposes. 
sum_sq_dists = model.inertia_ 

: Burada

bir var scikit-öğrenme kullanarak yaklaşım k-demektir Her kümedeki en yakın noktayı merkeze bulur ve bunu ortalama olarak değerlendirir. Çözmeyi denediğiniz sorunun daha fazla ayrıntıya sahip olmadan, kesin olarak söylemek zor. Fakat böyle bir kümelenme yaklaşımı, sorunuzda belirttiğiniz gibi bir sorunu çözmek için en etkili yol olacaktır.

+0

Teşekkürler! Bu geribildirimi gerçekten takdir ediyorum. Sayısal konuya açıklık getirmek için, belirli bir Python yorumlayıcısına sahip bir python sanal ortamının oldukça karmaşık bir kurulumunu kullanıyorum. Bazı yöntemler/sınıflar (numpy.subtract gibi) iyi çalışır, diğerleri (numpy.all gibi) yapmaz. Sorunlara neden olan sanal ortam ve Python yorumlayıcısıdır ve hızlıca kolay bir düzeltme yoktur. Scikit-learn (parmak çarpı!) Ithal edip edemeyeceğimi göreceğim. Tekrar teşekkürler! – webmaker

+0

Pypy + numpypy kullanıyor musunuz? Bu durumda, scikit-learn ve diğer araçlar işe yaramayacak ve bu tür algoritmaları sıfırdan kodlamak zorunda kaldınız. Tüm geri bildirimler için – jakevdp

+0

tekrar teşekkürler. ne yazık ki, scikit-learn'i ithal edemiyorum, bu yüzden bu algoritmayı sıfırdan yazmam gerekecek – webmaker