zoukankan      html  css  js  c++  java
  • K-Means++ 聚类之数据可视化:使用gnuplot

    http://blog.chinaunix.net/uid-24774106-id-3415470.html

        周末做了K-Means++聚类分析之NBA后卫分类,但是我不爽的一点是最后的结果不直观,需要我仔细研究数据,才能确定,我的分类效果对不对。当时就想做个可视化的图,对还是错,一目了然。

        matlab是一个可视化的工具,其实他更是一个编程的开发工具,他太厚重了,matlab2012a的安装包就5.4G 。。后来我找到了gnuplot。这个是我买的恶意软件分析诀窍与工具箱里面推荐的一个工具,我这两天试了试,工具很不错,功能很强大,是杀人越货,居家 旅行之必备工具,呵呵。

        安装很简单:


    1. apt-get install gnuplot gnuplot-doc
        上 面博文K-means++算法,我将NBA后卫分成了8类,我绘制了图,不是很直观,所以选择3类,重新绘制了图,就比较直观了。我将代码改动了一下,将 不同类别的数据输出的不同的文件中去,中间结果就不显示了,这样的花,第一类球员的数据存在out0文件,第二类存放在out1文件。。。

       
    1. int output_result(struct player* players,int player_num,int cluster_num)
    2. {
    3.     int i ,j;
    4.     char cmd[256] = {0};
    5.     struct player *p =players;
    6.     for(i =0 ; i< cluster_num;i++)
    7.     {
    8.         fprintf(stderr," the group %d ",i);
    9.         for(j=0,p=players;j<player_num;j++,p++)
    10.         {
    11.             if(p->group == i)
    12.             {
    13.                 snprintf(cmd,256,"cat %s |sed -n "%dp" >>out%d",FILEPATH,j+1,i);
    14.                 system(cmd);
    15.                // fprintf(stderr,"%s ",p->name);
    16.             }
    17.         }
    18.     }

    19.     fprintf(stderr," ");
    20. }

    1. root@manu:~/code/c/lin_rank# wc out*
    2. 55 220 2164 out0
    3. 23 92 899 out1
    4. 22 88 848 out2
    5. 100 400 3911 总用量
    6. root@manu:~/code/c/lin_rank#
    可以看到,out0里面有55个球员,out1有23个球员。

        gnuplot的使用比较简单,就是终端上敲入gnuplot,就打开的这个工具。


    1. root@manu:~/code/c/lin_rank#
    2. root@manu:~/code/c/lin_rank# gnuplot

    3.     G N U P L O T
    4.     Version 4.4 patchlevel 3
    5.     last modified March 2011
    6.     System: Linux 3.2.0-29-generic-pae

    7.     Copyright (C) 1986-1993, 1998, 2004, 2007-2010
    8.     Thomas Williams, Colin Kelley and many others

    9.     gnuplot home: http://www.gnuplot.info
    10.     faq, bugs, etc: type "help seeking-assistance"
    11.     immediate help: type "help"
    12.     plot window: hit 'h'

    13. Terminal type set to 'wxt'
    14. gnuplot>
        在命令行执行这个命令会绘制图图像:
    1. splot "out0" using 2:3:4 pointtype 16 title "group 0",
    2. "out1" using 2:3:4 pointtype 10 title "group 1",
    3. "out2" using 2:3:4 pointtype 2 title "group 2"
        可是有个问题,和我们归一化篮板助攻得分是一样的问题,我们不告诉gnuplot,x轴-篮板 ,y轴-主攻,z轴-得分,的比例就会动态调整,这时候输出的结果很难分辨聚类的效果好不好,感兴趣的筒子可以自己try一下,不会怀孕的,呵呵。

        我的解决办法和归一化也是一样的,就是我告诉他这个比例:

    1. average[0] = 3.317520 average[1] = 3.990000 average[2] = 12.655000
        100个人篮板的平均值是3.3,助攻是3.99,得分是12.65。比例大概是5:6:18,我们设置:

    1. set xrange [0:10]
    2. set yrange [0:12]
    3. set zrange [0:36]
        这样在输入刚才输入的指令,就可以绘制出比较好的图片了。
       
        gnuplot还能导出png图片,指令如下:


    1. set term pngcairo size 1200,600
    2. set output "cluster.png"
    3. replot
    4. set output
    5. set term wxt
        这样我们就绘制出了图片,现在看看效果:
    24774106_1353425109pvPv.png
        分类效果看起来还不错,呵呵。我不满意的地方就是人工干预太多,如果能一条龙完全用代码或者脚本实现就好了。

        总之了,这个gnuplot的确是个好工具,很好使用,向大家推荐。

    参考文献:
    1 使用 gnuplot 科学作图 ,马欢前辈整理的pdf资料,非常好,十分感激前辈


    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
    阅读(678) | 评论(0) | 转发(1) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    Win10创意者更新秋季版激活秘籍
    将刷了Android的Lumia恢复为WP系统
    给Lumia 520/521/525/526/720刷Android系统
    DNS解析
    遍历对象目录
    PE注入
    利用NtCreateThreadEx注入
    利用CreateRemoteThread注入
    APC注入
    SetWindowHookEx()注入
  • 原文地址:https://www.cnblogs.com/ztguang/p/12648295.html
Copyright © 2011-2022 走看看