質問

私は14個の数値列を含むARFFファイルを持っています。私は(actual_value - min(this_column)) / (max(this_column) - min(this_column))にそれぞれcolumから値を修正され、別々に各列の正規化を実行します。従って、カラムからのすべての値は、範囲[0, 1]であろう。カラムからの最小値と最大値は、別の列のものと異なる場合があります。

どのように私はウェカフィルタでこれを行うことができますか?

おかげ

役に立ちましたか?

解決

このは使用して行うことができます。

weka.filters.unsupervised.attribute.Normalize

各列のすべての値が範囲内であろう、このフィルタを適用した後、[0、1]

他のヒント

そうです。ただ、「正規化」と「標準化」の違いについて思い出させたかったです。 「正規化」はガウス分布を仮定し、各属性の平均値、および標準偏差で正規化しながら、どのような問題に言及したことは、「標準化」です。あなたのデータで外れ値を持っている場合は、標準化フィルタは、分として、あなたのデータ配信を傷つける可能性がある、またはMAXは非常に遠く、他のインスタンスよりかもしれません。

ここJAVAにおけるK-手段を作動正規化例である。

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