Java 实现多维多类型数据的距离函数
我在java中使用ELKI在kmeans算法中对tweet的文本进行聚类。在聚类之前,我用tf-idf度量值计算推特文本的相似性,tf-idf度量值用于聚类Java 实现多维多类型数据的距离函数,java,twitter,cluster-analysis,elki,Java,Twitter,Cluster Analysis,Elki,我在java中使用ELKI在kmeans算法中对tweet的文本进行聚类。在聚类之前,我用tf-idf度量值计算推特文本的相似性,tf-idf度量值用于聚类 public void clustering(String file) throws FileNotFoundException { //Distance.calSim("after sorting.txt"); similarity = MainElki.getSimilarity(); PrintWriter
public void clustering(String file) throws FileNotFoundException {
//Distance.calSim("after sorting.txt");
similarity = MainElki.getSimilarity();
PrintWriter writer = new PrintWriter(new File(file));
StringBuilder strBuilder = new StringBuilder();
for (int k = 0; k < numCorpus; k = k + 20) {
double[][] subArray = new double[20][20];
subArray = getSubArray(k, k);
DatabaseConnection dbc = new ArrayAdapterDatabaseConnection(subArray);
Database db = new StaticArrayDatabase(dbc, null);
db.initialize();
SquaredEuclideanDistanceFunction dist = SquaredEuclideanDistanceFunction.STATIC;
RandomlyGeneratedInitialMeans init = new RandomlyGeneratedInitialMeans(RandomFactory.DEFAULT);
KMeansLloyd<NumberVector> km = new KMeansLloyd<>(dist, 3, 0, init);
Clustering<KMeansModel> c = km.run(db);
Relation<NumberVector> rel = db.getRelation(TypeUtil.NUMBER_VECTOR_FIELD);
DBIDRange ids = (DBIDRange) rel.getDBIDs();
strBuilder.append("\n******** subArray[" + k + "]" + "[" + k + "]");
int i = 2;
for (Cluster<KMeansModel> clu : c.getAllClusters()) {
// K-means will name all clusters "Cluster" in lack of noise support:
strBuilder.append("\n #" + i + ": " + clu.getNameAutomatic() + "\n");
strBuilder.append(" Size: " + clu.size() + "\n");
strBuilder.append(" Center: " + clu.getModel().getPrototype().toString() + "\n");
strBuilder.append(" Objects: ");
for (DBIDIter it = clu.getIDs().iter(); it.valid(); it.advance()) {
// To get the vector use:
NumberVector v = rel.get(it);
// Offset within our DBID range: "line number"
final int offset = ids.getOffset(it);
strBuilder.append(" " + (offset + k));
// Do NOT rely on using "internalGetIndex()" directly!
}
i++;
}
}//end of for subArray
writer.write(strBuilder.toString());
writer.close();
}//end of clustering function
是否有任何方法可以编写自定义的距离函数来计算tweet文本的距离,然后使用其他功能(如相似数)来计算最终距离?KMeans,顾名思义,需要计算平均值 此算法只能用于R^d中的向量
因此,无论如何,如果你真的想这样做(kmeans在不同比例的属性上工作不好!),你必须将所有属性转换成数字。或者使用不同的算法。KMeans,顾名思义,需要计算平均值 此算法只能用于R^d中的向量
因此,无论如何,如果你真的想这样做(kmeans在不同比例的属性上工作不好!),你必须将所有属性转换成数字。或者使用不同的算法。K-means只能在
NumberVector
s上工作,没有办法解决这个问题
对于许多其他算法,这是可能的。您需要:
YourDataType
距离功能
NumberVector
。它将不接受您的数据类型
。因为它不能计算这个数据的平均值
我想在埃尔基得到支持,但我自己没有这个必要;对于这样的数据,我看不到任何好的距离函数(有Goor的;但是它不是我认为的“好”-有用的,它将需要大量的手动缩放、加权以及对每个数据集的这种修改),并且不清楚如何优化这种场景的实现。因此,我的优先级太低,无法自己实现,但我很欣赏精心设计的pull请求。K-means只能在
NumberVector
s上工作,这是无法避免的
对于许多其他算法,这是可能的。您需要:
YourDataType
距离功能
NumberVector
。它将不接受您的数据类型
。因为它不能计算这个数据的平均值
我想在埃尔基得到支持,但我自己没有这个必要;对于这样的数据,我看不到任何好的距离函数(有Goor的;但是它不是我认为的“好”-有用的,它将需要大量的手动缩放、加权以及对每个数据集的这种修改),并且不清楚如何优化这种场景的实现。因此,我的优先级列表太低,无法自行实现,但我很欣赏精心设计的pull请求。您有任何例子可以在支持多类型属性的elki中使用它吗?没有,我只使用数字数据。我试图研究“多类型”数据的统计原因,但它似乎非常薄弱。因此,似乎没有一种“合理”的处理方法,只有“黑魔法”,结果并不比随机好。由于我的研究,我需要测试使用其他功能是否可以改善结果。似乎使用tweets的所有功能都有助于对tweets进行聚类。我不认为你能以任何有用的方式将tweet聚集在一起。但是如果你想使用k-means,你必须满足它的研发要求。当你需要实数来计算均值时,别指望我能让k-means神奇地在字符上工作……不,我不需要使用kmeans。我想从在我的数据集中有更好的聚类或主题检测算法的库开始。你们有任何例子,我可以在elki中使用它,支持多类型属性吗?不,我只使用数字数据。我试图研究“多类型”数据的统计原因,但它似乎非常薄弱。因此,似乎没有一种“合理”的处理方法,只有“黑魔法”,结果并不比随机好。由于我的研究,我需要测试使用其他功能是否可以改善结果。似乎使用tweets的所有功能都有助于对tweets进行聚类。我不认为你能以任何有用的方式将tweet聚集在一起。但是如果你想使用k-means,你必须满足它的研发要求。当你需要实数来计算均值时,别指望我能让k-means神奇地在字符上工作……不,我不需要使用kmeans。我想从我的数据集中有更好的聚类或主题检测算法的库开始。谢谢你们的指导。你是建议我实现一个新的数据类型并使用ELKI的其他算法还是我编写我的算法?即使你编写自己的算法,你也必须首先实现一个数据类型来管理数据。所以我会先这样做,然后尝试一些现有的算法,如果有必要的话,最后添加你自己的算法。谢谢你的指导。你是建议我实现一个新的数据类型并使用ELKI的其他算法还是我编写我的算法?即使你编写自己的算法,你也必须首先实现一个数据类型来管理数据。所以我会先这样做,然后尝试一些现有的算法,如果需要的话,最终添加您自己的算法。
public class CustomizedDistance extends AbstractNumberVectorDistanceFunction {
@Override
public double distance(NumberVector arg0, NumberVector arg1) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}