【K-Means】鸢尾花的分类聚类

原创 2013年12月03日 21:03:19

鸢尾花的分类聚类

现有若干鸢尾花的数据,每朵鸢尾花有4个数据,分别为萼片长(单位:厘米)、萼片宽(单位厘米)、花瓣长度(单位厘米)和花瓣宽(单位厘米)。我们希望能找到可行的方法可以按每朵花的4个数据的差异将这些鸢尾花分成若干类,让每一类尽可能的准确,以便帮助植物专家对这些花进行进一步的分析。


这是一道数模入门题目。

无指导聚类。用K-Means算法,最简单的欧式距离,最简单的平均位置计算方法,然而效果已经很好。

可视化采用平行坐标轴法,并手动调整了主次。


第一次用Matlab,颠覆了思维,感觉是对以前的程式化的思维的一个强力冲击。使用上比C++简洁很多很多。强烈渴望继续学习下去。

main.m:

clear all;
close all;
clc;

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

hold on;
[m n]=size(dat);
for i=1:m
    line(1:n,dat(i,[2 1 3 4]));%原始数据按照平行坐标系展示,观察发现大致分为三类。
end
figure;
hold on;
K=3;
rs = kmean(dat,K);%进行无指导聚类
ou1=[];
ou2=[];
ou3=[];
for i=1:m%聚类后的数据
    if rs(i,1) == 1
        ou1 = [ou1;i];
        line(1:n,dat(i,[2 1 3 4]),'Color','r');
    elseif rs(i,2) == 1
        ou2 = [ou2;i];
        line(1:n,dat(i,[2 1 3 4]),'Color','g');
    else
        ou3 = [ou3;i];
        line(1:n,dat(i,[2 1 3 4]),'Color','b');
    end
end

fid = fopen('classify.txt','wt');
[ss a] = size(ou1);
fprintf(fid,'第一类');
for i=1:ss
    fprintf(fid,'%d ',ou1(i));
end
fprintf(fid,'\n第二类');
[ss a] = size(ou2)
for i=1:ss
    fprintf(fid,'%d ',ou2(i));
end
fprintf(fid,'\n第三类');
[ss a] = size(ou3)
for i=1:ss
    fprintf(fid,'%d ',ou3(i));
end

fclose(fid);

Kmeans.m:

function re=kmean(dat,K)%K-平均值算法进行无指导聚类
    [m n] = size(dat);
    u = zeros(K,n);
    for i=1:n
        mi = min(dat(:,i));
        ma = max(dat(:,i));
        for j=1:K
            u(j,i) = mi+(ma-mi)*rand();%使种子点每一维都在该维最大值和最小值之间
        end
    end
    
    dist = zeros(K,1);
    while 1
        re = zeros(m,K);
        uu = u;%记录之前的种子点
        for i=1:m
            for j=1:K
                dist(j) = sum((dat(i,:)-u(j,:)).^2);%用欧式距离公式计算每个点到每个种子点的距离
            end
            [mm pp] = min(dist(:));%找到每个点最近的种子点
            re(i,pp) = 1;%记录分组中有的点
        end
        
        for i=1:K
            for j=1:n
                ss = sum(re(:,i));
                if ss~=0
                    u(i,j) = sum(re(:,i).*dat(:,j))/sum(re(:,i));%利用每一组中有的点的,各维平均值更新种子点的各维的值
                end
            end
        end
        
        if norm(uu-u)<0.1%如果种子点的坐标最后收敛,则退出循环
            break;
    end
end


Python scikit-learn 学习笔记—鸢尾花模型

鸢尾花数据是一个简易有趣的数据集。这个数据集来源于科学家在一岛上找到一种花的三种不同亚类别,分别叫做setosa,versicolor,virginica。但是这三个种类并不是很好分辩,所以他们又从花...
  • leo_is_ant
  • leo_is_ant
  • 2015年04月30日 17:26
  • 4999

k_means聚类算法和配套测试鸢尾花数据集

  • 2017年09月02日 10:26
  • 3KB
  • 下载

鸢尾花分类算法实现 java

使用的贝叶斯分类算法实现的,编程语言为java。是我本学期修的数据库与数据挖掘的课程的期末课程作业,算法本身不难,思路理清楚了很简单。 先看看鸢尾花(Iris)数据集(下图为数据集的部分截图),鸢尾花...
  • liuman1990
  • liuman1990
  • 2014年01月17日 17:11
  • 2207

鸢尾花分类——神经网络详解

神经元的广泛互联与并行工作必然使整个网络呈现出高度的非线性特点。在客观世界中,许多系统的输入与输出之间存在着复杂的非线性关系,对于这类系统,往往很难用传统的数理方法建立其数学模型。设计合理地神经网络通...
  • zm714981790
  • zm714981790
  • 2016年04月26日 19:16
  • 7162

决策树实战项目-鸢尾花分类

决策树实战项目-鸢尾花分类 一、实验介绍 1.1 实验内容 决策树是机器学习中一种简单而又经典的算法。本次实验将带领了解决策树的基本原理,并学习使用 scikit-learn 来构建一个决策树分...
  • oxuzhenyi
  • oxuzhenyi
  • 2017年07月31日 13:13
  • 914

RBF神经网络对iris鸢尾花数据集进行分类识别

RBF神经网络对iris鸢尾花数据集进行分类识别
  • FUBIN0000
  • FUBIN0000
  • 2017年05月05日 18:21
  • 2539

鸢尾花数据集

  • 2017年10月12日 10:43
  • 1KB
  • 下载

鸢尾花分类预测数据分析

鸢尾花分类预测数据分析 目标:根据未知种类鸢尾花的特征预测其种类 数据:鸢尾花数据集 分析: 描述性分析 探索性分析 建模分析 模型分析 迭代分析 成果:位置种类鸢尾花的预测结果 import n...
  • QianYanDai
  • QianYanDai
  • 2017年09月12日 17:57
  • 519

K-Means聚类算法

本文系翻译(原文),必要时揉入了自己的理解,各位看官,如有错误还望多多包涵。 1.引言        前面说过,机器学习是一门处理数据的学科,计算机发展至今,也诞生了数不胜数的跟数据有关的智能算法,正...
  • eternity1118_
  • eternity1118_
  • 2016年05月27日 12:59
  • 2153

机器学习笔记(九)聚类算法及实践(K-Means,DBSCAN,DPEAK,Spectral_Clustering)

聚类算法的原理介绍及Python的简单实践,主要包括K-Means,DBSCAN,DPEAK,Spectral_Clustering。...
  • sinat_22594309
  • sinat_22594309
  • 2017年03月18日 13:59
  • 3444
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【K-Means】鸢尾花的分类聚类
举报原因:
原因补充:

(最多只允许输入30个字)