سؤال

لدي ملف ARFF يحتوي على 14 عمودًا رقميًا.أرغب في إجراء تسوية على كل عمود على حدة، أي تعديل القيم من كل عمود إلى (actual_value - min(this_column)) / (max(this_column) - min(this_column)).ومن ثم، فإن كافة القيم من العمود ستكون في النطاق [0, 1].قد تختلف القيم الدنيا والقصوى في عمود عن تلك الموجودة في عمود آخر.

كيف يمكنني القيام بذلك باستخدام مرشحات Weka؟

شكرًا

هل كانت مفيدة؟

المحلول

يمكن القيام بذلك باستخدام

weka.filters.unsupervised.attribute.Normalize

بعد تطبيق هذا المرشح ، ستكون جميع القيم في كل عمود في النطاق [0 ، 1

نصائح أخرى

صحيح.أردت فقط أن أذكر بالفرق بين "التطبيع" و"التوحيد".ما ورد في السؤال هو "التوحيد القياسي"، في حين أن "التطبيع" يفترض التوزيع الغاوسي ويطبيع بواسطة المتوسط ​​والتباين المعياري لكل سمة.إذا كان لديك قيمة متطرفة في بياناتك، فقد يضر عامل التصفية القياسي بتوزيع بياناتك مثل الحد الأدنى، أو قد يكون الحد الأقصى أبعد بكثير من المثيلات الأخرى.

هنا مثال تطبيع العمل مع K-Means في Java.

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());

إذا كان لديك ملف CSV ، فاستبدل سطر BufferedReader أعلاه مع مصدر البيانات المذكور أدناه:

final DataSource source = new DataSource("/Users/data.csv");
final Instances data = source.getDataSet();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top