/** * * @param point * @param moveClusterCenter * @return */ public PointClassification classifyPoint(Point point, boolean moveClusterCenter) { Pair<Cluster, Double> nearestCluster = nearestCluster(point); Cluster newCluster = nearestCluster.getKey(); boolean locationChange = isPointLocationChange(point, newCluster); addPointToCluster(point, newCluster, moveClusterCenter); return new PointClassification(nearestCluster.getKey(), nearestCluster.getValue(), locationChange); }
private KDNode delete(KDNode delete, int _disc) { if (delete.getLeft() != null && delete.getRight() != null) { if (delete.getParent() != null) { if (delete.getParent().getLeft() == delete) delete.getParent().setLeft(null); else delete.getParent().setRight(null); } return null; } int disc = _disc; _disc = (_disc + 1) % dims; Pair<KDNode, Integer> qd = null; if (delete.getRight() != null) { qd = min(delete.getRight(), disc, _disc); } else if (delete.getLeft() != null) qd = max(delete.getLeft(), disc, _disc); delete.point = qd.getKey().point; KDNode qFather = qd.getKey().getParent(); if (qFather.getLeft() == qd.getKey()) { qFather.setLeft(delete(qd.getKey(), disc)); } else if (qFather.getRight() == qd.getKey()) { qFather.setRight(delete(qd.getKey(), disc)); } return delete; }
INDArray arr = pair.getKey(); Nd4j.getCompressor().decompressi(arr);
private Pair<Double, INDArray> nn(KDNode node, INDArray point, HyperRect rect, double dist, INDArray best, int _disc) { if (node == null || rect.minDistance(point) > dist) return Pair.of(Double.POSITIVE_INFINITY, null); int _discNext = (_disc + 1) % dims; double dist2 = Nd4j.getExecutioner().execAndReturn(new EuclideanDistance(point)).getFinalResult().doubleValue(); if (dist2 < dist) { best = node.getPoint(); dist = dist2; } HyperRect lower = rect.getLower(node.point, _disc); HyperRect upper = rect.getUpper(node.point, _disc); if (point.getDouble(_disc) < node.point.getDouble(_disc)) { Pair<Double, INDArray> left = nn(node.getLeft(), point, lower, dist, best, _discNext); Pair<Double, INDArray> right = nn(node.getRight(), point, upper, dist, best, _discNext); if (left.getKey() < dist) return left; else if (right.getKey() < dist) return right; } else { Pair<Double, INDArray> left = nn(node.getRight(), point, upper, dist, best, _discNext); Pair<Double, INDArray> right = nn(node.getLeft(), point, lower, dist, best, _discNext); if (left.getKey() < dist) return left; else if (right.getKey() < dist) return right; } return Pair.of(dist, best); }
private Pair<KDNode, Integer> min(KDNode node, int disc, int _disc) { int discNext = (_disc + 1) % dims; if (_disc == disc) { KDNode child = node.getLeft(); if (child != null) { return min(child, disc, discNext); } } else if (node.getLeft() != null || node.getRight() != null) { Pair<KDNode, Integer> left = null, right = null; if (node.getLeft() != null) left = min(node.getLeft(), disc, discNext); if (node.getRight() != null) right = min(node.getRight(), disc, discNext); if (left != null && right != null) { double pointLeft = left.getKey().getPoint().getDouble(disc); double pointRight = right.getKey().getPoint().getDouble(disc); if (pointLeft < pointRight) return left; else return right; } else if (left != null) return left; else return right; } return Pair.of(node, _disc); }
private Pair<KDNode, Integer> max(KDNode node, int disc, int _disc) { int discNext = (_disc + 1) % dims; if (_disc == disc) { KDNode child = node.getLeft(); if (child != null) { return max(child, disc, discNext); } } else if (node.getLeft() != null || node.getRight() != null) { Pair<KDNode, Integer> left = null, right = null; if (node.getLeft() != null) left = max(node.getLeft(), disc, discNext); if (node.getRight() != null) right = max(node.getRight(), disc, discNext); if (left != null && right != null) { double pointLeft = left.getKey().getPoint().getDouble(disc); double pointRight = right.getKey().getPoint().getDouble(disc); if (pointLeft > pointRight) return left; else return right; } else if (left != null) return left; else return right; } return Pair.of(node, _disc); }