Weka를 사용하여 데이터 집합에서 K-Means 클러스터링을 수행하면서 서로 다른 가중치가 서로 다른 속성에 미치는 영향을 검사하려고합니다.Weka는 항상 서로 다른 데이터에 대해 동일한 클러스터를 생성합니다.
그러나 각 속성의 가중치를 조정하면 클러스터링의 차이가 나타나지 않습니다.
//Initialize file readers
...
Instances dataSet = readDataFile(dataReader);
double[][] modifiers = readNormalizationFile(normReader, dataSet.numAttributes());
normalize(dataSet, modifiers);
SimpleKMeans kMeans = new SimpleKMeans();
kMeans.setPreserveInstancesOrder(true);
int[] clusters = null;
try
{
System.out.println(kMeans.getSeed());
if(distMet != 0)
kMeans.setDistanceFunction(new ManhattanDistance(dataSet));
kMeans.setNumClusters(k);
kMeans.buildClusterer(dataSet);
clusters = kMeans.getAssignments();
}
//Print clusters
"수정 자"배열의 첫 번째 차원은 각 속성에 해당하며 각 요소에는 두 개의 값이 있습니다. 첫 번째는 속성 값에서 뺀 다음 결과를 두 번째 값으로 나눕니다.
정규화는 다음과 같이 진행됩니다
public static void normalize(Instances dataSet, double[][] modifiers)
{
for(int i = 0; i < dataSet.numInstances(); i++)
{
Instance currInst = dataSet.instance(i);
double[] values = currInst.toDoubleArray();
for(int j = 0; j < values.length; j++)
{
currInst.setValue(j, (values[j] - modifiers[j][0])/modifiers[j][1]);
}
}
}
내 기대 번째 정상화의 증가는 클러스터링에 특정 속성의 중요성을 절감하고, 따라서 클러스터가 할당되는 방식을 변경,하지만이없는 것입니다해야한다는 것입니다 나는 관찰하고있다. 내 디버거가 올바르게 표준화 된 값이 클러스터러로 전송되고 있음을 보여 주지만 Weka가 나 대신 엉망이된다고 생각합니다.
Weka의 K-Means를 올바르게 사용 했습니까? 아니면 중요한 것을 버렸습니까?
Weka는 데이터를 자동으로 표준화하여 가중치를 파괴하는 경우가 있습니다. ELKI를 대신 사용해보십시오. –
Weka가 나를 위해 데이터를 표준화하는 것은 사실이지만 모든 코드를 스크랩하고 다른 프레임 워크로 다시 시작할 시간이 없습니다. 아래 답변이 말했듯이, Weka에게 정상화시키지 말라고 말하는 것이 훨씬 더 의미가 있습니다. – MichaelPlante