java实现k 近邻算法_k-近邻算法的简单Java版本
时间: 2024-03-08 15:49:45 浏览: 24
以下是一个简单的 Java 实现 k 近邻算法:
```java
import java.util.*;
public class KNN {
private List<Data> trainSet;
public KNN(List<Data> trainSet) {
this.trainSet = trainSet;
}
public String classify(Data testData, int k) {
List<Data> nearestNeighbors = findNearestNeighbors(testData, k);
String label = getMostFrequentLabel(nearestNeighbors);
return label;
}
private List<Data> findNearestNeighbors(Data testData, int k) {
PriorityQueue<Data> pq = new PriorityQueue<>(k, new Comparator<Data>() {
@Override
public int compare(Data d1, Data d2) {
return Double.compare(d2.distance, d1.distance);
}
});
for (Data trainData : trainSet) {
double distance = getDistance(testData, trainData);
trainData.distance = distance;
if (pq.size() < k) {
pq.offer(trainData);
} else {
Data top = pq.peek();
if (distance < top.distance) {
pq.poll();
pq.offer(trainData);
}
}
}
List<Data> result = new ArrayList<>();
while (!pq.isEmpty()) {
result.add(pq.poll());
}
return result;
}
private String getMostFrequentLabel(List<Data> nearestNeighbors) {
Map<String, Integer> countMap = new HashMap<>();
for (Data data : nearestNeighbors) {
String label = data.label;
countMap.put(label, countMap.getOrDefault(label, 0) + 1);
}
String label = null;
int maxCount = 0;
for (Map.Entry<String, Integer> entry : countMap.entrySet()) {
if (entry.getValue() > maxCount) {
label = entry.getKey();
maxCount = entry.getValue();
}
}
return label;
}
private double getDistance(Data d1, Data d2) {
double sum = 0.0;
for (int i = 0; i < d1.features.length; i++) {
sum += Math.pow(d1.features[i] - d2.features[i], 2);
}
return Math.sqrt(sum);
}
private static class Data {
String label;
double[] features;
double distance;
public Data(String label, double[] features) {
this.label = label;
this.features = features;
}
}
}
```
使用方法:
```java
List<KNN.Data> trainSet = new ArrayList<>();
trainSet.add(new KNN.Data("A", new double[]{1, 2}));
trainSet.add(new KNN.Data("A", new double[]{2, 3}));
trainSet.add(new KNN.Data("B", new double[]{3, 4}));
trainSet.add(new KNN.Data("B", new double[]{4, 5}));
KNN knn = new KNN(trainSet);
KNN.Data testData = new KNN.Data(null, new double[]{1.5, 2.5});
String label = knn.classify(testData, 3);
System.out.println(label); // 输出 "A"
```