2015-07-10 18 views
9

Her satırın bir veri noktasını temsil eden sayıların bir vektörü olduğu bir csv dosyası var. Ben cvv dosyasında her veri noktasının en yakın komşusunu hesaplamak için komut satırından weka kullanmak istiyorum. Komut satırından en yakın komşu sınıflandırmasını nasıl yapacağımı biliyorum ama istediğim bu değil. Gerçek komşuları istiyorum. Bunu nasıl yaparım?En yakın komşuları weka kullanarak komut satırından nasıl hesaplanır?

Bunu kullanarak Weka değil başka bir araç yapmak istiyorum.

cevap

5

Weka Sana (Bir dosyayı yemek örneklerini dönüştürmek ve sonra her örneğinin tüm N en yakın komşuları bulmak)

ancak ayarlayabilirsiniz öneriyorsun ne düşündüğünü yapmak için bir astar yok Weka ve birkaç satır Java'yı aşağıdaki şekilde kullanarak bir komut satırı stili bir kaplamaya kadar:

Aşağıdaki kodu derleyin. Eclipse kullanılan, ancak aynı kolaylıkla komut satırına javac kullanabilirsiniz - sadece size sınıf yolunda weka.jar olduğundan emin olun. Sana Şimdi sadece aşağıdaki komutu kullanarak komut satırından çalıştırmak

import weka.core.Instances; 
import weka.core.converters.ConverterUtils.DataSource; 
import weka.core.neighboursearch.LinearNNSearch; 

public class WekaCLFindNN { 
    public static void main(String[] args) throws Exception { 

      //report that the code is running 
      System.out.println("Weka Command Line Find Nearest " + args[0] + " Neighbors for each Instance in " + args[1]); // Display the string. 

      //setup datasources, grab instances, and calculate the nearest neighbors 
      DataSource source = new DataSource(""+args[1]); 
      Instances instances = source.getDataSet(); 
      weka.core.neighboursearch.LinearNNSearch knn = new LinearNNSearch(instances); 

      //cycle through the dataset and get instances for the nearestneighbors 
      for(int j=0;j<instances.numInstances();j++){ 
      Instances nearestInstances= knn.kNearestNeighbours(instances.instance(j), Integer.parseInt(args[0])); 

      //cycle through the instances and printout the nearestneighbors 
      System.out.println("\n\n" + instances.instance(j)); 
      for(int i =0;i<Integer.parseInt(args[0]);i++) 
      { 
       System.out.println("\n\t" + nearestInstances.instance(i)); 

      } 

      } 

      //close the code 
      System.out.println("\n"+"Nearest Neighbors found"); // Display the string. 

    } 
} 

altına kodundan sonra cammand hattından bir astar olarak bu çağırmak için nasıl bir örnek göstermektedir.

Java cp weka.jar ;. WekaCLFindNN numNNCSVfile burada

benim makinede çalışan bunun bir ekran resmi. Ben java çalıştırdığımda weka.jar dosyası ve WekaCLFindNN dosyası dizininde olduğunu unutmayın. Ayrıca ben sınıf yolu separater bir noktalı Windows altında bu çalıştırıyorum unutmayın (;) Linux altında bu çalışıyormuş Eğer iki nokta üst üste kullanması gerekir (:)

weka working from command line

Rolü yok sayabilirsiniz Sadece Weka'nın stderr'e bir şeyler fırlattığı veritabanı sürücüsü hakkında. ama gördüğünüz gibi vektörler hizada bırakılır ve en yakın komşuları da istediğin gibi listelenir. Eğer bir günlük dosyasında veri istiyorsanız

sadece bu şekilde yürütmek

java cp weka.jar ;. WekaCLFindNN>

outputlog günlük dosyası şu şekilde görünecektir ve bu veritabanı hakkında hata yok göreceksiniz:

outputlog

en yakın komşuları hem olması güzel olurdu da ve orijinal örnek veri kümesindeki indeksini kNearestNeighbours yöntemini kontrol ettim ve indeks verilerinin raporlanmadan hemen önce atıldığını gördüm. Bunu istiyorsanız, LinearNNSearch sınıfını miras almanız ve hem örnekleri hem de endeksleri çıkaran yeni bir yöntem yazmanız gerekecek.

Yani bu size yardımcı olmuştur. Weka'nın bunu kutudan çıkarmaması talihsiz bir durum, ama sadece birkaç satırlık kodla yapabilirsiniz.

İlgili konular