【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


相关文章推荐

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

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

鸢尾花分类算法实现 java

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

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

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

K-Means聚类算法

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

基于鸢尾花数据的分类分析

Bayes classification in IRIS1,加载包library(ggplot2) library(readr)2,把IRIS数据放在”../input..”路径中并读取。syste...

基本Kmeans算法介绍及其实现

1.基本Kmeans算法[1] 选择K个点作为初始质心 repeat 将每个点指派到最近的质心,形成K个簇 重新计算每个簇的质心 until 簇不发生变化或达到最大迭代次数时间复杂度:O(tKm...

【Python数据挖掘课程】二.Kmeans聚类数据分析及Anaconda介绍

这次课程主要讲述一个关于Kmeans聚类的数据分析案例,通过这个案例让同学们简单了解大数据分析的基本流程,以及使用Python实现相关的聚类分析。 主要内容包括: 1....

Logistic回归多分类之鸢尾花

作者:金良(golden1314521@gmail.com) csdn博客: http://blog.csdn.net/u012176591 多项逻辑回归模型原理 鸢尾花数据可视化 算法实现代码 混淆...

Logistic回归实现鸢尾花分类

分类效果: 数据集示例: 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-seto...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【K-Means】鸢尾花的分类聚类
举报原因:
原因补充:

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