2010-02-16 42 views
6

14 sayısal sütun içeren bir ARFF dosyasına sahibim. Her sütunda ayrı ayrı bir normalleştirme gerçekleştirmek istiyorum, bu da her bir sütunun değerlerini (actual_value - min(this_column))/(max(this_column) - min(this_column)) olarak değiştiriyor. Bu nedenle, bir sütundan gelen tüm değerler [0, 1] aralığında olacaktır. Bir sütundan gelen minimum ve maksimum değerler başka bir sütununkinden farklı olabilir.Weka normalize sütunları

Bunu Weka filtreleriyle nasıl yapabilirim?

sayesinde

cevap

8

Bu aralıkta [0, 1]

+0

ben normalize ettik Sadece çıkış normalize Arff dosyası sonra ve önce sınıflandırıcılar çalıştırmak miyim? (Ben diske kaydetmek istiyorum) – aneuryzm

1

doğru bu olacak olan her bir sütununda filtreyi tüm değerleri uygulandıktan sonra

weka.filters.unsupervised.attribute.Normalize 

kullanılarak yapılabilir. Sadece "normalleşme" ve "standardizasyon" arasındaki farkı hatırlatmak istedim. “Normalizasyon”, “normalleşme”, Gauss dağılımını varsayar ve her bir özelliğin standart ve standart değişimini normalleştirir. Verilerinizde bir aykırılık varsa, standartlaştırılmış filtre, veri dağıtımınızı min, veya diğer örneklerden daha fazla olabilir.

+1

Hayır, sorunun doğru olduğunu, tam olarak yanlış yolu tarif edersiniz: http://www.dataminingblog.com/standardization-vs-normalization/ – Sentry

0

İşte JAVA'da K-Means ile çalışma normalleştirme örneği.

final SimpleKMeans kmeans = new SimpleKMeans(); 

final String[] options = weka.core.Utils 
     .splitOptions("-init 0 -max-candidates 100 -periodic-pruning 10000 -min-density 2.0 -t1 -1.25 -t2 -1.0 -N 10 -A \"weka.core.EuclideanDistance -R first-last\" -I 500 -num-slots 1 -S 50"); 
kmeans.setOptions(options); 

kmeans.setSeed(10); 
kmeans.setPreserveInstancesOrder(true); 
kmeans.setNumClusters(25); 
kmeans.setMaxIterations(1000); 

final BufferedReader datafile = new BufferedReader(new FileReader("/Users/data.arff"); 
Instances data = new Instances(datafile); 

//normalize 
final Normalize normalizeFilter = new Normalize(); 
normalizeFilter.setInputFormat(data); 
data = Filter.useFilter(data, normalizeFilter); 

//remove class column[0] from cluster 
data.setClassIndex(0); 
final Remove removeFilter = new Remove(); 
removeFilter.setAttributeIndices("" + (data.classIndex() + 1)); 
removeFilter.setInputFormat(data); 
data = Filter.useFilter(data, removeFilter); 

kmeans.buildClusterer(data); 

System.out.println(kmeans.toString()); 

// evaluate clusterer 
final ClusterEvaluation eval = new ClusterEvaluation(); 
eval.setClusterer(kmeans); 
eval.evaluateClusterer(data); 
System.out.println(eval.clusterResultsToString()); 

Eğer CSV sonra dosya aşağıda belirtilen veri kaynağı ile yukarıda BufferedReader hattını değiştirmek zorunda:

final DataSource source = new DataSource("/Users/data.csv"); 
final Instances data = source.getDataSet(); 
İlgili konular