java iris_利用K-Means聚类算法实现对iris.data.ulab
該樓層疑似違規已被系統折疊?隱藏此樓查看此樓
利用K-Means聚類算法實現對iris.data.ulabel數據的聚類,這是在網上找到如果要換成我的iris.date
iris.date.ulable請問在哪些地方改
package com.company;
import java.io.File;
import java.util.Scanner;
import java.util.Vector;
import static com.sun.org.apache.xalan.internal.lib.ExsltStrings.split;
public class Main {
public static Vector indata = new Vector<>(); //存儲從文件中讀取的原始數據
public static Vector data = new Vector<>(); //存儲經過處理后的每一個樣本的各個屬性值和所屬分類
public static Vector init_kernal = new Vector<>();//存儲每次迭代產生的聚類核心的每個屬性值的均值
public static boolean loadData(String url) {//加載測試的數據文件
try {
Scanner in = new Scanner(new File(url));//讀入文件
while (in.hasNextLine()) {
String str = in.nextLine();//將文件的每一行存到str的臨時變量中
indata.add(str);//將每一個樣本點的數據追加到Vector 中
}
return true;
} catch (Exception e) { //如果出錯返回false
return false;
}
}
public static void pretreatment(Vector indata) { //數據預處理,將原始數據中的每一個屬性值提取出來存放到Vector data中
int i = 0;
String t;
while (i < indata.size()) {//取出indata中的每一行值
double[] tem = new double[5];
t = indata.get(i);
String[] sourceStrArray = t.split(",", 5);//使用字符串分割函數提取出各屬性值
for (int j = 0; j < 4; j++) {
tem[j] = Double.parseDouble(sourceStrArray[j]);//將每一個的樣本的各屬性值類型轉換后依次存入到double[]數組中
}
tem[4] = 0;//tem的第五個值表示所屬類別,1.0表示第一類,2.0表示第二類,3.0表示第三類,初始化為0不屬于任何類
data.add(tem);//將每一個樣本加入到data中
i++;
}
}
public static Vector set_kernal(Vector data, int a, int b, int c) {//設置初始的聚類核心,a,b,c分別表示一個類的核心在data中的編號
init_kernal.add(data.get(a));
init_kernal.add(data.get(b));
init_kernal.add(data.get(c));
return init_kernal;
}
public static int choose(double[] data, double[] a, double[] b, double[] c) {//判斷一個樣本屬于哪一個類,返回值1表示第一類,2表示第二類,3表示第三類
double ta, tb, tc;
//ta,tb,tc分別表示一個樣本點到三個聚類核心的歐式距離的平方
ta = (data[0] - a[0]) * (data[0] - a[0]) + (data[1] - a[1]) * (data[1] - a[1]) + (data[2] - a[2]) * (data[2] - a[2]) + (data[3] - a[3]) * (data[3] - a[3]);
tb = (data[0] - b[0]) * (data[0] - b[0]) + (data[1] - b[1]) * (data[1] - b[1]) + (data[2] - b[2]) * (data[2] - b[2]) + (data[3] - b[3]) * (data[3] - b[3]);
tc = (data[0] - c[0]) * (data[0] - c[0]) + (data[1] - c[1]) * (data[1] - c[1]) + (data[2] - c[2]) * (data[2] - c[2]) + (data[3] - c[3]) * (data[3] - c[3]);
if (ta == Math.min(Math.min(ta, tb), tc)) //如果到第一類的距離最小返回1
return 1;
else if (tb == Math.min(Math.min(ta, tb), tc))//如果到第二類的距離最小返回2
return 2;
else if (tc == Math.min(Math.min(ta, tb), tc))//如果到第三類的距離最小返回3
return 3;
return 0;
}
public static Vector onestep(Vector data, Vector kernal) {//函數執行一次表示kmeans的一次迭代
Vector newkernal = new Vector<>();//用于存放一次迭代后新的類的核心的各屬性值
int i = 0;
double[] a = kernal.get(0); //a賦值為當前第一個類的核心
double[] b = kernal.get(1); //b賦值為當前第二類的核心
double[] c = kernal.get(2); //c賦值為當前第三類的核心
double[] temp;
while (i < data.size()) {//取出data中的每一個樣本存放在temp中
temp = data.get(i);
temp[4] = (double) choose(temp, a, b, c);//調用choose函數判斷當前樣本屬于哪一個類
i++;
}
double[] suma = {0, 0, 0, 0};
int al = 0;//表示當前第一類的樣本個數
double[] sumb = {0, 0, 0, 0};
int bl = 0;//當前第二類的樣本個數
double[] sumc = {0, 0, 0, 0};
int cl = 0;//當前第三類的樣本個數
i = 0;
while (i < data.size()) {
double[] t = data.get(i);
if (t[4] == 1.0) { //如果當前樣本屬于第一類
for (int j = 0; j < 4; j++) {
suma[j] = suma[j] + t[j];
}
al++; //該類的樣本個數加一
} else if (t[4] == 2.0) {
for (int j = 0; j < 4; j++) {
sumb[j] = sumb[j] + t[j];
}
bl++;
} else if (t[4] == 3.0) {
for (int j = 0; j < 4; j++) {
sumc[j] = sumc[j] + t[j];
}
cl++;
}
i++;//指向下一個樣本繼續循環
}
for (int j = 0; j < 4; j++) {//計算出本次迭代后的每個類的核心的坐標
suma[j] = suma[j] / al;
sumb[j] = sumb[j] / bl;
sumc[j] = sumc[j] / cl;
}
//將新的類的核心添加入到newkernal中
newkernal.add(suma);
newkernal.add(sumb);
newkernal.add(sumc);
return newkernal;//返回本次迭代后的新的類的核心
}
public static void k_means() {//k_means算法的實現
while (true) {
boolean con = true;
Vector t = onestep(data, init_kernal);//將 data和當前的init_kernal傳入onestep函數進行一次迭代,返回值為迭代后的類的核心
//判斷本次迭代后返回的類的核心是不是和迭代之前的類的核心相同,如果不相同con被設為false,繼續迭代。
for (int i = 0; i < t.size(); i++) {
for (int j = 0; j < 4; j++) {
if (t.get(i)[j] != init_kernal.get(i)[j])
con = false;
}
}
if (con)//如果con為true說明本次迭代的核心和迭代之前的核心相同,說明聚類完成,退出循環
break;
else
init_kernal = t;//如果本次迭代返回的新的核心和迭代之前的不同,則當前核心設置為返回的新的核心,繼續循環迭代
}
}
public static void show_category() {//打印出所有的樣本的屬性和所屬類別
for (int i = 0; i < data.size(); i++) {
System.out.print((i + 1) + " ");
for (int j = 0; j < 5; j++) {
System.out.print(data.get(i)[j] + " ");
}
System.out.println();
}
}
public static void main(String[] args){
Main.loadData("e:/bezdekIris.data");
pretreatment(indata);//預處理
set_kernal(data, 20, 80, 130);//設置初始核心
k_means();
show_category();
}
}
總結
以上是生活随笔為你收集整理的java iris_利用K-Means聚类算法实现对iris.data.ulab的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生炒猪肝怎么做好吃啊?
- 下一篇: 把星星摘下来是哪首歌啊?