Java实现KNN算法简单例子
时间: 2024-10-19 18:14:04 浏览: 28
Java实现kNN算法
在Java中实现K-Nearest Neighbors (KNN) 算法通常涉及到几个步骤,这里提供一个简单的例子来说明如何使用欧氏距离计算邻居并预测类别。首先,你需要准备数据集、计算距离函数以及选择K值。
```java
import java.util.ArrayList;
import java.util.List;
// 定义一个点类,包含坐标和标签
class Point {
double[] coordinates;
int label;
public Point(double[] coordinates, int label) {
this.coordinates = coordinates;
this.label = label;
}
}
// 计算两点之间的欧氏距离
public class DistanceUtil {
public static double euclideanDistance(Point a, Point b) {
double sum = 0.0;
for (int i = 0; i < a.coordinates.length; i++) {
sum += Math.pow(a.coordinates[i] - b.coordinates[i], 2);
}
return Math.sqrt(sum);
}
}
// KNN 主类,假设已有的训练数据集
public class KNNClassifier {
private List<Point> dataset;
// 构造函数
public KNNClassifier(List<Point> data) {
this.dataset = data;
}
// 预测新点的标签
public int predict(double[] newCoordinates, int k) {
Point nearest = null;
double minDistance = Double.MAX_VALUE;
for (Point point : dataset) {
double distance = DistanceUtil.euclideanDistance(new Point(newCoordinates, 0), point); // 临时忽略label
if (distance < minDistance) {
minDistance = distance;
nearest = point;
}
}
// 找到k个最近邻
List<Point> neighbors = new ArrayList<>();
for (Point p : dataset) {
if (!p.equals(nearest)) {
neighbors.add(p);
}
if (neighbors.size() == k) {
break;
}
}
// 根据邻居的多数标签返回预测结果
int mostCommonLabel = findMostCommonLabel(neighbors);
return mostCommonLabel;
}
private int findMostCommonLabel(List<Point> neighbors) {
int count = 0, maxCount = 0;
int majorityLabel = 0;
for (Point neighbor : neighbors) {
if (neighbor.label > maxCount) {
maxCount = neighbor.label;
majorityLabel = neighbor.label;
}
}
return majorityLabel;
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
List<Point> trainData = ...; // 实际上从文件或数据库加载数据
// 创建KNN分类器实例,并进行预测
KNNClassifier knn = new KNNClassifier(trainData);
double[] testCoordinates = {1.0, 2.0}; // 示例的新点
int predictedLabel = knn.predict(testCoordinates, 3); // 选择k=3作为近邻数
System.out.println("预测标签: " + predictedLabel);
}
}
```
这个例子展示了如何使用KNN算法的基本原理,但在实际应用中,你还需要处理数据预处理、异常检查等问题。此外,为了性能考虑,可以使用优先队列或其他高效的数据结构来存储邻居。
阅读全文