You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by av...@apache.org on 2018/01/17 10:16:41 UTC

[10/11] ignite git commit: IGNITE-7203 Java 8 by default

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/clustering/DatasetWithObviousStructure.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/DatasetWithObviousStructure.java b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/DatasetWithObviousStructure.java
new file mode 100644
index 0000000..5cd0e09
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/DatasetWithObviousStructure.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.clustering;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.VectorUtils;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
+
+/**
+ * See KMeansDistributedClustererTestSingleNode#testClusterizationOnDatasetWithObviousStructure.
+ */
+class DatasetWithObviousStructure {
+    /** */
+    private final Random rnd = new Random(123456L);
+
+    /** Let centers be in the vertices of square. */
+    private final Map<Integer, Vector> centers = new HashMap<>();
+
+    /** Square side length. */
+    private final int squareSideLen;
+
+    /** */
+    DatasetWithObviousStructure(int squareSideLen) {
+        this.squareSideLen = squareSideLen;
+        centers.put(100, new DenseLocalOnHeapVector(new double[] {0.0, 0.0}));
+        centers.put(900, new DenseLocalOnHeapVector(new double[] {squareSideLen, 0.0}));
+        centers.put(3000, new DenseLocalOnHeapVector(new double[] {0.0, squareSideLen}));
+        centers.put(6000, new DenseLocalOnHeapVector(new double[] {squareSideLen, squareSideLen}));
+    }
+
+    /** */
+    List<Vector> generate(Matrix points) {
+        int ptsCnt = points.rowSize();
+
+        // Mass centers of dataset.
+        List<Vector> massCenters = new ArrayList<>();
+
+        int centersCnt = centers.size();
+
+        List<Integer> permutation = IntStream.range(0, ptsCnt).boxed().collect(Collectors.toList());
+        Collections.shuffle(permutation, rnd);
+
+        Vector[] mc = new Vector[centersCnt];
+        Arrays.fill(mc, VectorUtils.zeroes(2));
+
+        int totalCnt = 0;
+
+        int centIdx = 0;
+        massCenters.clear();
+
+        for (Integer count : centers.keySet()) {
+            for (int i = 0; i < count; i++) {
+                Vector pnt = getPoint(count);
+
+                mc[centIdx] = mc[centIdx].plus(pnt);
+
+                points.assignRow(permutation.get(totalCnt), pnt);
+
+                totalCnt++;
+            }
+            massCenters.add(mc[centIdx].times(1 / (double)count));
+            centIdx++;
+        }
+
+        return massCenters;
+    }
+
+    /** */
+    Map<Integer, Vector> centers() {
+        return centers;
+    }
+
+    /** */
+    private Vector getPoint(Integer cnt) {
+        Vector pnt = new DenseLocalOnHeapVector(2).assign(centers.get(cnt));
+        // Perturbate point on random value.
+        pnt.map(val -> val + rnd.nextDouble() * squareSideLen / 100);
+        return pnt;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/clustering/FuzzyCMeansExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/FuzzyCMeansExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/FuzzyCMeansExample.java
new file mode 100644
index 0000000..23aeed7
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/FuzzyCMeansExample.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.clustering;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ExampleNodeStartup;
+import org.apache.ignite.ml.clustering.BaseFuzzyCMeansClusterer;
+import org.apache.ignite.ml.clustering.FuzzyCMeansDistributedClusterer;
+import org.apache.ignite.ml.clustering.FuzzyCMeansModel;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.distances.DistanceMeasure;
+import org.apache.ignite.ml.math.distances.EuclideanDistance;
+import org.apache.ignite.ml.math.impls.matrix.SparseDistributedMatrix;
+import org.apache.ignite.thread.IgniteThread;
+
+/**
+ * <p>
+ * This example shows how to use {@link FuzzyCMeansDistributedClusterer}.</p>
+ * <p>
+ * Remote nodes should always be started with special configuration file which
+ * enables P2P class loading: {@code 'ignite.{sh|bat} examples/config/example-ignite.xml'}.</p>
+ * <p>
+ * Alternatively you can run {@link ExampleNodeStartup} in another JVM which will start node
+ * with {@code examples/config/example-ignite.xml} configuration.</p>
+ */
+public final class FuzzyCMeansExample {
+    /**
+     * Executes example.
+     *
+     * @param args Command line arguments, none required.
+     */
+    public static void main(String[] args) throws InterruptedException {
+        System.out.println(">>> Fuzzy C-Means usage example started.");
+
+        // Start ignite grid.
+        try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
+            System.out.println(">>> Ignite grid started.");
+
+            // Start new Ignite thread.
+            IgniteThread igniteThread = new IgniteThread(ignite.configuration().getIgniteInstanceName(),
+                FuzzyCMeansExample.class.getSimpleName(),
+                () -> {
+                    // Distance measure that computes distance between two points.
+                    DistanceMeasure distanceMeasure = new EuclideanDistance();
+
+                    // "Fuzziness" - specific constant that is used in membership calculation (1.0+-eps ~ K-Means).
+                    double exponentialWeight = 2.0;
+
+                    // Condition that indicated when algorithm must stop.
+                    // In this example algorithm stops if memberships have changed insignificantly.
+                    BaseFuzzyCMeansClusterer.StopCondition stopCond =
+                        BaseFuzzyCMeansClusterer.StopCondition.STABLE_MEMBERSHIPS;
+
+                    // Maximum difference between new and old membership values with which algorithm will continue to work.
+                    double maxDelta = 0.01;
+
+                    // The maximum number of FCM iterations.
+                    int maxIterations = 50;
+
+                    // Value that is used to initialize random numbers generator. You can choose it randomly.
+                    Long seed = null;
+
+                    // Number of steps of primary centers selection (more steps more candidates).
+                    int initializationSteps = 2;
+
+                    // Number of K-Means iteration that is used to choose required number of primary centers from candidates.
+                    int kMeansMaxIterations = 50;
+
+                    // Create new distributed clusterer with parameters described above.
+                    System.out.println(">>> Create new Distributed Fuzzy C-Means clusterer.");
+                    FuzzyCMeansDistributedClusterer clusterer = new FuzzyCMeansDistributedClusterer(
+                        distanceMeasure, exponentialWeight, stopCond, maxDelta, maxIterations,
+                        seed, initializationSteps, kMeansMaxIterations);
+
+                    // Create sample data.
+                    double[][] points = new double[][] {
+                        {-10, -10}, {-9, -11}, {-10, -9}, {-11, -9},
+                        {10, 10}, {9, 11}, {10, 9}, {11, 9},
+                        {-10, 10}, {-9, 11}, {-10, 9}, {-11, 9},
+                        {10, -10}, {9, -11}, {10, -9}, {11, -9}};
+
+                    // Initialize matrix of data points. Each row contains one point.
+                    int rows = points.length;
+                    int cols = points[0].length;
+
+                    System.out.println(">>> Create the matrix that contains sample points.");
+                    SparseDistributedMatrix pntMatrix = new SparseDistributedMatrix(rows, cols,
+                        StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+
+                    // Store points into matrix.
+                    pntMatrix.assign(points);
+
+                    // Call clusterization method with some number of centers.
+                    // It returns model that can predict results for new points.
+                    System.out.println(">>> Perform clusterization.");
+                    int numCenters = 4;
+                    FuzzyCMeansModel mdl = clusterer.cluster(pntMatrix, numCenters);
+
+                    // You can also get centers of clusters that is computed by Fuzzy C-Means algorithm.
+                    Vector[] centers = mdl.centers();
+
+                    String res = ">>> Results:\n"
+                        + ">>> 1st center: " + centers[0].get(0) + " " + centers[0].get(1) + "\n"
+                        + ">>> 2nd center: " + centers[1].get(0) + " " + centers[1].get(1) + "\n"
+                        + ">>> 3rd center: " + centers[2].get(0) + " " + centers[2].get(1) + "\n"
+                        + ">>> 4th center: " + centers[3].get(0) + " " + centers[3].get(1) + "\n";
+
+                    System.out.println(res);
+
+                    pntMatrix.destroy();
+                });
+
+            igniteThread.start();
+            igniteThread.join();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/clustering/FuzzyCMeansLocalExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/FuzzyCMeansLocalExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/FuzzyCMeansLocalExample.java
new file mode 100644
index 0000000..5c1753a
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/FuzzyCMeansLocalExample.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.clustering;
+
+import org.apache.ignite.ml.clustering.BaseFuzzyCMeansClusterer;
+import org.apache.ignite.ml.clustering.FuzzyCMeansLocalClusterer;
+import org.apache.ignite.ml.clustering.FuzzyCMeansModel;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.distances.DistanceMeasure;
+import org.apache.ignite.ml.math.distances.EuclideanDistance;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+
+/**
+ * This example shows how to use {@link FuzzyCMeansLocalClusterer}.
+ */
+public final class FuzzyCMeansLocalExample {
+    /**
+     * Executes example.
+     *
+     * @param args Command line arguments, none required.
+     */
+    public static void main(String[] args) {
+        System.out.println(">>> Local Fuzzy C-Means usage example started.");
+
+        // Distance measure that computes distance between two points.
+        DistanceMeasure distanceMeasure = new EuclideanDistance();
+
+        // "Fuzziness" - specific constant that is used in membership calculation (1.0+-eps ~ K-Means).
+        double exponentialWeight = 2.0;
+
+        // Condition that indicated when algorithm must stop.
+        // In this example algorithm stops if memberships have changed insignificantly.
+        BaseFuzzyCMeansClusterer.StopCondition stopCond =
+            BaseFuzzyCMeansClusterer.StopCondition.STABLE_MEMBERSHIPS;
+
+        // Maximum difference between new and old membership values with which algorithm will continue to work.
+        double maxDelta = 0.01;
+
+        // The maximum number of FCM iterations.
+        int maxIterations = 50;
+
+        // Value that is used to initialize random numbers generator. You can choose it randomly.
+        Long seed = null;
+
+        // Create new distributed clusterer with parameters described above.
+        System.out.println(">>> Create new Local Fuzzy C-Means clusterer.");
+        FuzzyCMeansLocalClusterer clusterer = new FuzzyCMeansLocalClusterer(distanceMeasure,
+            exponentialWeight, stopCond,
+            maxDelta, maxIterations, seed);
+
+        // Create sample data.
+        double[][] points = new double[][] {
+            {-10, -10}, {-9, -11}, {-10, -9}, {-11, -9},
+            {10, 10}, {9, 11}, {10, 9}, {11, 9},
+            {-10, 10}, {-9, 11}, {-10, 9}, {-11, 9},
+            {10, -10}, {9, -11}, {10, -9}, {11, -9}};
+
+        // Initialize matrix of data points. Each row contains one point.
+        System.out.println(">>> Create the matrix that contains sample points.");
+        // Store points into matrix.
+        DenseLocalOnHeapMatrix pntMatrix = new DenseLocalOnHeapMatrix(points);
+
+        // Call clusterization method with some number of centers.
+        // It returns model that can predict results for new points.
+        System.out.println(">>> Perform clusterization.");
+        int numCenters = 4;
+        FuzzyCMeansModel mdl = clusterer.cluster(pntMatrix, numCenters);
+
+        // You can also get centers of clusters that is computed by Fuzzy C-Means algorithm.
+        Vector[] centers = mdl.centers();
+
+        String res = ">>> Results:\n"
+            + ">>> 1st center: " + centers[0].get(0) + " " + centers[0].get(1) + "\n"
+            + ">>> 2nd center: " + centers[1].get(0) + " " + centers[1].get(1) + "\n"
+            + ">>> 3rd center: " + centers[2].get(0) + " " + centers[2].get(1) + "\n"
+            + ">>> 4th center: " + centers[3].get(0) + " " + centers[3].get(1) + "\n";
+
+        System.out.println(res);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansDistributedClustererExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansDistributedClustererExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansDistributedClustererExample.java
new file mode 100644
index 0000000..f8709e6
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansDistributedClustererExample.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.clustering;
+
+import java.util.Arrays;
+import java.util.List;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ExampleNodeStartup;
+import org.apache.ignite.examples.ml.math.matrix.SparseDistributedMatrixExample;
+import org.apache.ignite.ml.clustering.KMeansDistributedClusterer;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.Tracer;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.distances.EuclideanDistance;
+import org.apache.ignite.ml.math.impls.matrix.SparseDistributedMatrix;
+import org.apache.ignite.thread.IgniteThread;
+
+/**
+ * <p>
+ * Example of using {@link KMeansDistributedClusterer}.</p>
+ * <p>
+ * Note that in this example we cannot guarantee order in which nodes return results of intermediate
+ * computations and therefore algorithm can return different results.</p>
+ * <p>
+ * Remote nodes should always be started with special configuration file which
+ * enables P2P class loading: {@code 'ignite.{sh|bat} examples/config/example-ignite.xml'}.</p>
+ * <p>
+ * Alternatively you can run {@link ExampleNodeStartup} in another JVM which will start node
+ * with {@code examples/config/example-ignite.xml} configuration.</p>
+ */
+public class KMeansDistributedClustererExample {
+    /**
+     * Executes example.
+     *
+     * @param args Command line arguments, none required.
+     */
+    public static void main(String[] args) throws InterruptedException {
+        // IMPL NOTE based on KMeansDistributedClustererTestSingleNode#testClusterizationOnDatasetWithObviousStructure
+        System.out.println(">>> K-means distributed clusterer example started.");
+
+        // Start ignite grid.
+        try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
+            System.out.println(">>> Ignite grid started.");
+
+            // Create IgniteThread, we must work with SparseDistributedMatrix inside IgniteThread
+            // because we create ignite cache internally.
+            IgniteThread igniteThread = new IgniteThread(ignite.configuration().getIgniteInstanceName(),
+                SparseDistributedMatrixExample.class.getSimpleName(), () -> {
+
+                int ptsCnt = 10000;
+
+                SparseDistributedMatrix points = new SparseDistributedMatrix(ptsCnt, 2,
+                    StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+
+                DatasetWithObviousStructure dataset = new DatasetWithObviousStructure(10000);
+
+                List<Vector> massCenters = dataset.generate(points);
+
+                EuclideanDistance dist = new EuclideanDistance();
+
+                KMeansDistributedClusterer clusterer = new KMeansDistributedClusterer(dist, 3, 100, 1L);
+
+                Vector[] resCenters = clusterer.cluster(points, 4).centers();
+
+                System.out.println("Mass centers:");
+                massCenters.forEach(Tracer::showAscii);
+
+                System.out.println("Cluster centers:");
+                Arrays.asList(resCenters).forEach(Tracer::showAscii);
+
+                points.destroy();
+
+                System.out.println("\n>>> K-means distributed clusterer example completed.");
+            });
+
+            igniteThread.start();
+
+            igniteThread.join();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansLocalClustererExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansLocalClustererExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansLocalClustererExample.java
new file mode 100644
index 0000000..28ca9d9
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/KMeansLocalClustererExample.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.clustering;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import org.apache.ignite.ml.clustering.KMeansLocalClusterer;
+import org.apache.ignite.ml.clustering.KMeansModel;
+import org.apache.ignite.ml.math.Tracer;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.distances.DistanceMeasure;
+import org.apache.ignite.ml.math.distances.EuclideanDistance;
+import org.apache.ignite.ml.math.functions.Functions;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+
+/**
+ * Example of using {@link KMeansLocalClusterer}.
+ */
+public class KMeansLocalClustererExample {
+    /**
+     * Executes example.
+     *
+     * @param args Command line arguments, none required.
+     */
+    public static void main(String[] args) {
+        // IMPL NOTE based on KMeansDistributedClustererTestSingleNode#testClusterizationOnDatasetWithObviousStructure
+        System.out.println(">>> K-means local clusterer example started.");
+
+        int ptsCnt = 10000;
+        DenseLocalOnHeapMatrix points = new DenseLocalOnHeapMatrix(ptsCnt, 2);
+
+        DatasetWithObviousStructure dataset = new DatasetWithObviousStructure(10000);
+
+        List<Vector> massCenters = dataset.generate(points);
+
+        EuclideanDistance dist = new EuclideanDistance();
+        OrderedNodesComparator comp = new OrderedNodesComparator(
+            dataset.centers().values().toArray(new Vector[] {}), dist);
+
+        massCenters.sort(comp);
+
+        KMeansLocalClusterer clusterer = new KMeansLocalClusterer(dist, 100, 1L);
+
+        KMeansModel mdl = clusterer.cluster(points, 4);
+        Vector[] resCenters = mdl.centers();
+        Arrays.sort(resCenters, comp);
+
+        System.out.println("Mass centers:");
+        massCenters.forEach(Tracer::showAscii);
+
+        System.out.println("Cluster centers:");
+        Arrays.asList(resCenters).forEach(Tracer::showAscii);
+
+        System.out.println("\n>>> K-means local clusterer example completed.");
+    }
+
+    /** */
+    private static class OrderedNodesComparator implements Comparator<Vector> {
+        /** */
+        private final DistanceMeasure measure;
+
+        /** */
+        List<Vector> orderedNodes;
+
+        /** */
+        OrderedNodesComparator(Vector[] orderedNodes, DistanceMeasure measure) {
+            this.orderedNodes = Arrays.asList(orderedNodes);
+            this.measure = measure;
+        }
+
+        /** */
+        private int findClosestNodeIndex(Vector v) {
+            return Functions.argmin(orderedNodes, v1 -> measure.compute(v1, v)).get1();
+        }
+
+        /** */
+        @Override public int compare(Vector v1, Vector v2) {
+            int ind1 = findClosestNodeIndex(v1);
+            int ind2 = findClosestNodeIndex(v2);
+
+            int signum = (int)Math.signum(ind1 - ind2);
+
+            if (signum != 0)
+                return signum;
+
+            return (int)Math.signum(orderedNodes.get(ind1).minus(v1).kNorm(2) -
+                orderedNodes.get(ind2).minus(v2).kNorm(2));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/clustering/package-info.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/clustering/package-info.java b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/package-info.java
new file mode 100644
index 0000000..872aa16
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/clustering/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * <!-- Package description. -->
+ * ML clustering examples.
+ */
+package org.apache.ignite.examples.ml.clustering;

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/knn/classification/KNNClassificationExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/classification/KNNClassificationExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/knn/classification/KNNClassificationExample.java
new file mode 100644
index 0000000..0e1a52f
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/classification/KNNClassificationExample.java
@@ -0,0 +1,155 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.knn.classification;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ExampleNodeStartup;
+import org.apache.ignite.ml.knn.models.KNNModel;
+import org.apache.ignite.ml.knn.models.KNNStrategy;
+import org.apache.ignite.ml.math.distances.EuclideanDistance;
+import org.apache.ignite.ml.structures.LabeledDataset;
+import org.apache.ignite.ml.structures.LabeledDatasetTestTrainPair;
+import org.apache.ignite.ml.structures.preprocessing.LabeledDatasetLoader;
+import org.apache.ignite.ml.structures.preprocessing.LabellingMachine;
+import org.apache.ignite.thread.IgniteThread;
+
+/**
+ * <p>
+ * Example of using {@link KNNModel} with iris dataset.</p>
+ * <p>
+ * Note that in this example we cannot guarantee order in which nodes return results of intermediate
+ * computations and therefore algorithm can return different results.</p>
+ * <p>
+ * Remote nodes should always be started with special configuration file which
+ * enables P2P class loading: {@code 'ignite.{sh|bat} examples/config/example-ignite.xml'}.</p>
+ * <p>
+ * Alternatively you can run {@link ExampleNodeStartup} in another JVM which will start node
+ * with {@code examples/config/example-ignite.xml} configuration.</p>
+ */
+public class KNNClassificationExample {
+    /** Separator. */
+    private static final String SEPARATOR = "\t";
+
+    /** Path to the Iris dataset. */
+    private static final String KNN_IRIS_TXT = "../datasets/iris.txt";
+
+    /**
+     * Executes example.
+     *
+     * @param args Command line arguments, none required.
+     */
+    public static void main(String[] args) throws InterruptedException {
+        System.out.println(">>> kNN classification example started.");
+        // Start ignite grid.
+        try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
+            System.out.println(">>> Ignite grid started.");
+
+            IgniteThread igniteThread = new IgniteThread(ignite.configuration().getIgniteInstanceName(),
+                KNNClassificationExample.class.getSimpleName(), () -> {
+
+                try {
+                    // Prepare path to read
+                    URL url = KNNClassificationExample.class.getResource(KNN_IRIS_TXT);
+                    if (url == null)
+                        throw new RuntimeException("Can't get URL for: " + KNN_IRIS_TXT);
+
+                    Path path = Paths.get(url.toURI());
+
+                    // Read dataset from file
+                    LabeledDataset dataset = LabeledDatasetLoader.loadFromTxtFile(path, SEPARATOR, true, false);
+
+                    // Random splitting of iris data as 70% train and 30% test datasets
+                    LabeledDatasetTestTrainPair split = new LabeledDatasetTestTrainPair(dataset, 0.3);
+
+                    System.out.println("\n>>> Amount of observations in train dataset " + split.train().rowSize());
+                    System.out.println("\n>>> Amount of observations in test dataset " + split.test().rowSize());
+
+                    LabeledDataset test = split.test();
+                    LabeledDataset train = split.train();
+
+                    KNNModel knnMdl = new KNNModel(5, new EuclideanDistance(), KNNStrategy.SIMPLE, train);
+
+                    // Clone labels
+                    final double[] labels = test.labels();
+
+                    // Save predicted classes to test dataset
+                    LabellingMachine.assignLabels(test, knnMdl);
+
+                    // Calculate amount of errors on test dataset
+                    int amountOfErrors = 0;
+                    for (int i = 0; i < test.rowSize(); i++) {
+                        if (test.label(i) != labels[i])
+                            amountOfErrors++;
+                    }
+
+                    System.out.println("\n>>> Absolute amount of errors " + amountOfErrors);
+                    System.out.println("\n>>> Accuracy " + amountOfErrors / (double)test.rowSize());
+
+                    // Build confusion matrix. See https://en.wikipedia.org/wiki/Confusion_matrix
+                    int[][] confusionMtx = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
+                    for (int i = 0; i < test.rowSize(); i++) {
+                        int idx1 = (int)test.label(i);
+                        int idx2 = (int)labels[i];
+                        confusionMtx[idx1 - 1][idx2 - 1]++;
+                    }
+                    System.out.println("\n>>> Confusion matrix is " + Arrays.deepToString(confusionMtx));
+
+                    // Calculate precision, recall and F-metric for each class
+                    for (int i = 0; i < 3; i++) {
+                        double precision = 0.0;
+                        for (int j = 0; j < 3; j++)
+                            precision += confusionMtx[i][j];
+                        precision = confusionMtx[i][i] / precision;
+
+                        double clsLb = (double)(i + 1);
+
+                        System.out.println("\n>>> Precision for class " + clsLb + " is " + precision);
+
+                        double recall = 0.0;
+                        for (int j = 0; j < 3; j++)
+                            recall += confusionMtx[j][i];
+                        recall = confusionMtx[i][i] / recall;
+                        System.out.println("\n>>> Recall for class " + clsLb + " is " + recall);
+
+                        double fScore = 2 * precision * recall / (precision + recall);
+                        System.out.println("\n>>> F-score for class " + clsLb + " is " + fScore);
+                    }
+
+                }
+                catch (URISyntaxException | IOException e) {
+                    e.printStackTrace();
+                    System.out.println("\n>>> Unexpected exception, check resources: " + e);
+                }
+                finally {
+                    System.out.println("\n>>> kNN classification example completed.");
+                }
+
+            });
+
+            igniteThread.start();
+            igniteThread.join();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/knn/classification/package-info.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/classification/package-info.java b/examples/src/main/java/org/apache/ignite/examples/ml/knn/classification/package-info.java
new file mode 100644
index 0000000..d853f0d
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/classification/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * <!-- Package description. -->
+ * kNN classification examples.
+ */
+package org.apache.ignite.examples.ml.knn.classification;

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/knn/datasets/README.md
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/datasets/README.md b/examples/src/main/java/org/apache/ignite/examples/ml/knn/datasets/README.md
new file mode 100644
index 0000000..2f9c5ec
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/datasets/README.md
@@ -0,0 +1,2 @@
+iris.txt and cleared_machines are from Lichman, M. (2013). UCI Machine Learning Repository [http://archive.ics.uci.edu/ml]. Irvine, CA: University of California, School of Information and Computer Science.
+Read more about machine dataset http://archive.ics.uci.edu/ml/machine-learning-databases/cpu-performance/machine.names
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/knn/datasets/cleared_machines.txt
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/datasets/cleared_machines.txt b/examples/src/main/java/org/apache/ignite/examples/ml/knn/datasets/cleared_machines.txt
new file mode 100644
index 0000000..cf8b6b0
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/datasets/cleared_machines.txt
@@ -0,0 +1,209 @@
+199,125,256,6000,256,16,128
+253,29,8000,32000,32,8,32
+253,29,8000,32000,32,8,32
+253,29,8000,32000,32,8,32
+132,29,8000,16000,32,8,16
+290,26,8000,32000,64,8,32
+381,23,16000,32000,64,16,32
+381,23,16000,32000,64,16,32
+749,23,16000,64000,64,16,32
+1238,23,32000,64000,128,32,64
+23,400,1000,3000,0,1,2
+24,400,512,3500,4,1,6
+70,60,2000,8000,65,1,8
+117,50,4000,16000,65,1,8
+15,350,64,64,0,1,4
+64,200,512,16000,0,4,32
+23,167,524,2000,8,4,15
+29,143,512,5000,0,7,32
+22,143,1000,2000,0,5,16
+124,110,5000,5000,142,8,64
+35,143,1500,6300,0,5,32
+39,143,3100,6200,0,5,20
+40,143,2300,6200,0,6,64
+45,110,3100,6200,0,6,64
+28,320,128,6000,0,1,12
+21,320,512,2000,4,1,3
+28,320,256,6000,0,1,6
+22,320,256,3000,4,1,3
+28,320,512,5000,4,1,5
+27,320,256,5000,4,1,6
+102,25,1310,2620,131,12,24
+102,25,1310,2620,131,12,24
+74,50,2620,10480,30,12,24
+74,50,2620,10480,30,12,24
+138,56,5240,20970,30,12,24
+136,64,5240,20970,30,12,24
+23,50,500,2000,8,1,4
+29,50,1000,4000,8,1,5
+44,50,2000,8000,8,1,5
+30,50,1000,4000,8,3,5
+41,50,1000,8000,8,3,5
+74,50,2000,16000,8,3,5
+74,50,2000,16000,8,3,6
+74,50,2000,16000,8,3,6
+54,133,1000,12000,9,3,12
+41,133,1000,8000,9,3,12
+18,810,512,512,8,1,1
+28,810,1000,5000,0,1,1
+36,320,512,8000,4,1,5
+38,200,512,8000,8,1,8
+34,700,384,8000,0,1,1
+19,700,256,2000,0,1,1
+72,140,1000,16000,16,1,3
+36,200,1000,8000,0,1,2
+30,110,1000,4000,16,1,2
+56,110,1000,12000,16,1,2
+42,220,1000,8000,16,1,2
+34,800,256,8000,0,1,4
+34,800,256,8000,0,1,4
+34,800,256,8000,0,1,4
+34,800,256,8000,0,1,4
+34,800,256,8000,0,1,4
+19,125,512,1000,0,8,20
+75,75,2000,8000,64,1,38
+113,75,2000,16000,64,1,38
+157,75,2000,16000,128,1,38
+18,90,256,1000,0,3,10
+20,105,256,2000,0,3,10
+28,105,1000,4000,0,3,24
+33,105,2000,4000,8,3,19
+47,75,2000,8000,8,3,24
+54,75,3000,8000,8,3,48
+20,175,256,2000,0,3,24
+23,300,768,3000,0,6,24
+25,300,768,3000,6,6,24
+52,300,768,12000,6,6,24
+27,300,768,4500,0,1,24
+50,300,384,12000,6,1,24
+18,300,192,768,6,6,24
+53,180,768,12000,6,1,31
+23,330,1000,3000,0,2,4
+30,300,1000,4000,8,3,64
+73,300,1000,16000,8,2,112
+20,330,1000,2000,0,1,2
+25,330,1000,4000,0,3,6
+28,140,2000,4000,0,3,6
+29,140,2000,4000,0,4,8
+32,140,2000,4000,8,1,20
+175,140,2000,32000,32,1,20
+57,140,2000,8000,32,1,54
+181,140,2000,32000,32,1,54
+181,140,2000,32000,32,1,54
+32,140,2000,4000,8,1,20
+82,57,4000,16000,1,6,12
+171,57,4000,24000,64,12,16
+361,26,16000,32000,64,16,24
+350,26,16000,32000,64,8,24
+220,26,8000,32000,0,8,24
+113,26,8000,16000,0,8,16
+15,480,96,512,0,1,1
+21,203,1000,2000,0,1,5
+35,115,512,6000,16,1,6
+18,1100,512,1500,0,1,1
+20,1100,768,2000,0,1,1
+20,600,768,2000,0,1,1
+28,400,2000,4000,0,1,1
+45,400,4000,8000,0,1,1
+18,900,1000,1000,0,1,2
+17,900,512,1000,0,1,2
+26,900,1000,4000,4,1,2
+28,900,1000,4000,8,1,2
+28,900,2000,4000,0,3,6
+31,225,2000,4000,8,3,6
+31,225,2000,4000,8,3,6
+42,180,2000,8000,8,1,6
+76,185,2000,16000,16,1,6
+76,180,2000,16000,16,1,6
+26,225,1000,4000,2,3,6
+59,25,2000,12000,8,1,4
+65,25,2000,12000,16,3,5
+101,17,4000,16000,8,6,12
+116,17,4000,16000,32,6,12
+18,1500,768,1000,0,0,0
+20,1500,768,2000,0,0,0
+20,800,768,2000,0,0,0
+30,50,2000,4000,0,3,6
+44,50,2000,8000,8,3,6
+44,50,2000,8000,8,1,6
+82,50,2000,16000,24,1,6
+82,50,2000,16000,24,1,6
+128,50,8000,16000,48,1,10
+37,100,1000,8000,0,2,6
+46,100,1000,8000,24,2,6
+46,100,1000,8000,24,3,6
+80,50,2000,16000,12,3,16
+88,50,2000,16000,24,6,16
+88,50,2000,16000,24,6,16
+33,150,512,4000,0,8,128
+46,115,2000,8000,16,1,3
+29,115,2000,4000,2,1,5
+53,92,2000,8000,32,1,6
+53,92,2000,8000,32,1,6
+41,92,2000,8000,4,1,6
+86,75,4000,16000,16,1,6
+95,60,4000,16000,32,1,6
+107,60,2000,16000,64,5,8
+117,60,4000,16000,64,5,8
+119,50,4000,16000,64,5,10
+120,72,4000,16000,64,8,16
+48,72,2000,8000,16,6,8
+126,40,8000,16000,32,8,16
+266,40,8000,32000,64,8,24
+270,35,8000,32000,64,8,24
+426,38,16000,32000,128,16,32
+151,48,4000,24000,32,8,24
+267,38,8000,32000,64,8,24
+603,30,16000,32000,256,16,24
+19,112,1000,1000,0,1,4
+21,84,1000,2000,0,1,6
+26,56,1000,4000,0,1,6
+35,56,2000,6000,0,1,8
+41,56,2000,8000,0,1,8
+47,56,4000,8000,0,1,8
+62,56,4000,12000,0,1,8
+78,56,4000,16000,0,1,8
+80,38,4000,8000,32,16,32
+80,38,4000,8000,32,16,32
+142,38,8000,16000,64,4,8
+281,38,8000,24000,160,4,8
+190,38,4000,16000,128,16,32
+21,200,1000,2000,0,1,2
+25,200,1000,4000,0,1,4
+67,200,2000,8000,64,1,5
+24,250,512,4000,0,1,7
+24,250,512,4000,0,4,7
+64,250,1000,16000,1,1,8
+25,160,512,4000,2,1,5
+20,160,512,2000,2,3,8
+29,160,1000,4000,8,1,14
+43,160,1000,8000,16,1,14
+53,160,2000,8000,32,1,13
+19,240,512,1000,8,1,3
+22,240,512,2000,8,1,5
+31,105,2000,4000,8,3,8
+41,105,2000,6000,16,6,16
+47,105,2000,8000,16,4,14
+99,52,4000,16000,32,4,12
+67,70,4000,12000,8,6,8
+81,59,4000,12000,32,6,12
+149,59,8000,16000,64,12,24
+183,26,8000,24000,32,8,16
+275,26,8000,32000,64,12,16
+382,26,8000,32000,128,24,32
+56,116,2000,8000,32,5,28
+182,50,2000,32000,24,6,26
+227,50,2000,32000,48,26,52
+341,50,2000,32000,112,52,104
+360,50,4000,32000,112,52,104
+919,30,8000,64000,96,12,176
+978,30,8000,64000,128,12,176
+24,180,262,4000,0,1,3
+24,180,512,4000,0,1,3
+24,180,262,4000,0,1,3
+24,180,512,4000,0,1,3
+37,124,1000,8000,0,1,8
+50,98,1000,8000,32,2,8
+41,125,2000,8000,0,2,14
+47,480,512,8000,32,0,0
+25,480,1000,4000,0,0,0

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/knn/datasets/iris.txt
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/datasets/iris.txt b/examples/src/main/java/org/apache/ignite/examples/ml/knn/datasets/iris.txt
new file mode 100644
index 0000000..18f5f7c
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/datasets/iris.txt
@@ -0,0 +1,150 @@
+1.0	5.1	3.5	1.4	0.2
+1.0	4.9	3.0	1.4	0.2
+1.0	4.7	3.2	1.3	0.2
+1.0	4.6	3.1	1.5	0.2
+1.0	5.0	3.6	1.4	0.2
+1.0	5.4	3.9	1.7	0.4
+1.0	4.6	3.4	1.4	0.3
+1.0	5.0	3.4	1.5	0.2
+1.0	4.4	2.9	1.4	0.2
+1.0	4.9	3.1	1.5	0.1
+1.0	5.4	3.7	1.5	0.2
+1.0	4.8	3.4	1.6	0.2
+1.0	4.8	3.0	1.4	0.1
+1.0	4.3	3.0	1.1	0.1
+1.0	5.8	4.0	1.2	0.2
+1.0	5.7	4.4	1.5	0.4
+1.0	5.4	3.9	1.3	0.4
+1.0	5.1	3.5	1.4	0.3
+1.0	5.7	3.8	1.7	0.3
+1.0	5.1	3.8	1.5	0.3
+1.0	5.4	3.4	1.7	0.2
+1.0	5.1	3.7	1.5	0.4
+1.0	4.6	3.6	1.0	0.2
+1.0	5.1	3.3	1.7	0.5
+1.0	4.8	3.4	1.9	0.2
+1.0	5.0	3.0	1.6	0.2
+1.0	5.0	3.4	1.6	0.4
+1.0	5.2	3.5	1.5	0.2
+1.0	5.2	3.4	1.4	0.2
+1.0	4.7	3.2	1.6	0.2
+1.0	4.8	3.1	1.6	0.2
+1.0	5.4	3.4	1.5	0.4
+1.0	5.2	4.1	1.5	0.1
+1.0	5.5	4.2	1.4	0.2
+1.0	4.9	3.1	1.5	0.1
+1.0	5.0	3.2	1.2	0.2
+1.0	5.5	3.5	1.3	0.2
+1.0	4.9	3.1	1.5	0.1
+1.0	4.4	3.0	1.3	0.2
+1.0	5.1	3.4	1.5	0.2
+1.0	5.0	3.5	1.3	0.3
+1.0	4.5	2.3	1.3	0.3
+1.0	4.4	3.2	1.3	0.2
+1.0	5.0	3.5	1.6	0.6
+1.0	5.1	3.8	1.9	0.4
+1.0	4.8	3.0	1.4	0.3
+1.0	5.1	3.8	1.6	0.2
+1.0	4.6	3.2	1.4	0.2
+1.0	5.3	3.7	1.5	0.2
+1.0	5.0	3.3	1.4	0.2
+2.0	7.0	3.2	4.7	1.4
+2.0	6.4	3.2	4.5	1.5
+2.0	6.9	3.1	4.9	1.5
+2.0	5.5	2.3	4.0	1.3
+2.0	6.5	2.8	4.6	1.5
+2.0	5.7	2.8	4.5	1.3
+2.0	6.3	3.3	4.7	1.6
+2.0	4.9	2.4	3.3	1.0
+2.0	6.6	2.9	4.6	1.3
+2.0	5.2	2.7	3.9	1.4
+2.0	5.0	2.0	3.5	1.0
+2.0	5.9	3.0	4.2	1.5
+2.0	6.0	2.2	4.0	1.0
+2.0	6.1	2.9	4.7	1.4
+2.0	5.6	2.9	3.6	1.3
+2.0	6.7	3.1	4.4	1.4
+2.0	5.6	3.0	4.5	1.5
+2.0	5.8	2.7	4.1	1.0
+2.0	6.2	2.2	4.5	1.5
+2.0	5.6	2.5	3.9	1.1
+2.0	5.9	3.2	4.8	1.8
+2.0	6.1	2.8	4.0	1.3
+2.0	6.3	2.5	4.9	1.5
+2.0	6.1	2.8	4.7	1.2
+2.0	6.4	2.9	4.3	1.3
+2.0	6.6	3.0	4.4	1.4
+2.0	6.8	2.8	4.8	1.4
+2.0	6.7	3.0	5.0	1.7
+2.0	6.0	2.9	4.5	1.5
+2.0	5.7	2.6	3.5	1.0
+2.0	5.5	2.4	3.8	1.1
+2.0	5.5	2.4	3.7	1.0
+2.0	5.8	2.7	3.9	1.2
+2.0	6.0	2.7	5.1	1.6
+2.0	5.4	3.0	4.5	1.5
+2.0	6.0	3.4	4.5	1.6
+2.0	6.7	3.1	4.7	1.5
+2.0	6.3	2.3	4.4	1.3
+2.0	5.6	3.0	4.1	1.3
+2.0	5.5	2.5	4.0	1.3
+2.0	5.5	2.6	4.4	1.2
+2.0	6.1	3.0	4.6	1.4
+2.0	5.8	2.6	4.0	1.2
+2.0	5.0	2.3	3.3	1.0
+2.0	5.6	2.7	4.2	1.3
+2.0	5.7	3.0	4.2	1.2
+2.0	5.7	2.9	4.2	1.3
+2.0	6.2	2.9	4.3	1.3
+2.0	5.1	2.5	3.0	1.1
+2.0	5.7	2.8	4.1	1.3
+3.0	6.3	3.3	6.0	2.5
+3.0	5.8	2.7	5.1	1.9
+3.0	7.1	3.0	5.9	2.1
+3.0	6.3	2.9	5.6	1.8
+3.0	6.5	3.0	5.8	2.2
+3.0	7.6	3.0	6.6	2.1
+3.0	4.9	2.5	4.5	1.7
+3.0	7.3	2.9	6.3	1.8
+3.0	6.7	2.5	5.8	1.8
+3.0	7.2	3.6	6.1	2.5
+3.0	6.5	3.2	5.1	2.0
+3.0	6.4	2.7	5.3	1.9
+3.0	6.8	3.0	5.5	2.1
+3.0	5.7	2.5	5.0	2.0
+3.0	5.8	2.8	5.1	2.4
+3.0	6.4	3.2	5.3	2.3
+3.0	6.5	3.0	5.5	1.8
+3.0	7.7	3.8	6.7	2.2
+3.0	7.7	2.6	6.9	2.3
+3.0	6.0	2.2	5.0	1.5
+3.0	6.9	3.2	5.7	2.3
+3.0	5.6	2.8	4.9	2.0
+3.0	7.7	2.8	6.7	2.0
+3.0	6.3	2.7	4.9	1.8
+3.0	6.7	3.3	5.7	2.1
+3.0	7.2	3.2	6.0	1.8
+3.0	6.2	2.8	4.8	1.8
+3.0	6.1	3.0	4.9	1.8
+3.0	6.4	2.8	5.6	2.1
+3.0	7.2	3.0	5.8	1.6
+3.0	7.4	2.8	6.1	1.9
+3.0	7.9	3.8	6.4	2.0
+3.0	6.4	2.8	5.6	2.2
+3.0	6.3	2.8	5.1	1.5
+3.0	6.1	2.6	5.6	1.4
+3.0	7.7	3.0	6.1	2.3
+3.0	6.3	3.4	5.6	2.4
+3.0	6.4	3.1	5.5	1.8
+3.0	6.0	3.0	4.8	1.8
+3.0	6.9	3.1	5.4	2.1
+3.0	6.7	3.1	5.6	2.4
+3.0	6.9	3.1	5.1	2.3
+3.0	5.8	2.7	5.1	1.9
+3.0	6.8	3.2	5.9	2.3
+3.0	6.7	3.3	5.7	2.5
+3.0	6.7	3.0	5.2	2.3
+3.0	6.3	2.5	5.0	1.9
+3.0	6.5	3.0	5.2	2.0
+3.0	6.2	3.4	5.4	2.3
+3.0	5.9	3.0	5.1	1.8

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/knn/package-info.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/package-info.java b/examples/src/main/java/org/apache/ignite/examples/ml/knn/package-info.java
new file mode 100644
index 0000000..8de4656
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * <!-- Package description. -->
+ * kNN examples.
+ */
+package org.apache.ignite.examples.ml.knn;

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/knn/regression/KNNRegressionExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/regression/KNNRegressionExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/knn/regression/KNNRegressionExample.java
new file mode 100644
index 0000000..b52613a
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/regression/KNNRegressionExample.java
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.knn.regression;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.examples.ExampleNodeStartup;
+import org.apache.ignite.examples.ml.knn.classification.KNNClassificationExample;
+import org.apache.ignite.ml.knn.models.KNNStrategy;
+import org.apache.ignite.ml.knn.regression.KNNMultipleLinearRegression;
+import org.apache.ignite.ml.math.distances.ManhattanDistance;
+import org.apache.ignite.ml.structures.LabeledDataset;
+import org.apache.ignite.ml.structures.LabeledDatasetTestTrainPair;
+import org.apache.ignite.ml.structures.preprocessing.LabeledDatasetLoader;
+import org.apache.ignite.ml.structures.preprocessing.LabellingMachine;
+import org.apache.ignite.ml.structures.preprocessing.Normalizer;
+import org.apache.ignite.thread.IgniteThread;
+
+/**
+ * <p>
+ * Example of using {@link KNNMultipleLinearRegression} with iris dataset.</p>
+ * <p>
+ * Note that in this example we cannot guarantee order in which nodes return results of intermediate
+ * computations and therefore algorithm can return different results.</p>
+ * <p>
+ * Remote nodes should always be started with special configuration file which
+ * enables P2P class loading: {@code 'ignite.{sh|bat} examples/config/example-ignite.xml'}.</p>
+ * <p>
+ * Alternatively you can run {@link ExampleNodeStartup} in another JVM which will start node
+ * with {@code examples/config/example-ignite.xml} configuration.</p>
+ */
+public class KNNRegressionExample {
+    /** Separator. */
+    private static final String SEPARATOR = ",";
+
+    /** */
+    private static final String KNN_CLEARED_MACHINES_TXT = "../datasets/cleared_machines.txt";
+
+    /**
+     * Executes example.
+     *
+     * @param args Command line arguments, none required.
+     */
+    public static void main(String[] args) throws InterruptedException {
+        System.out.println(">>> kNN regression example started.");
+        // Start ignite grid.
+        try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
+            System.out.println(">>> Ignite grid started.");
+
+            IgniteThread igniteThread = new IgniteThread(ignite.configuration().getIgniteInstanceName(),
+                KNNRegressionExample.class.getSimpleName(), () -> {
+
+                try {
+                    // Prepare path to read
+                    URL url = KNNClassificationExample.class.getResource(KNN_CLEARED_MACHINES_TXT);
+                    if (url == null)
+                        throw new RuntimeException("Can't get URL for: " + KNN_CLEARED_MACHINES_TXT);
+
+                    Path path = Paths.get(url.toURI());
+
+                    // Read dataset from file
+                    LabeledDataset dataset = LabeledDatasetLoader.loadFromTxtFile(path, SEPARATOR, false, false);
+
+                    // Normalize dataset
+                    Normalizer.normalizeWithMiniMax(dataset);
+
+                    // Random splitting of iris data as 80% train and 20% test datasets
+                    LabeledDatasetTestTrainPair split = new LabeledDatasetTestTrainPair(dataset, 0.2);
+
+                    System.out.println("\n>>> Amount of observations in train dataset: " + split.train().rowSize());
+                    System.out.println("\n>>> Amount of observations in test dataset: " + split.test().rowSize());
+
+                    LabeledDataset test = split.test();
+                    LabeledDataset train = split.train();
+
+                    // Builds weighted kNN-regression with Manhattan Distance
+                    KNNMultipleLinearRegression knnMdl = new KNNMultipleLinearRegression(7, new ManhattanDistance(),
+                        KNNStrategy.WEIGHTED, train);
+
+                    // Clone labels
+                    final double[] labels = test.labels();
+
+                    // Save predicted classes to test dataset
+                    LabellingMachine.assignLabels(test, knnMdl);
+
+                    // Calculate mean squared error (MSE)
+                    double mse = 0.0;
+
+                    for (int i = 0; i < test.rowSize(); i++)
+                        mse += Math.pow(test.label(i) - labels[i], 2.0);
+                    mse = mse / test.rowSize();
+
+                    System.out.println("\n>>> Mean squared error (MSE) " + mse);
+
+                    // Calculate mean absolute error (MAE)
+                    double mae = 0.0;
+
+                    for (int i = 0; i < test.rowSize(); i++)
+                        mae += Math.abs(test.label(i) - labels[i]);
+                    mae = mae / test.rowSize();
+
+                    System.out.println("\n>>> Mean absolute error (MAE) " + mae);
+
+                    // Calculate R^2 as 1 - RSS/TSS
+                    double avg = 0.0;
+
+                    for (int i = 0; i < test.rowSize(); i++)
+                        avg += test.label(i);
+
+                    avg = avg / test.rowSize();
+
+                    double detCf = 0.0;
+                    double tss = 0.0;
+
+                    for (int i = 0; i < test.rowSize(); i++) {
+                        detCf += Math.pow(test.label(i) - labels[i], 2.0);
+                        tss += Math.pow(test.label(i) - avg, 2.0);
+                    }
+
+                    detCf = 1 - detCf / tss;
+
+                    System.out.println("\n>>> R^2 " + detCf);
+                }
+                catch (URISyntaxException | IOException e) {
+                    e.printStackTrace();
+                    System.out.println("\n>>> Unexpected exception, check resources: " + e);
+                }
+                finally {
+                    System.out.println("\n>>> kNN regression example completed.");
+                }
+            });
+
+            igniteThread.start();
+            igniteThread.join();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/knn/regression/package-info.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/knn/regression/package-info.java b/examples/src/main/java/org/apache/ignite/examples/ml/knn/regression/package-info.java
new file mode 100644
index 0000000..e7ac336
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/knn/regression/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * <!-- Package description. -->
+ * kNN regression examples.
+ */
+package org.apache.ignite.examples.ml.knn.regression;

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/CholeskyDecompositionExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/CholeskyDecompositionExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/CholeskyDecompositionExample.java
new file mode 100644
index 0000000..ebac2b1
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/CholeskyDecompositionExample.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Tracer;
+import org.apache.ignite.ml.math.decompositions.CholeskyDecomposition;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+
+/**
+ * Example of using {@link CholeskyDecomposition}.
+ */
+public class CholeskyDecompositionExample {
+    /**
+     * Executes example.
+     *
+     * @param args Command line arguments, none required.
+     */
+    public static void main(String[] args) {
+        System.out.println(">>> Cholesky decomposition example started.");
+        // Let's compute a Cholesky decomposition of Hermitian matrix m:
+        // m = l l^{*}, where
+        // l is a lower triangular matrix
+        // l^{*} is its conjugate transpose
+
+        DenseLocalOnHeapMatrix m = new DenseLocalOnHeapMatrix(new double[][] {
+            {2.0d, -1.0d, 0.0d},
+            {-1.0d, 2.0d, -1.0d},
+            {0.0d, -1.0d, 2.0d}
+        });
+        System.out.println("\n>>> Matrix m for decomposition: ");
+        Tracer.showAscii(m);
+
+        // This decomposition is useful when dealing with systems of linear equations of the form
+        // m x = b where m is a Hermitian matrix.
+        // For such systems Cholesky decomposition provides
+        // more effective method of solving compared to LU decomposition.
+        // Suppose we want to solve system
+        // m x = b for various bs. Then after we computed Cholesky decomposition, we can feed various bs
+        // as a matrix of the form
+        // (b1, b2, ..., bm)
+        // to the method Cholesky::solve which returns solutions in the form
+        // (sol1, sol2, ..., solm)
+        CholeskyDecomposition dec = new CholeskyDecomposition(m);
+        System.out.println("\n>>> Made decomposition m = l * l^{*}.");
+        System.out.println(">>> Matrix l is ");
+        Tracer.showAscii(dec.getL());
+        System.out.println(">>> Matrix l^{*} is ");
+        Tracer.showAscii(dec.getLT());
+
+        Matrix bs = new DenseLocalOnHeapMatrix(new double[][] {
+            {4.0, -6.0, 7.0},
+            {1.0, 1.0, 1.0}
+        }).transpose();
+        System.out.println("\n>>> Solving systems of linear equations of the form m x = b for various bs represented by columns of matrix");
+        Tracer.showAscii(bs);
+        Matrix sol = dec.solve(bs);
+
+        System.out.println("\n>>> List of solutions: ");
+        for (int i = 0; i < sol.columnSize(); i++)
+            Tracer.showAscii(sol.viewColumn(i));
+
+        System.out.println("\n>>> Cholesky decomposition example completed.");
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/EigenDecompositionExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/EigenDecompositionExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/EigenDecompositionExample.java
new file mode 100644
index 0000000..cda37f4
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/EigenDecompositionExample.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Tracer;
+import org.apache.ignite.ml.math.decompositions.EigenDecomposition;
+import org.apache.ignite.ml.math.functions.Functions;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+
+/**
+ * Example of using {@link EigenDecomposition}.
+ */
+public class EigenDecompositionExample {
+    /**
+     * Executes example.
+     *
+     * @param args Command line arguments, none required.
+     */
+    public static void main(String[] args) {
+        System.out.println(">>> Eigen decomposition example started.");
+
+        // Let's compute EigenDecomposition for some square (n x n) matrix m with real eigenvalues:
+        // m = v d v^{-1}, where d is diagonal matrix having eigenvalues of m on diagonal
+        // and v is matrix where i-th column is eigenvector for i-th eigenvalue (i from 0 to n - 1)
+        DenseLocalOnHeapMatrix m = new DenseLocalOnHeapMatrix(new double[][] {
+            {1.0d, 0.0d, 0.0d, 0.0d},
+            {0.0d, 1.0d, 0.0d, 0.0d},
+            {0.0d, 0.0d, 2.0d, 0.0d},
+            {1.0d, 1.0d, 0.0d, 2.0d}
+        });
+        System.out.println("\n>>> Matrix m for decomposition: ");
+        Tracer.showAscii(m);
+
+        EigenDecomposition dec = new EigenDecomposition(m);
+        System.out.println("\n>>> Made decomposition.");
+        System.out.println(">>> Matrix getV is ");
+        Tracer.showAscii(dec.getV());
+        System.out.println(">>> Matrix getD is ");
+        Tracer.showAscii(dec.getD());
+
+        // From this decomposition we, for example, can easily compute determinant of matrix m
+        // det (m) = det (v d v^{-1}) =
+        // det(v) det (d) det(v^{-1}) =
+        // det(v) det(v)^{-1} det(d) =
+        // det (d) =
+        // product of diagonal elements of d =
+        // product of eigenvalues
+        double det = dec.getRealEigenValues().foldMap(Functions.MULT, Functions.IDENTITY, 1.0);
+        System.out.println("\n>>> Determinant is " + det);
+
+        System.out.println("\n>>> Eigen decomposition example completed.");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/LUDecompositionExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/LUDecompositionExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/LUDecompositionExample.java
new file mode 100644
index 0000000..a815047
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/LUDecompositionExample.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Tracer;
+import org.apache.ignite.ml.math.decompositions.LUDecomposition;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+
+/**
+ * Example of using {@link LUDecomposition}.
+ */
+public class LUDecompositionExample {
+    /**
+     * Executes example.
+     *
+     * @param args Command line arguments, none required.
+     */
+    public static void main(String[] args) {
+        System.out.println(">>> LU decomposition example started.");
+        // Let's compute a LU decomposition for some (n x n) matrix m:
+        // m = p l u, where
+        // p is an (n x n) is a row-permutation matrix
+        // l is a (n x n) lower triangular matrix
+        // u is a (n x n) upper triangular matrix
+
+        DenseLocalOnHeapMatrix m = new DenseLocalOnHeapMatrix(new double[][] {
+            {1.0d, 1.0d, -1.0d},
+            {1.0d, -2.0d, 3.0d},
+            {2.0d, 3.0d, 1.0d}
+        });
+        System.out.println("\n>>> Matrix m for decomposition: ");
+        Tracer.showAscii(m);
+
+        // This decomposition is useful when dealing with systems of linear equations.
+        // (see https://en.wikipedia.org/wiki/LU_decomposition)
+        // suppose we want to solve system
+        // m x = b for various bs. Then after we computed LU decomposition, we can feed various bs
+        // as a matrix of the form
+        // (b1, b2, ..., bm)
+        // to the method LUDecomposition::solve which returns solutions in the form
+        // (sol1, sol2, ..., solm)
+
+        LUDecomposition dec = new LUDecomposition(m);
+        System.out.println("\n>>> Made decomposition.");
+        System.out.println(">>> Matrix getL is ");
+        Tracer.showAscii(dec.getL());
+        System.out.println(">>> Matrix getU is ");
+        Tracer.showAscii(dec.getU());
+        System.out.println(">>> Matrix getP is ");
+        Tracer.showAscii(dec.getP());
+
+        Matrix bs = new DenseLocalOnHeapMatrix(new double[][] {
+            {4.0, -6.0, 7.0},
+            {1.0, 1.0, 1.0}
+        });
+        System.out.println("\n>>> Matrix to solve: ");
+        Tracer.showAscii(bs);
+
+        Matrix sol = dec.solve(bs.transpose());
+
+        System.out.println("\n>>> List of solutions: ");
+        for (int i = 0; i < sol.columnSize(); i++)
+            Tracer.showAscii(sol.viewColumn(i));
+
+        System.out.println("\n>>> LU decomposition example completed.");
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/QRDecompositionExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/QRDecompositionExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/QRDecompositionExample.java
new file mode 100644
index 0000000..bed99d1
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/QRDecompositionExample.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Tracer;
+import org.apache.ignite.ml.math.decompositions.QRDecomposition;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+
+/**
+ * Example of using {@link QRDecomposition}.
+ */
+public class QRDecompositionExample {
+    /**
+     * Executes example.
+     *
+     * @param args Command line arguments, none required.
+     */
+    public static void main(String[] args) {
+        System.out.println(">>> QR decomposition example started.");
+        Matrix m = new DenseLocalOnHeapMatrix(new double[][] {
+            {2.0d, -1.0d, 0.0d},
+            {-1.0d, 2.0d, -1.0d},
+            {0.0d, -1.0d, 2.0d}
+        });
+
+        System.out.println("\n>>> Input matrix:");
+        Tracer.showAscii(m);
+
+        QRDecomposition dec = new QRDecomposition(m);
+        System.out.println("\n>>> Value for full rank in decomposition: [" + dec.hasFullRank() + "].");
+
+        Matrix q = dec.getQ();
+        Matrix r = dec.getR();
+
+        System.out.println("\n>>> Orthogonal matrix Q:");
+        Tracer.showAscii(q);
+        System.out.println("\n>>> Upper triangular matrix R:");
+        Tracer.showAscii(r);
+
+        Matrix qSafeCp = safeCopy(q);
+
+        Matrix identity = qSafeCp.times(qSafeCp.transpose());
+
+        System.out.println("\n>>> Identity matrix obtained from Q:");
+        Tracer.showAscii(identity);
+
+        Matrix recomposed = qSafeCp.times(r);
+
+        System.out.println("\n>>> Recomposed input matrix:");
+        Tracer.showAscii(recomposed);
+
+        Matrix sol = dec.solve(new DenseLocalOnHeapMatrix(3, 10));
+
+        System.out.println("\n>>> Solved matrix:");
+        Tracer.showAscii(sol);
+
+        dec.destroy();
+
+        System.out.println("\n>>> QR decomposition example completed.");
+    }
+
+    /** */
+    private static Matrix safeCopy(Matrix orig) {
+        return new DenseLocalOnHeapMatrix(orig.rowSize(), orig.columnSize()).assign(orig);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/SingularValueDecompositionExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/SingularValueDecompositionExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/SingularValueDecompositionExample.java
new file mode 100644
index 0000000..81406ae
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/SingularValueDecompositionExample.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Tracer;
+import org.apache.ignite.ml.math.decompositions.SingularValueDecomposition;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+
+/**
+ * Example of using {@link SingularValueDecomposition}.
+ */
+public class SingularValueDecompositionExample {
+    /**
+     * Executes example.
+     *
+     * @param args Command line arguments, none required.
+     */
+    public static void main(String[] args) {
+        System.out.println(">>> Singular value decomposition (SVD) example started.");
+
+        // Let's compute a SVD of (l x k) matrix m. This decomposition can be thought as extension of EigenDecomposition to
+        // rectangular matrices. The factorization we get is following:
+        // m = u * s * v^{*}, where
+        // u is a real or complex unitary matrix
+        // s is a rectangular diagonal matrix with non-negative real numbers on diagonal (this numbers are singular values of m)
+        // v is a real or complex unitary matrix
+        // If m is real then u and v are also real.
+        // Complex case is not supported for the moment.
+        DenseLocalOnHeapMatrix m = new DenseLocalOnHeapMatrix(new double[][] {
+            {1.0d, 0.0d, 0.0d, 0.0d, 2.0d},
+            {0.0d, 0.0d, 3.0d, 0.0d, 0.0d},
+            {0.0d, 0.0d, 0.0d, 0.0d, 0.0d},
+            {0.0d, 2.0d, 0.0d, 0.0d, 0.0d}
+        });
+        System.out.println("\n>>> Matrix m for decomposition: ");
+        Tracer.showAscii(m);
+
+        SingularValueDecomposition dec = new SingularValueDecomposition(m);
+        System.out.println("\n>>> Made decomposition m = u * s * v^{*}.");
+        System.out.println(">>> Matrix u is ");
+        Tracer.showAscii(dec.getU());
+        System.out.println(">>> Matrix s is ");
+        Tracer.showAscii(dec.getS());
+        System.out.println(">>> Matrix v is ");
+        Tracer.showAscii(dec.getV());
+
+        // This decomposition can in particular help with solving problem of finding x minimizing 2-norm of m x such
+        // that 2-norm of x is 1. It appears that it is the right singular vector corresponding to minimal singular
+        // value, which is always last.
+        System.out.println("\n>>> Vector x minimizing 2-norm of m x such that 2 norm of x is 1: ");
+        Tracer.showAscii(dec.getV().viewColumn(dec.getSingularValues().length - 1));
+
+        System.out.println("\n>>> Singular value decomposition (SVD) example completed.");
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/package-info.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/package-info.java b/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/package-info.java
new file mode 100644
index 0000000..644f8ba
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/math/decompositions/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * <!-- Package description. -->
+ * Core algebra decomposition examples.
+ */
+package org.apache.ignite.examples.ml.math.decompositions;

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/math/matrix/CacheMatrixExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/math/matrix/CacheMatrixExample.java b/examples/src/main/java/org/apache/ignite/examples/ml/math/matrix/CacheMatrixExample.java
new file mode 100644
index 0000000..a7cbaab
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/math/matrix/CacheMatrixExample.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.math.matrix;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.examples.ml.math.vector.CacheVectorExample;
+import org.apache.ignite.ml.math.IdentityValueMapper;
+import org.apache.ignite.ml.math.Tracer;
+import org.apache.ignite.ml.math.distributed.MatrixKeyMapper;
+import org.apache.ignite.ml.math.distributed.ValueMapper;
+import org.apache.ignite.ml.math.functions.Functions;
+import org.apache.ignite.ml.math.impls.matrix.CacheMatrix;
+
+/**
+ *  Example that demonstrates how to use {@link CacheMatrix}.
+ *
+ *  Basically CacheMatrix is view over existing data in cache. So we have {@link MatrixKeyMapper} and {@link ValueMapper}
+ *  for this purpose. A {@link MatrixKeyMapper} allows us to map matrix indices to cache keys. And a {@link ValueMapper}
+ *  allows us map cache object to matrix elements - doubles.
+ *
+ *  In this example we use simple flat mapping for keys and {@link IdentityValueMapper} for cache objects
+ *  because they are Doubles.
+ *
+ *  @see CacheVectorExample
+ */
+public class CacheMatrixExample {
+    /** */ private static final String CACHE_NAME = CacheMatrixExample.class.getSimpleName();
+    /** */ private static final int ROWS = 3;
+    /** */ private static final int COLS = 3;
+
+    /**
+     * Executes example.
+     *
+     * @param args Command line arguments, none required.
+     */
+    public static void main(String[] args) {
+        try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
+            System.out.println();
+            System.out.println(">>> CacheMatrix example started.");
+
+            CacheConfiguration<Integer, Double> cfg = new CacheConfiguration<>();
+
+            cfg.setName(CACHE_NAME);
+
+            try (IgniteCache<Integer, Double> cache = ignite.getOrCreateCache(cfg)) {
+                double[][] testValues = {{1.0, 0.0, 0.0}, {1.0, 1.0, 0.0}, {1.0, 1.0, 1.0}};
+
+                ValueMapper valMapper = new IdentityValueMapper();
+
+                // Map matrix element indices to cache keys.
+                MatrixKeyMapper<Integer> keyMapper = new MatrixKeyMapper<Integer>() {
+                    @Override public Integer apply(int x, int y) {
+                        return x * COLS + y;
+                    }
+
+                    @Override public boolean isValid(Integer integer) {
+                        return integer >= 0 && integer < COLS * ROWS;
+                    }
+                };
+
+                // Create cache matrix.
+                CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(ROWS, COLS, cache, keyMapper, valMapper);
+
+                cacheMatrix.assign(testValues);
+
+                Tracer.showAscii(cacheMatrix);
+
+                // Find all positive elements.
+                Integer nonZeroes = cacheMatrix.foldMap((o, aDouble) -> {
+                    if (aDouble > 0)
+                        return o + 1;
+                    return o;
+                }, Functions.IDENTITY, 0);
+
+                System.out.println("Quantity of non zeroes elements is " + nonZeroes.intValue());
+
+                System.out.println(">>>");
+                System.out.println(">>> Finished executing Ignite \"CacheMatrix\" example.");
+                System.out.println(">>> Lower triangular matrix 3x3 have only 6 positive elements.");
+                System.out.println(">>>");
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/43a62cdb/examples/src/main/java/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java
----------------------------------------------------------------------
diff --git a/examples/src/main/java/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java b/examples/src/main/java/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java
new file mode 100644
index 0000000..542fbdc
--- /dev/null
+++ b/examples/src/main/java/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java
@@ -0,0 +1,175 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.examples.ml.math.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.impls.storage.matrix.ArrayMatrixStorage;
+import org.apache.ignite.ml.math.util.MatrixUtil;
+
+/**
+ * Example matrix storage implementation, modeled after {@link ArrayMatrixStorage}.
+ */
+class ExampleMatrixStorage implements MatrixStorage {
+    /** Backing data array. */
+    private double[][] data;
+    /** Amount of rows in a matrix storage. */
+    private int rows;
+    /** Amount of columns in a matrix storage. */
+    private int cols;
+
+    /**
+     *
+     */
+    public ExampleMatrixStorage() {
+        // No-op.
+    }
+
+    /**
+     * @param rows Amount of rows in a matrix storage.
+     * @param cols Amount of columns in a matrix storage.
+     */
+    ExampleMatrixStorage(int rows, int cols) {
+        assert rows > 0;
+        assert cols > 0;
+
+        this.data = new double[rows][cols];
+        this.rows = rows;
+        this.cols = cols;
+    }
+
+    /**
+     * @param data Backing data array.
+     */
+    ExampleMatrixStorage(double[][] data) {
+        assert data != null;
+        assert data[0] != null;
+
+        this.data = data;
+        this.rows = data.length;
+        this.cols = data[0].length;
+
+        assert rows > 0;
+        assert cols > 0;
+    }
+
+    /** {@inheritDoc} */
+    @Override public double get(int x, int y) {
+        return data[x][y];
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isSequentialAccess() {
+        return false;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isDense() {
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isRandomAccess() {
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isDistributed() {
+        return false;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void set(int x, int y, double v) {
+        data[x][y] = v;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int columnSize() {
+        return cols;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int rowSize() {
+        return rows;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int storageMode() {
+        // This value indicate that we store matrix data by rows.
+        return StorageConstants.ROW_STORAGE_MODE;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int accessMode() {
+        return StorageConstants.RANDOM_ACCESS_MODE;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isArrayBased() {
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public double[] data() {
+        return MatrixUtil.flatten(data, StorageConstants.ROW_STORAGE_MODE);
+    }
+
+    /** {@inheritDoc */
+    @Override public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeInt(rows);
+        out.writeInt(cols);
+
+        out.writeObject(data);
+    }
+
+    /** {@inheritDoc */
+    @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        rows = in.readInt();
+        cols = in.readInt();
+
+        data = (double[][])in.readObject();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int hashCode() {
+        int res = 1;
+
+        res += res * 37 + rows;
+        res += res * 37 + cols;
+        res += res * 37 + Arrays.deepHashCode(data);
+
+        return res;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean equals(Object o) {
+        if (this == o)
+            return true;
+
+        if (o == null || getClass() != o.getClass())
+            return false;
+
+        ExampleMatrixStorage that = (ExampleMatrixStorage)o;
+
+        return Arrays.deepEquals(data, that.data);
+    }
+}