3.在Java中使用K最近邻(KNN)分类器

案例分析

假设你有一个博客,其中包含了很多不错的文章。 你把广告放在每篇文章的顶部,希望获得一些收入。 过了一段时间,从你的报告,你看到一些职位产生的收入,有些则没有。 假设一篇文章是否能产生收益,取决于文章中有多少图片和文字段落。

给下面的数据集:


1737506-def8aa0104fcdea6.png
数据集

我们可以将它们绘制在下图中。

1737506-ab7b551b78104f2e.png
K近邻

K-Nearest Neighbors(KNN)算法是如何工作的?

当写新文章时,我们没有来自报告的数据。 如果我们想知道新文章是否可以产生收益,我们可以1)计算新文章与现有文章中每篇文章之间的距离,2)按照降序排列距离,3)以k的多数表决。 这是KNN的基本思想。

现在让我们来猜测一篇新的文章,其中包含13张图片和1段,可以赚钱或不赚钱。 通过将图中的这一点可视化,我们可以猜测它会获利。 但是我们会用Java来做。

Java解决

Weka也提供了“IBk”类。 IBk实现kNN。 它使用所有属性的归一化距离,以便不同比例的属性对距离函数具有相同的影响。 如果有距离关系,它可能会返回超过k个邻居。 邻居被投票形成最后的分类。

首先通过创建一个txt文件“ads.txt”来准备你的数据:

@relation ads

@attribute pictures numeric
@attribute paragraphs numeric
@attribute profit {Y, N}

@data
10,2,Y
12,3,Y
9,2,Y
0,10,N
1,9,N
3,11,N

Java Code:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
 
import weka.classifiers.Classifier;
import weka.classifiers.lazy.IBk;
import weka.core.Instance;
import weka.core.Instances;
 
public class KNN {
    public static BufferedReader readDataFile(String filename) {
        BufferedReader inputReader = null;
 
        try {
            inputReader = new BufferedReader(new FileReader(filename));
        } catch (FileNotFoundException ex) {
            System.err.println("File not found: " + filename);
        }
 
        return inputReader;
    }
 
    public static void main(String[] args) throws Exception {
        BufferedReader datafile = readDataFile("ads.txt");
 
        Instances data = new Instances(datafile);
        data.setClassIndex(data.numAttributes() - 1);
 
        //do not use first and second
        Instance first = data.instance(0);
        Instance second = data.instance(1);
        data.delete(0);
        data.delete(1);
 
        Classifier ibk = new IBk();     
        ibk.buildClassifier(data);
 
        double class1 = ibk.classifyInstance(first);
        double class2 = ibk.classifyInstance(second);
 
        System.out.println("first: " + class1 + "\nsecond: " + class2);
    }
}

输出:
···
first: 0.0
second: 1.0
···

猜你喜欢

转载自blog.csdn.net/weixin_33701564/article/details/87424584