下面是Java实现KNN算法的完整攻略:
什么是KNN算法?
KNN(K-Nearest Neighbors)算法是一种经典的机器学习算法,属于分类算法。该算法基于样本之间的距离(通常用欧式距离),将测试样本与训练样本进行相似度比较,选取距离最近的K个训练样本,通过少数服从多数的投票方式,确定测试样本的类别。
KNN算法可以用于分类和回归问题,本文仅介绍分类问题。
KNN算法实现流程
-
准备数据集:KNN算法需要数据集,其包含输入数据和输出数据。输入数据是已知类别的数据集,输出数据是待分类的数据。通常将数据集切分成训练集和测试集,其中训练集用于构建KNN模型,测试集用于评估模型的准确性。
-
特征提取:对于每个数据样本,需要将其转换成可用于计算距离的特征向量。
-
计算距离:使用欧式距离等距离度量方法,计算测试集中的每个数据样本与训练集中样本之间的距离。
-
选择K值:选择距离测试集最近的前K个训练集样本。
-
投票决策:统计前K个训练集样本中出现最多的类别,作为测试集样本的预测输出。
KNN算法Java实现示例
示例一
下面是一个简单的KNN算法Java实现示例:
// 计算欧式距离
public static double euclideanDistance(int[] a, int[] b) {
double sum = 0;
for (int i = 0; i < a.length; i++) {
sum += Math.pow(a[i] - b[i], 2);
}
return Math.sqrt(sum);
}
// 预测测试数据的类别
public static int predictCategory(int[][] trainData, int[] testData, int k) {
// 计算所有训练数据与测试数据之间的距离
Map<Double, Integer> distanceMap = new TreeMap<>();
for (int i = 0; i < trainData.length; i++) {
double distance = euclideanDistance(trainData[i], testData);
distanceMap.put(distance, trainData[i][trainData[i].length - 1]);
}
// 选择距离最近的前K个训练样本
int[] category = new int[k];
int index = 0;
for (Map.Entry<Double, Integer> entry : distanceMap.entrySet()) {
if (index == k) {
break;
}
category[index++] = entry.getValue();
}
// 统计出现次数最多的类别,并返回
int maxCategory = 0;
int maxCount = 0;
for (int i = 0; i < category.length; i++) {
int count = 0;
for (int j = 0; j < category.length; j++) {
if (category[i] == category[j]) {
count++;
}
}
if (count > maxCount) {
maxCount = count;
maxCategory = category[i];
}
}
return maxCategory;
}
public static void main(String[] args) {
// 训练集数据
int[][] trainData = {{1, 1, 1}, {2, 2, 2}, {3, 3, 1}, {4, 4, 1}, {5, 5, 2}, {6, 6, 2}};
// 测试集数据
int[] testData = {2, 3};
// 预测测试数据的类别
int k = 3;
int category = predictCategory(trainData, testData, k);
System.out.println("测试数据的类别为:" + category);
}
在该示例中,假设训练集数据有两个特征和一个类别,测试集数据有两个特征。通过计算欧式距离来比较测试集样本和训练集样本之间的相似度,并使用前K个距离最近的训练样本的类别进行投票决策,最终得到测试集样本的预测类别。
示例二
下面是一个利用KNN算法实现鸢尾花分类的Java示例代码:
public class KNN {
private static final double TRAIN_DATA_RATIO = 0.8;
private static final int K = 3;
private static final String[] CATEGORY = {"setosa", "versicolor", "virginica"};
public static void main(String[] args) throws Exception {
// 导入数据,分割训练集和测试集
Instances data = DataSource.read("iris.arff");
data.setClassIndex(data.numAttributes() - 1);
int trainSize = (int) Math.round(data.numInstances() * TRAIN_DATA_RATIO);
Instances trainData = new Instances(data, 0, trainSize);
Instances testData = new Instances(data, trainSize, data.numInstances() - trainSize);
// 构建模型,预测测试集
IBk model = new IBk(K);
model.buildClassifier(trainData);
Evaluation eval = new Evaluation(trainData);
eval.evaluateModel(model, testData);
System.out.println(eval.toSummaryString());
Instance testInstance = testData.firstInstance();
double predictedClass = model.classifyInstance(testInstance);
System.out.println("Predicted class: " + CATEGORY[(int) predictedClass]);
System.out.println("Actual class: " + CATEGORY[(int) testInstance.classValue()]);
}
}
在该示例中,利用Weka库导入鸢尾花数据集,分割出训练集数据和测试集数据。使用IBk算法构建KNN模型,并使用Evaluation类对模型进行评估。最终通过classifyInstance()方法对测试集样本进行分类预测,并与实际类别进行比较。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现的KNN算法示例 - Python技术站