大数据挖掘实践
K-Means聚类算法
引言:
有n个数据D={X1,X2,…,Xn},我们想把这些数据分成K个类。这个问题的关键在于K为多大时分类是合适的,并且我们也不好选择一个好的初始点。所以我们在这里引入距离的概念(以欧式距离为例)。我们想找到K个中心,数据离哪些中心近我们就将其定义为哪一类,同时我们的K个中心能够使这个分类最合理也就是每个点到其中心的距离的和最小。提炼为:找K个中心,数据属于距离离其最近的中心一类,这K个中心能使所有数据距离其中心的距离和最小。
算法介绍:
L-Means又叫做K均值算法,是一个已知聚类类别数的划分算法。它是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标。K表示聚簇中心的个数,代表数据中存在多少数据簇。K-Means可以高效地处理大数据集,它的输入自然是数据集和类别数,聚类结果是划分为k类的k个数据集。K-Means算法类似于KNN算法,都用到了距离矢量度量。
算法框架:
(1)、设定数字k,从n个初始数据中随机的设置k个点为聚类中心点。
(2)、针对n个点的每个数据点,遍历计算到k个聚类中心点的距离,最后按照离哪个中心点最近,就划分到那个类别中。
(3)、对每个已经划分好类别的n个点,对同个类别的点求均值,作为此类别新的中心点。
(4)、循环(2),(3)直到最终中心点收敛。
(流程图)
数据描述:
训练数据集
创建一个input.txt文件,随机构造几组数据,输入到txt文件中
实践过程
代码实现:
创建主实现类:
package KMeans;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
/**
* k均值算法工具类
*
* @author wxy
*
*/
public class KMeansTool {
// 输入数据文件地址
private String filePath;
// 分类类别个数
private int classNum;
// 类名称
private ArrayList<String> classNames;
// 聚类坐标点
private ArrayList<Point> classPoints;
// 所有的数据左边点
private ArrayList<Point> totalPoints;
public KMeansTool(String filePath, int classNum) {
this.filePath = filePath;
this.classNum = classNum;
readDataFile();
}
/**
* 从文件中读取数据
*/
private void readDataFile() {
File file = new File(filePath);
ArrayList<String[]> dataArray = new ArrayList<String[]>();
try {
BufferedReader in = new BufferedReader(new FileReader(file));
String str;
String[] tempArray;
while ((str = in.readLine()) != null) {
tempArray = str.split(" ")