private static HardAssigner<byte[], float[], IntFloatPair> trainQuantiser( GroupedDataset<String, ListDataset<Record<FImage>>, Record<FImage>> sample, PyramidDenseSIFT<FImage> pdsift) { List<LocalFeatureList<ByteDSIFTKeypoint>> allkeys = new ArrayList<LocalFeatureList<ByteDSIFTKeypoint>>(); for (final Record<FImage> rec : sample) { final FImage img = rec.getImage(); pdsift.analyseImage(img); allkeys.add(pdsift.getByteKeypoints(0.005f)); } if (allkeys.size() > 10000) allkeys = allkeys.subList(0, 10000); final ByteKMeans km = ByteKMeans.createKDTreeEnsemble(300); final DataSource<byte[]> datasource = new LocalFeatureListDataSource<ByteDSIFTKeypoint, byte[]>(allkeys); final ByteCentroidsResult result = km.cluster(datasource); return result.defaultHardAssigner(); } }
@Override public int[][] performClustering(byte[][] data) { ByteCentroidsResult res = this.cluster(data); return new IndexClusters(res.defaultHardAssigner().assign(data)).clusters(); }
@Override public int[][] performClustering(byte[][] data) { ByteCentroidsResult clusters = this.cluster(data); return new IndexClusters(clusters.defaultHardAssigner().assign(data)).clusters(); }
final HardAssigner<byte[], ?, ?> assigner = result.defaultHardAssigner();
final HardAssigner<byte[], ?, ?> assigner = result.defaultHardAssigner();
/** * Compute HierarchicalByteKMeans clustering. * * @param data Data to cluster. * @param K Number of clusters for this node. * @param height Tree height. * * @return a new HierarchicalByteKMeans node representing a sub-clustering. **/ private Node trainLevel(final byte[][] data, int K, int height) { Node node = new Node(); node.children = (height == 1) ? null : new Node[K]; ByteKMeans kmeans = newByteKMeans(K); node.result = kmeans.cluster(data); HardAssigner<byte[], float[], IntFloatPair> assigner = node.result.defaultHardAssigner(); if (height > 1) { int[] ids = assigner.assign(data); for (int k = 0; k < K; k++) { byte[][] partition = extractSubset(data, ids, k); int partitionK = Math.min(K, partition.length); node.children[k] = trainLevel(partition, partitionK, height - 1); } } return node; }
node.result = kmeans.cluster(data); HardAssigner<byte[], float[], IntFloatPair> assigner = node.result.defaultHardAssigner();