1. 程式人生 > >Java實現k_means演算法進行聚類分析

Java實現k_means演算法進行聚類分析

實驗描述:

對指定資料集進行聚類分析,選擇適當的聚類演算法,編寫程式實現,提交程式和結果報告。

資料集: Iris Data Set(見附件一) ,根據花的屬性進行聚類。

資料包括四個屬性:sepal length花萼長度,sepal width花萼寬度,petal length花瓣長度,petal width花瓣寬度。其中第五個值表示該樣本屬於哪一個類。

樣本點間的距離直接用向量的歐氏距離。

實驗環境和程式語言:

本實驗使用的程式語言為:Java

程式設計環境為:Intellij idea

實現聚類的演算法為:K_means演算法

測試用例的樣本個數為:150個

樣本示例:4.9,3.0,1.4,0.2,Iris-setosa

演算法分析:

這裡只是簡單的介紹一下k-means演算法的基本思想,具體詳細的設計和數學公式讀者可以自行百度,這個資料很多。

K-means演算法的基本思想是:以空間中k個點為中心進行聚類,對最靠近他們的物件歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。

假設要把樣本集分為c個類別,演算法描述如下:

(1)適當選擇c個類的初始中心;

(2)在第k次迭代中,對任意一個樣本,求其到c箇中心的距離,將該樣本歸到距離最短的中心所在的類;

(3)利用均值等方法更新該類的中心值;

(4)對於所有的c個聚類中心,如果利用(2)(3)的迭代法更新後,值保持不變,則迭代結束,否則繼續迭代。

工程和測試資料下載地址:

程式設計實現:

函式設計與分析

1.	public static boolean loadData(String url) 
//載入測試的資料檔案
2.	public static void pretreatment(Vector<String> indata) 
//資料預處理,將原始資料中的每一個屬性值提取出來存放到Vector<double[]>  data中
3.	public static Vector<double[]> set_kernal(Vector<double[]> data, int a, int b, int c) 
//設定初始的聚類核心,a,b,c分別表示一個類的核心在data中的編號
4.	public static int choose(double[] data, double[] a, double[] b, double[] c) 
//判斷一個樣本屬於哪一個類,返回值1表示第一類,2表示第二類,3表示第三類
5.	public static Vector <double[]> onestep (Vector<double[]>data,Vector<double[]> kernal) 
//函式執行一次表示kmeans的一次迭代
6.	public static void k_means() 
//k_means演算法的實現
7.	public static void show_category() 
//打印出所有的樣本的屬性和所屬類別

程式原始碼:

原始碼實現:
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<String> indata = new Vector<>();  //儲存從檔案中讀取的原始資料
    public static Vector<double[]> data = new Vector<>();  //儲存經過處理後的每一個樣本的各個屬性值和所屬分類
    public static Vector<double[]> 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<String> indata) {   //資料預處理,將原始資料中的每一個屬性值提取出來存放到Vector<double[]>  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<double[]> set_kernal(Vector<double[]> 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<double[]> onestep(Vector<double[]> data, Vector<double[]> kernal) {//函式執行一次表示kmeans的一次迭代
        Vector<double[]> 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<double[]> 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();


    }
}




 

實驗結果分析:

根據程式執行的結果(見附件二)顯示,以及與初始測試樣本的類別進行比較發現,聚類正確結果樣本數為135,錯誤的樣本數為15,正確率為90%,可以認為聚類成功。

思考與改進:

本次實驗程式設計利用k_means演算法的時候沒有對資料進行歸一化處理,由於不同的屬性值其值域有較大的差別,因此在計算距離的時候不同屬性的權值就不一致,從而導致最後的聚類結果出現了一定的錯誤率。如果將所有的資料歸一化到[0,1.0]的區間內,所有的屬性值所佔權重就會變成一樣的,可能聚類的結果將會更加準確!

附件一:(測試資料)

5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.9,1.7,0.4,Iris-setosa
4.6,3.4,1.4,0.3,Iris-setosa
5.0,3.4,1.5,0.2,Iris-setosa
4.4,2.9,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
5.4,3.7,1.5,0.2,Iris-setosa
4.8,3.4,1.6,0.2,Iris-setosa
4.8,3.0,1.4,0.1,Iris-setosa
4.3,3.0,1.1,0.1,Iris-setosa
5.8,4.0,1.2,0.2,Iris-setosa
5.7,4.4,1.5,0.4,Iris-setosa
5.4,3.9,1.3,0.4,Iris-setosa
5.1,3.5,1.4,0.3,Iris-setosa
5.7,3.8,1.7,0.3,Iris-setosa
5.1,3.8,1.5,0.3,Iris-setosa
5.4,3.4,1.7,0.2,Iris-setosa
5.1,3.7,1.5,0.4,Iris-setosa
4.6,3.6,1.0,0.2,Iris-setosa
5.1,3.3,1.7,0.5,Iris-setosa
4.8,3.4,1.9,0.2,Iris-setosa
5.0,3.0,1.6,0.2,Iris-setosa
5.0,3.4,1.6,0.4,Iris-setosa
5.2,3.5,1.5,0.2,Iris-setosa
5.2,3.4,1.4,0.2,Iris-setosa
4.7,3.2,1.6,0.2,Iris-setosa
4.8,3.1,1.6,0.2,Iris-setosa
5.4,3.4,1.5,0.4,Iris-setosa
5.2,4.1,1.5,0.1,Iris-setosa
5.5,4.2,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.2,Iris-setosa
5.0,3.2,1.2,0.2,Iris-setosa
5.5,3.5,1.3,0.2,Iris-setosa
4.9,3.6,1.4,0.1,Iris-setosa
4.4,3.0,1.3,0.2,Iris-setosa
5.1,3.4,1.5,0.2,Iris-setosa
5.0,3.5,1.3,0.3,Iris-setosa
4.5,2.3,1.3,0.3,Iris-setosa
4.4,3.2,1.3,0.2,Iris-setosa
5.0,3.5,1.6,0.6,Iris-setosa
5.1,3.8,1.9,0.4,Iris-setosa
4.8,3.0,1.4,0.3,Iris-setosa
5.1,3.8,1.6,0.2,Iris-setosa
4.6,3.2,1.4,0.2,Iris-setosa
5.3,3.7,1.5,0.2,Iris-setosa
5.0,3.3,1.4,0.2,Iris-setosa
7.0,3.2,4.7,1.4,Iris-versicolor
6.4,3.2,4.5,1.5,Iris-versicolor
6.9,3.1,4.9,1.5,Iris-versicolor
5.5,2.3,4.0,1.3,Iris-versicolor
6.5,2.8,4.6,1.5,Iris-versicolor
5.7,2.8,4.5,1.3,Iris-versicolor
6.3,3.3,4.7,1.6,Iris-versicolor
4.9,2.4,3.3,1.0,Iris-versicolor
6.6,2.9,4.6,1.3,Iris-versicolor
5.2,2.7,3.9,1.4,Iris-versicolor
5.0,2.0,3.5,1.0,Iris-versicolor
5.9,3.0,4.2,1.5,Iris-versicolor
6.0,2.2,4.0,1.0,Iris-versicolor
6.1,2.9,4.7,1.4,Iris-versicolor
5.6,2.9,3.6,1.3,Iris-versicolor
6.7,3.1,4.4,1.4,Iris-versicolor
5.6,3.0,4.5,1.5,Iris-versicolor
5.8,2.7,4.1,1.0,Iris-versicolor
6.2,2.2,4.5,1.5,Iris-versicolor
5.6,2.5,3.9,1.1,Iris-versicolor
5.9,3.2,4.8,1.8,Iris-versicolor
6.1,2.8,4.0,1.3,Iris-versicolor
6.3,2.5,4.9,1.5,Iris-versicolor
6.1,2.8,4.7,1.2,Iris-versicolor
6.4,2.9,4.3,1.3,Iris-versicolor
6.6,3.0,4.4,1.4,Iris-versicolor
6.8,2.8,4.8,1.4,Iris-versicolor
6.7,3.0,5.0,1.7,Iris-versicolor
6.0,2.9,4.5,1.5,Iris-versicolor
5.7,2.6,3.5,1.0,Iris-versicolor
5.5,2.4,3.8,1.1,Iris-versicolor
5.5,2.4,3.7,1.0,Iris-versicolor
5.8,2.7,3.9,1.2,Iris-versicolor
6.0,2.7,5.1,1.6,Iris-versicolor
5.4,3.0,4.5,1.5,Iris-versicolor
6.0,3.4,4.5,1.6,Iris-versicolor
6.7,3.1,4.7,1.5,Iris-versicolor
6.3,2.3,4.4,1.3,Iris-versicolor
5.6,3.0,4.1,1.3,Iris-versicolor
5.5,2.5,4.0,1.3,Iris-versicolor
5.5,2.6,4.4,1.2,Iris-versicolor
6.1,3.0,4.6,1.4,Iris-versicolor
5.8,2.6,4.0,1.2,Iris-versicolor
5.0,2.3,3.3,1.0,Iris-versicolor
5.6,2.7,4.2,1.3,Iris-versicolor
5.7,3.0,4.2,1.2,Iris-versicolor
5.7,2.9,4.2,1.3,Iris-versicolor
6.2,2.9,4.3,1.3,Iris-versicolor
5.1,2.5,3.0,1.1,Iris-versicolor
5.7,2.8,4.1,1.3,Iris-versicolor
6.3,3.3,6.0,2.5,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
7.1,3.0,5.9,2.1,Iris-virginica
6.3,2.9,5.6,1.8,Iris-virginica
6.5,3.0,5.8,2.2,Iris-virginica
7.6,3.0,6.6,2.1,Iris-virginica
4.9,2.5,4.5,1.7,Iris-virginica
7.3,2.9,6.3,1.8,Iris-virginica
6.7,2.5,5.8,1.8,Iris-virginica
7.2,3.6,6.1,2.5,Iris-virginica
6.5,3.2,5.1,2.0,Iris-virginica
6.4,2.7,5.3,1.9,Iris-virginica
6.8,3.0,5.5,2.1,Iris-virginica
5.7,2.5,5.0,2.0,Iris-virginica
5.8,2.8,5.1,2.4,Iris-virginica
6.4,3.2,5.3,2.3,Iris-virginica
6.5,3.0,5.5,1.8,Iris-virginica
7.7,3.8,6.7,2.2,Iris-virginica
7.7,2.6,6.9,2.3,Iris-virginica
6.0,2.2,5.0,1.5,Iris-virginica
6.9,3.2,5.7,2.3,Iris-virginica
5.6,2.8,4.9,2.0,Iris-virginica
7.7,2.8,6.7,2.0,Iris-virginica
6.3,2.7,4.9,1.8,Iris-virginica
6.7,3.3,5.7,2.1,Iris-virginica
7.2,3.2,6.0,1.8,Iris-virginica
6.2,2.8,4.8,1.8,Iris-virginica
6.1,3.0,4.9,1.8,Iris-virginica
6.4,2.8,5.6,2.1,Iris-virginica
7.2,3.0,5.8,1.6,Iris-virginica
7.4,2.8,6.1,1.9,Iris-virginica
7.9,3.8,6.4,2.0,Iris-virginica
6.4,2.8,5.6,2.2,Iris-virginica
6.3,2.8,5.1,1.5,Iris-virginica
6.1,2.6,5.6,1.4,Iris-virginica
7.7,3.0,6.1,2.3,Iris-virginica
6.3,3.4,5.6,2.4,Iris-virginica
6.4,3.1,5.5,1.8,Iris-virginica
6.0,3.0,4.8,1.8,Iris-virginica
6.9,3.1,5.4,2.1,Iris-virginica
6.7,3.1,5.6,2.4,Iris-virginica
6.9,3.1,5.1,2.3,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
6.8,3.2,5.9,2.3,Iris-virginica
6.7,3.3,5.7,2.5,Iris-virginica
6.7,3.0,5.2,2.3,Iris-virginica
6.3,2.5,5.0,1.9,Iris-virginica
6.5,3.0,5.2,2.0,Iris-virginica
6.2,3.4,5.4,2.3,Iris-virginica
5.9,3.0,5.1,1.8,Iris-virginica

附件二:(執行結果)

類別1.0表示Iris-setosa

類別2.0表示Iris-versicolor

類別3.0表示Iris-virginica

號 屬性 屬性 屬性 屬性 類別
1  5.1  3.5  1.4  0.2  1.0  
2  4.9  3.0  1.4  0.2  1.0  
3  4.7  3.2  1.3  0.2  1.0  
4  4.6  3.1  1.5  0.2  1.0  
5  5.0  3.6  1.4  0.2  1.0  
6  5.4  3.9  1.7  0.4  1.0  
7  4.6  3.4  1.4  0.3  1.0  
8  5.0  3.4  1.5  0.2  1.0  
9  4.4  2.9  1.4  0.2  1.0  
10  4.9  3.1  1.5  0.1  1.0  
11  5.4  3.7  1.5  0.2  1.0  
12  4.8  3.4  1.6  0.2  1.0  
13  4.8  3.0  1.4  0.1  1.0  
14  4.3  3.0  1.1  0.1  1.0  
15  5.8  4.0  1.2  0.2  1.0  
16  5.7  4.4  1.5  0.4  1.0  
17  5.4  3.9  1.3  0.4  1.0  
18  5.1  3.5  1.4  0.3  1.0  
19  5.7  3.8  1.7  0.3  1.0  
20  5.1  3.8  1.5  0.3  1.0  
21  5.4  3.4  1.7  0.2  1.0  
22  5.1  3.7  1.5  0.4  1.0  
23  4.6  3.6  1.0  0.2  1.0  
24  5.1  3.3  1.7  0.5  1.0  
25  4.8  3.4  1.9  0.2  1.0  
26  5.0  3.0  1.6  0.2  1.0  
27  5.0  3.4  1.6  0.4  1.0  
28  5.2  3.5  1.5  0.2  1.0  
29  5.2  3.4  1.4  0.2  1.0  
30  4.7  3.2  1.6  0.2  1.0  
31  4.8  3.1  1.6  0.2  1.0  
32  5.4  3.4  1.5  0.4  1.0  
33  5.2  4.1  1.5  0.1  1.0  
34  5.5  4.2  1.4  0.2  1.0  
35  4.9  3.1  1.5  0.2  1.0  
36  5.0  3.2  1.2  0.2  1.0  
37  5.5  3.5  1.3  0.2  1.0  
38  4.9  3.6  1.4  0.1  1.0  
39  4.4  3.0  1.3  0.2  1.0  
40  5.1  3.4  1.5  0.2  1.0  
41  5.0  3.5  1.3  0.3  1.0  
42  4.5  2.3  1.3  0.3  1.0  
43  4.4  3.2  1.3  0.2  1.0  
44  5.0  3.5  1.6  0.6  1.0  
45  5.1  3.8  1.9  0.4  1.0  
46  4.8  3.0  1.4  0.3  1.0  
47  5.1  3.8  1.6  0.2  1.0  
48  4.6  3.2  1.4  0.2  1.0  
49  5.3  3.7  1.5  0.2  1.0  
50  5.0  3.3  1.4  0.2  1.0  
51  7.0  3.2  4.7  1.4  3.0  
52  6.4  3.2  4.5  1.5  2.0  
53  6.9  3.1  4.9  1.5  3.0  
54  5.5  2.3  4.0  1.3  2.0  
55  6.5  2.8  4.6  1.5  2.0  
56  5.7  2.8  4.5  1.3  2.0  
57  6.3  3.3  4.7  1.6  2.0  
58  4.9  2.4  3.3  1.0  2.0  
59  6.6  2.9  4.6  1.3  2.0  
60  5.2  2.7  3.9  1.4  2.0  
61  5.0  2.0  3.5  1.0  2.0  
62  5.9  3.0  4.2  1.5  2.0  
63  6.0  2.2  4.0  1.0  2.0  
64  6.1  2.9  4.7  1.4  2.0  
65  5.6  2.9  3.6  1.3  2.0  
66  6.7  3.1  4.4  1.4  2.0  
67  5.6  3.0  4.5  1.5  2.0  
68  5.8  2.7  4.1  1.0  2.0  
69  6.2  2.2  4.5  1.5  2.0  
70  5.6  2.5  3.9  1.1  2.0  
71  5.9  3.2  4.8  1.8  2.0  
72  6.1  2.8  4.0  1.3  2.0  
73  6.3  2.5  4.9  1.5  2.0  
74  6.1  2.8  4.7  1.2  2.0  
75  6.4  2.9  4.3  1.3  2.0  
76  6.6  3.0  4.4  1.4  2.0  
77  6.8  2.8  4.8  1.4  2.0  
78  6.7  3.0  5.0  1.7  3.0  
79  6.0  2.9  4.5  1.5  2.0  
80  5.7  2.6  3.5  1.0  2.0  
81  5.5  2.4  3.8  1.1  2.0  
82  5.5  2.4  3.7  1.0  2.0  
83  5.8  2.7  3.9  1.2  2.0  
84  6.0  2.7  5.1  1.6  2.0  
85  5.4  3.0  4.5  1.5  2.0  
86  6.0  3.4  4.5  1.6  2.0  
87  6.7  3.1  4.7  1.5  2.0  
88  6.3  2.3  4.4  1.3  2.0  
89  5.6  3.0  4.1  1.3  2.0  
90  5.5  2.5  4.0  1.3  2.0  
91  5.5  2.6  4.4  1.2  2.0  
92  6.1  3.0  4.6  1.4  2.0  
93  5.8  2.6  4.0  1.2  2.0  
94  5.0  2.3  3.3  1.0  2.0  
95  5.6  2.7  4.2  1.3  2.0  
96  5.7  3.0  4.2  1.2  2.0  
97  5.7  2.9  4.2  1.3  2.0  
98  6.2  2.9  4.3  1.3  2.0  
99  5.1  2.5  3.0  1.1  2.0  
100  5.7  2.8  4.1  1.3  2.0  
101  6.3  3.3  6.0  2.5  3.0  
102  5.8  2.7  5.1  1.9  2.0  
103  7.1  3.0  5.9  2.1  3.0  
104  6.3  2.9  5.6  1.8  3.0  
105  6.5  3.0  5.8  2.2  3.0  
106  7.6  3.0  6.6  2.1  3.0  
107  4.9  2.5  4.5  1.7  2.0  
108  7.3  2.9  6.3  1.8  3.0  
109  6.7  2.5  5.8  1.8  3.0  
110  7.2  3.6  6.1  2.5  3.0  
111  6.5  3.2  5.1  2.0  3.0  
112  6.4  2.7  5.3  1.9  3.0  
113  6.8  3.0  5.5  2.1  3.0  
114  5.7  2.5  5.0  2.0  2.0  
115  5.8  2.8  5.1  2.4  2.0  
116  6.4  3.2  5.3  2.3  3.0  
117  6.5  3.0  5.5  1.8  3.0  
118  7.7  3.8  6.7  2.2  3.0  
119  7.7  2.6  6.9  2.3  3.0  
120  6.0  2.2  5.0  1.5  2.0  
121  6.9  3.2  5.7  2.3  3.0  
122  5.6  2.8  4.9  2.0  2.0  
123  7.7  2.8  6.7  2.0  3.0  
124  6.3  2.7  4.9  1.8  2.0  
125  6.7  3.3  5.7  2.1  3.0  
126  7.2  3.2  6.0  1.8  3.0  
127  6.2  2.8  4.8  1.8  2.0  
128  6.1  3.0  4.9  1.8  2.0  
129  6.4  2.8  5.6  2.1  3.0  
130  7.2  3.0  5.8  1.6  3.0  
131  7.4  2.8  6.1  1.9  3.0  
132  7.9  3.8  6.4  2.0  3.0  
133  6.4  2.8  5.6  2.2  3.0  
134  6.3  2.8  5.1  1.5  2.0  
135  6.1  2.6  5.6  1.4  3.0  
136  7.7  3.0  6.1  2.3  3.0  
137  6.3  3.4  5.6  2.4  3.0  
138  6.4  3.1  5.5  1.8  3.0  
139  6.0  3.0  4.8  1.8  2.0  
140  6.9  3.1  5.4  2.1  3.0  
141  6.7  3.1  5.6  2.4  3.0  
142  6.9  3.1  5.1  2.3  3.0  
143  5.8  2.7  5.1  1.9  2.0  
144  6.8  3.2  5.9  2.3  3.0  
145  6.7  3.3  5.7  2.5  3.0  
146  6.7  3.0  5.2  2.3  3.0  
147  6.3  2.5  5.0  1.9  2.0  
148  6.5  3.0  5.2  2.0  3.0  
149  6.2  3.4  5.4  2.3  3.0  
150  5.9  3.0  5.1  1.8  2.0