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

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

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
···
网友评论