use of de.lmu.ifi.dbs.elki.data.type.VectorFieldTypeInformation in project elki by elki-project.
the class ArffParser method setupBundleHeaders.
/**
* Setup the headers for the object bundle.
*
* @param names Attribute names
* @param targ Target columns
* @param etyp ELKI type information
* @param dimsize Number of dimensions in the individual types
* @param bundle Output bundle
* @param sparse Flag to create sparse vectors
*/
private void setupBundleHeaders(ArrayList<String> names, int[] targ, TypeInformation[] etyp, int[] dimsize, MultipleObjectsBundle bundle, boolean sparse) {
for (int in = 0, out = 0; in < targ.length; out++) {
int nin = in + 1;
for (; nin < targ.length; nin++) {
if (targ[nin] != targ[in]) {
break;
}
}
if (TypeUtil.NUMBER_VECTOR_FIELD.equals(etyp[out])) {
String[] labels = new String[dimsize[out]];
// Collect labels:
for (int i = 0; i < dimsize[out]; i++) {
labels[i] = names.get(out + i);
}
if (!sparse) {
VectorFieldTypeInformation<DoubleVector> type = new VectorFieldTypeInformation<>(DoubleVector.FACTORY, dimsize[out], labels);
bundle.appendColumn(type, new ArrayList<DoubleVector>());
} else {
VectorFieldTypeInformation<SparseDoubleVector> type = new VectorFieldTypeInformation<>(SparseDoubleVector.FACTORY, dimsize[out], labels);
bundle.appendColumn(type, new ArrayList<SparseDoubleVector>());
}
} else if (TypeUtil.LABELLIST.equals(etyp[out])) {
StringBuilder label = new StringBuilder(names.get(out));
for (int i = 1; i < dimsize[out]; i++) {
label.append(' ').append(names.get(out + i));
}
bundle.appendColumn(new SimpleTypeInformation<>(LabelList.class, label.toString()), new ArrayList<LabelList>());
} else if (TypeUtil.EXTERNALID.equals(etyp[out])) {
bundle.appendColumn(new SimpleTypeInformation<>(ExternalID.class, names.get(out)), new ArrayList<ExternalID>());
} else if (TypeUtil.CLASSLABEL.equals(etyp[out])) {
bundle.appendColumn(new SimpleTypeInformation<>(ClassLabel.class, names.get(out)), new ArrayList<ClassLabel>());
} else {
throw new AbortException("Unsupported type for column " + in + "->" + out + ": " + ((etyp[out] != null) ? etyp[out].toString() : "null"));
}
assert (out == bundle.metaLength() - 1);
in = nin;
}
}
use of de.lmu.ifi.dbs.elki.data.type.VectorFieldTypeInformation in project elki by elki-project.
the class CenterOfMassMetaClustering method runClusteringAlgorithm.
/**
* Run a clustering algorithm on a single instance.
*
* @param parent Parent result to attach to
* @param ids Object IDs to process
* @param store Input data
* @param dim Dimensionality
* @param title Title of relation
* @return Clustering result
*/
protected C runClusteringAlgorithm(ResultHierarchy hierarchy, Result parent, DBIDs ids, DataStore<DoubleVector> store, int dim, String title) {
SimpleTypeInformation<DoubleVector> t = new VectorFieldTypeInformation<>(DoubleVector.FACTORY, dim);
Relation<DoubleVector> sample = new MaterializedRelation<>(t, ids, title, store);
ProxyDatabase d = new ProxyDatabase(ids, sample);
C clusterResult = inner.run(d);
d.getHierarchy().remove(sample);
d.getHierarchy().remove(clusterResult);
hierarchy.add(parent, sample);
hierarchy.add(sample, clusterResult);
return clusterResult;
}
use of de.lmu.ifi.dbs.elki.data.type.VectorFieldTypeInformation in project elki by elki-project.
the class ScatterData method initializeData.
public void initializeData(GL2 gl) {
length = ids.size();
dim = 0;
vecOffset = -1;
classOffset = -1;
// Scan relations for dimensionalities:
int[] dims = new int[relations.size()];
LinearScale[][] scales = new LinearScale[relations.size()][];
ArrayList<Relation<? extends NumberVector>> vrels = new ArrayList<>(relations.size());
for (int r = 0; r < relations.size(); r++) {
Relation<?> rel = relations.get(r);
final SimpleTypeInformation<?> type = rel.getDataTypeInformation();
if (type instanceof VectorFieldTypeInformation) {
@SuppressWarnings("unchecked") final Relation<? extends NumberVector> vrel = (Relation<? extends NumberVector>) rel;
final int d = ((VectorFieldTypeInformation<?>) type).getDimensionality();
dims[r] = d;
LinearScale[] rscales = new LinearScale[d];
double[][] minmax = RelationUtil.computeMinMax(vrel);
for (int i = 0; i < d; i++) {
rscales[i] = new LinearScale(minmax[0][i], minmax[1][i]);
}
scales[r] = rscales;
vrels.add(vrel);
if (vecOffset < 0) {
vecOffset = dim;
}
dim += d;
} else {
// FIXME: handle other relation types!
dims[r] = 0;
vrels.add(null);
}
}
if (classOffset < 0) {
++dim;
}
LOG.warning("Dimensionalities: " + FormatUtil.format(dims));
// Initialize vertex buffer handles:
assert (vbos[0] == -1);
gl.glGenBuffers(1, vbos, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbos[0]);
gl.glBufferData(GL.GL_ARRAY_BUFFER, //
length * dim * SIZE_FLOAT + // safety padding
3 * SIZE_FLOAT, null, GL2.GL_STATIC_DRAW);
ByteBuffer vbytebuffer = gl.glMapBuffer(GL.GL_ARRAY_BUFFER, GL2.GL_WRITE_ONLY);
FloatBuffer vertices = vbytebuffer.order(ByteOrder.nativeOrder()).asFloatBuffer();
Random rnd = new Random();
for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) {
for (int r = 0; r < dims.length; r++) {
if (dims[r] <= 0) {
continue;
}
final Relation<? extends NumberVector> vrel = vrels.get(r);
LinearScale[] rscales = scales[r];
if (vrel != null) {
NumberVector vec = vrel.get(iter);
for (int d = 0; d < dims[r]; d++) {
// vertices.put( rnd.nextFloat());
vertices.put((float) rscales[d].getScaled(vec.doubleValue(d)) * 2.f - 1.f);
}
}
}
if (classOffset < 0) {
vertices.put(rnd.nextInt(30));
}
}
stride = dim * SIZE_FLOAT;
if (classOffset < 0) {
classOffset = (dim - 1) * SIZE_FLOAT;
}
if (vertices.position() != length * dim) {
LOG.warning("Size mismatch: " + vertices.position() + " expected: " + length * dim, new Throwable());
}
vertices.flip();
gl.glUnmapBuffer(GL.GL_ARRAY_BUFFER);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
LOG.warning("Size: " + length + " dim: " + dim + " " + vecOffset + " " + classOffset);
}
use of de.lmu.ifi.dbs.elki.data.type.VectorFieldTypeInformation in project elki by elki-project.
the class TSNE method run.
public Relation<DoubleVector> run(Relation<O> relation) {
AffinityMatrix pij = affinity.computeAffinityMatrix(relation, EARLY_EXAGGERATION);
// Create initial solution.
final int size = pij.size();
double[][] sol = randomInitialSolution(size, dim, random.getSingleThreadedRandom());
projectedDistances.setLong(0L);
optimizetSNE(pij, sol);
LOG.statistics(projectedDistances);
// Remove the original (unprojected) data unless configured otherwise.
removePreviousRelation(relation);
// Transform into output data format.
DBIDs ids = relation.getDBIDs();
WritableDataStore<DoubleVector> proj = DataStoreFactory.FACTORY.makeStorage(ids, DataStoreFactory.HINT_DB | DataStoreFactory.HINT_SORTED, DoubleVector.class);
VectorFieldTypeInformation<DoubleVector> otype = new VectorFieldTypeInformation<>(DoubleVector.FACTORY, dim);
for (DBIDArrayIter it = pij.iterDBIDs(); it.valid(); it.advance()) {
proj.put(it, DoubleVector.wrap(sol[it.getOffset()]));
}
return new MaterializedRelation<>("tSNE", "t-SNE", otype, proj, ids);
}
use of de.lmu.ifi.dbs.elki.data.type.VectorFieldTypeInformation in project elki by elki-project.
the class BarnesHutTSNE method run.
public Relation<DoubleVector> run(Database database, Relation<O> relation) {
AffinityMatrix neighbors = affinity.computeAffinityMatrix(relation, EARLY_EXAGGERATION);
double[][] solution = randomInitialSolution(neighbors.size(), dim, random.getSingleThreadedRandom());
projectedDistances.setLong(0L);
optimizetSNE(neighbors, solution);
LOG.statistics(projectedDistances);
// Remove the original (unprojected) data unless configured otherwise.
removePreviousRelation(relation);
DBIDs ids = relation.getDBIDs();
WritableDataStore<DoubleVector> proj = DataStoreFactory.FACTORY.makeStorage(ids, DataStoreFactory.HINT_DB | DataStoreFactory.HINT_SORTED, DoubleVector.class);
VectorFieldTypeInformation<DoubleVector> otype = new VectorFieldTypeInformation<>(DoubleVector.FACTORY, dim);
for (DBIDArrayIter it = neighbors.iterDBIDs(); it.valid(); it.advance()) {
proj.put(it, DoubleVector.wrap(solution[it.getOffset()]));
}
return new MaterializedRelation<>("tSNE", "t-SNE", otype, proj, ids);
}
Aggregations