案例分析
假設(shè)你有一個(gè)博客耸三,其中包含了很多不錯(cuò)的文章。 你把廣告放在每篇文章的頂部浇揩,希望獲得一些收入仪壮。 過(guò)了一段時(shí)間,從你的報(bào)告胳徽,你看到一些職位產(chǎn)生的收入积锅,有些則沒(méi)有爽彤。 假設(shè)一篇文章是否能產(chǎn)生收益,取決于文章中有多少圖片和文字段落缚陷。
給下面的數(shù)據(jù)集:
我們可以將它們繪制在下圖中适篙。
K-Nearest Neighbors(KNN)算法是如何工作的?
當(dāng)寫(xiě)新文章時(shí)箫爷,我們沒(méi)有來(lái)自報(bào)告的數(shù)據(jù)嚷节。 如果我們想知道新文章是否可以產(chǎn)生收益,我們可以1)計(jì)算新文章與現(xiàn)有文章中每篇文章之間的距離虎锚,2)按照降序排列距離硫痰,3)以k的多數(shù)表決。 這是KNN的基本思想窜护。
現(xiàn)在讓我們來(lái)猜測(cè)一篇新的文章碍论,其中包含13張圖片和1段,可以賺錢(qián)或不賺錢(qián)柄慰。 通過(guò)將圖中的這一點(diǎn)可視化鳍悠,我們可以猜測(cè)它會(huì)獲利。 但是我們會(huì)用Java來(lái)做坐搔。
Java解決
Weka也提供了“IBk”類(lèi)藏研。 IBk實(shí)現(xiàn)kNN。 它使用所有屬性的歸一化距離概行,以便不同比例的屬性對(duì)距離函數(shù)具有相同的影響蠢挡。 如果有距離關(guān)系,它可能會(huì)返回超過(guò)k個(gè)鄰居凳忙。 鄰居被投票形成最后的分類(lèi)业踏。
首先通過(guò)創(chuàng)建一個(gè)txt文件“ads.txt”來(lái)準(zhǔn)備你的數(shù)據(jù):
@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
···