Package elki.index.preprocessed.knn
Class NNDescent<O>
- java.lang.Object
-
- elki.index.preprocessed.knn.AbstractMaterializeKNNPreprocessor<O>
-
- elki.index.preprocessed.knn.NNDescent<O>
-
- Type Parameters:
O- Object type
- All Implemented Interfaces:
elki.index.Index,elki.index.KNNIndex<O>
@Reference(authors="W. Dong, C. Moses, K. Li", title="Efficient k-nearest neighbor graph construction for generic similarity measures", booktitle="Proc. 20th Int. Conf. on World Wide Web (WWW\'11)", url="https://doi.org/10.1145/1963405.1963487", bibkey="DBLP:conf/www/DongCL11") public class NNDescent<O> extends AbstractMaterializeKNNPreprocessor<O>NN-descent (also known as KNNGraph) is an approximate nearest neighbor search algorithm beginning with a random sample, then iteratively refining this sample until.Reference:
W. Dong and C. Moses and K. Li
Efficient k-nearest neighbor graph construction for generic similarity measures
Proc. 20th Int. Conf. on World Wide Web (WWW'11)TODO: collect and log some query statistics.
- Since:
- 0.7.5
- Author:
- Evelyn Kirner
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classNNDescent.Factory<O>Index factory.
-
Field Summary
Fields Modifier and Type Field Description private doubledeltaearly termination parameterprivate intiterationsmaximum number of iterationsprivate static elki.logging.LoggingLOGLoggerprivate booleannoInitialNeighborsDo not use initial neighborsprivate java.lang.StringprefixLog prefix.private doublerhosample rateprivate elki.utilities.random.RandomFactoryrndRandom generatorprivate elki.database.datastore.WritableDataStore<elki.database.ids.KNNHeap>storestore for neighbors-
Fields inherited from class elki.index.preprocessed.knn.AbstractMaterializeKNNPreprocessor
distance, distanceQuery, k, relation, storage
-
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private booleanadd(elki.database.ids.DBIDRef cur, elki.database.ids.DBIDRef cand, double distance)Add cand to cur's heap neighbors with distanceprivate voidaddpair(elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> newNeighbors, elki.database.ids.DBIDRef o1, elki.database.ids.DBIDRef o2)private voidboundSize(elki.database.ids.HashSetModifiableDBIDs set, int items)Bound the size of a set by random sampling.private voidclearAll(elki.database.ids.DBIDs ids, elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> sets)Clear (but reuse) all sets in the given storage.protected elki.logging.LogginggetLogger()Get the classes static logger.elki.database.query.knn.KNNSearcher<O>kNNByObject(elki.database.query.distance.DistanceQuery<O> distanceQuery, int maxk, int flags)protected voidpreprocess()Perform the preprocessing step.private intprocessNewNeighbors(elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> flag, elki.database.ids.HashSetModifiableDBIDs newFwd, elki.database.ids.HashSetModifiableDBIDs oldFwd, elki.database.ids.HashSetModifiableDBIDs newRev, elki.database.ids.HashSetModifiableDBIDs oldRev)Process new neighbors.private voidreverse(elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> sampleNewHash, elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> newReverseNeighbors, elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> oldReverseNeighbors)calculates new and old neighbors for databaseprivate intsampleNew(elki.database.ids.DBIDs ids, elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> sampleNewNeighbors, elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> newNeighborHash, int items)samples newNeighbors for every object-
Methods inherited from class elki.index.preprocessed.knn.AbstractMaterializeKNNPreprocessor
createStorage, get, getDistanceQuery, getK, initialize, kNNByDBID
-
-
-
-
Field Detail
-
LOG
private static final elki.logging.Logging LOG
Logger
-
prefix
private java.lang.String prefix
Log prefix.
-
rnd
private final elki.utilities.random.RandomFactory rnd
Random generator
-
delta
private double delta
early termination parameter
-
rho
private double rho
sample rate
-
iterations
private int iterations
maximum number of iterations
-
noInitialNeighbors
private boolean noInitialNeighbors
Do not use initial neighbors
-
store
private elki.database.datastore.WritableDataStore<elki.database.ids.KNNHeap> store
store for neighbors
-
-
Constructor Detail
-
NNDescent
public NNDescent(elki.database.relation.Relation<O> relation, elki.distance.Distance<? super O> distance, int k, elki.utilities.random.RandomFactory rnd, double delta, double rho, boolean noInitialNeighbors, int iterations)
Constructor.- Parameters:
relation- Relation to indexdistance- distance functionk- krnd- Random generatordelta- Delta thresholdrho- Rho thresholdnoInitialNeighbors- Do not use initial neighborsiterations- Maximum number of iterations
-
-
Method Detail
-
preprocess
protected void preprocess()
Description copied from class:AbstractMaterializeKNNPreprocessorPerform the preprocessing step.- Specified by:
preprocessin classAbstractMaterializeKNNPreprocessor<O>
-
clearAll
private void clearAll(elki.database.ids.DBIDs ids, elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> sets)Clear (but reuse) all sets in the given storage.- Parameters:
ids- Ids to processsets- Sets to clear
-
boundSize
private void boundSize(elki.database.ids.HashSetModifiableDBIDs set, int items)Bound the size of a set by random sampling.- Parameters:
set- Set to processitems- Maximum size
-
processNewNeighbors
private int processNewNeighbors(elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> flag, elki.database.ids.HashSetModifiableDBIDs newFwd, elki.database.ids.HashSetModifiableDBIDs oldFwd, elki.database.ids.HashSetModifiableDBIDs newRev, elki.database.ids.HashSetModifiableDBIDs oldRev)Process new neighbors. This is a complex join, because we do not need to join old neighbors with old neighbors, and we have forward- and reverse neighbors each.- Parameters:
flag- Flags to mark new neighbors.newFwd- New forward neighborsoldFwd- Old forward neighborsnewRev- New reverse neighborsoldRev- Old reverse neighbors- Returns:
- Number of new neighbors
-
add
private boolean add(elki.database.ids.DBIDRef cur, elki.database.ids.DBIDRef cand, double distance)Add cand to cur's heap neighbors with distance- Parameters:
cur- Current objectcand- Neighbor candidatedistance- Distance- Returns:
trueif it was a new neighbor.
-
addpair
private void addpair(elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> newNeighbors, elki.database.ids.DBIDRef o1, elki.database.ids.DBIDRef o2)
-
sampleNew
private int sampleNew(elki.database.ids.DBIDs ids, elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> sampleNewNeighbors, elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> newNeighborHash, int items)samples newNeighbors for every object- Parameters:
ids- All idssampleNewNeighbors- Output of sampled new neighborsnewNeighborHash- - new neighbors for every objectitems- Number of items to collect- Returns:
- Number of new neighbors
-
reverse
private void reverse(elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> sampleNewHash, elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> newReverseNeighbors, elki.database.datastore.WritableDataStore<elki.database.ids.HashSetModifiableDBIDs> oldReverseNeighbors)calculates new and old neighbors for database- Parameters:
sampleNewHash- new neighbors for every objectnewReverseNeighbors- new reverse neighborsoldReverseNeighbors- old reverse neighbors
-
getLogger
protected elki.logging.Logging getLogger()
Description copied from class:AbstractMaterializeKNNPreprocessorGet the classes static logger.- Specified by:
getLoggerin classAbstractMaterializeKNNPreprocessor<O>- Returns:
- Logger
-
kNNByObject
public elki.database.query.knn.KNNSearcher<O> kNNByObject(elki.database.query.distance.DistanceQuery<O> distanceQuery, int maxk, int flags)
- Specified by:
kNNByObjectin interfaceelki.index.KNNIndex<O>- Overrides:
kNNByObjectin classAbstractMaterializeKNNPreprocessor<O>
-
-