21xrx.com
2024-12-22 17:25:05 Sunday
登录
文章检索 我的文章 写文章
KNN算法的Java实现
2023-07-29 21:45:20 深夜i     --     --
KNN算法 Java实现 分类 距离度量 邻居搜索

KNN(K-Nearest Neighbors)算法是一种经典的机器学习算法,它是无监督学习的一种方法。KNN算法通过计算目标样本与已知样本之间的距离来进行分类或回归预测。它的基本思想是,如果一个样本的k个最近邻居中大多数属于某个类别,那么该样本也属于这个类别。

在Java中,我们可以使用KNN算法来实现分类和回归任务。首先,我们需要准备已知样本的特征和标签,并将这些数据存储在合适的数据结构中,比如二维数组或列表。然后,我们可以编写一个KNN分类器或回归器的类来实现KNN算法的主要逻辑。

下面是一个简单的KNN分类器的Java实现示例:


import java.util.*;

public class KNNClassifier {

  private List<Double[]> features;

  private List<String> labels;

  private int k;

  public KNNClassifier(List<Double[]> features, List<String> labels, int k)

    this.features = features;

    this.labels = labels;

    this.k = k;

  

  public String predict(Double[] target) {

    List<Pair<Double, Integer>> distances = new ArrayList<>();

    for (int i = 0; i < features.size(); i++) {

      Double[] feature = features.get(i);

      double distance = euclideanDistance(feature, target);

      distances.add(new Pair<>(distance, i));

    }

    distances.sort(Comparator.comparingDouble(Pair::getKey));

    Map<String, Integer> votes = new HashMap<>();

    for (int i = 0; i < k; i++) {

      int index = distances.get(i).getValue();

      String label = labels.get(index);

      votes.put(label, votes.getOrDefault(label, 0) + 1);

    }

    return Collections.max(votes.entrySet(), Map.Entry.comparingByValue()).getKey();

  }

  private double euclideanDistance(Double[] a, Double[] b) {

    double sum = 0.0;

    for (int i = 0; i < a.length; i++) {

      sum += Math.pow(a[i] - b[i], 2);

    }

    return Math.sqrt(sum);

  }

}

以上代码中,我们首先定义了一个KNNClassifier类,它包含了特征和标签的列表以及k值。构造函数用于初始化这些参数。predict方法用于预测目标样本的标签。它首先计算目标样本与已知样本之间的距离,并将距离与对应的样本索引存储在一个列表中。然后,根据距离进行排序并选择前k个最近邻居。最后,通过统计最近邻居中各个类别的出现次数,选取出现次数最多的类别作为预测结果。

这只是一个简单的KNN算法的Java实现示例,它可以帮助我们理解KNN算法的基本原理和实现过程。在实际应用中,我们可能需要考虑更多的优化和扩展,比如距离度量的选择、特征缩放、多线程处理等。然而,通过这个简单的示例,我们可以开始学习和应用KNN算法,并在Java中实现自己的KNN分类器或回归器。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复