Windows安装Python图像处理库:PIL模块_Python_其它语言-ITnose

mikel阅读(1086)

Windows安装Python图像处理库:PIL模块

来源: Windows安装Python图像处理库:PIL模块_Python_其它语言-ITnose

平常一般都在Linux下用Python,今天女票突然说让帮忙把一些图片全部弄成一个分辨率的,作为程序员,这种重复的工作还是交给计算机吧。

废话不多说,打开Cmd看下Windows的python下面是否有PIL(python imaging library)这个库,很不辛,木有。

于是到 PIL官网 下载一个,python imaging library 1.1.7 for Python 2.7 (windows only)。

exe文件,直接双击,提示:Python version 2.7 required, which was not found in the registry

Windows安装Python图像处理库:PIL模块0

明明不是装了Python吗,检查了下环境变量,没有问题。

然后上网百度,发现我的系统是win7 64位的,而PIL官网提供的下载包都是32位的,可以在这里看到 http://effbot.org/downloads#pil

64位检查注册表的位置是: HKLM|HKCU\SOFTWARE\

32位检查注册表的位置是: HKLM|HKCU\SOFTWARE\wow6432node\

然后,有人提供了非官方的64位库:

http://www.lfd.uci.edu/~gohlke/pythonlibs/

叫做Pillow,下载下来,是个 .whl 结尾的文件,这个其实就是python使用的一种压缩文件,后缀名改成zip,可以打开。

这个需要用 pip 安装。

如果没有在windows上安装pip,可以参考我的另一篇文章:

pip install Pillow-2.7.0-cp27-none-win_amd64.whl  即可。

注意,这里有一段

Pillow is a replacement for PIL, the Python Image Library, which provides image processing functionality and supports many file formats.
Use `from PIL import Image` instead of `import Image`.

意思就是说,要用 ‘ from PIL import Image’ 代替 ‘import Image’

然后进python 命令行

from PIL import Image

OK,安装成功了。用法和PIL一样。

另外,还有通过源码自己编译的方法在windows上安装,可以参考:

http://www.crifan.com/python_install_pip_error_python_version_2_7_required_which_was_not_found_in_the_registry/

Python安装PIL的坑 - 楚 - 博客园

mikel阅读(3396)

来源: 安装PIL的坑 – 楚 – 博客园

今天在centos中使用pip安装PIL死活不成功,报错:

1
2
3
Could not find a version that satisfies the requirement PIL (from versions: )
Some externally hosted files were ignored as access to them may be unreliable (use --allow-external PIL to allow).
No matching distribution found for PIL

 

但是使用pip search PIL查找,源中确实有该包:

1
PIL                                  - Python Imaging Library

 

google之,得到如下办法(http://stackoverflow.com/questions/21242107/pip-install-pil-dont-install-into-virtualenv):

1
sudo pip install PIL --allow-external PIL --allow-unverified PIL

果然成功了。

 

但是程序运行时又报错:

1
font = ImageFont.truetype(os.path.join("fonts",font_type), font_size)<br>ImportError: The _imagingft C module is not installed

似乎是没有安装truetype扩展之类的。那就安装吧(http://stackoverflow.com/questions/4011705/python-the-imagingft-c-module-is-not-installed):

1
sudo yum install freetype-devel

 

然后卸载、重新安装PIL

1
2
sudo pip uninstall PIL
sudo pip install PIL --allow-external PIL --allow-unverified PIL

终于搞定了

 

 

 

 

PS:之前还尝试过从官网下载PIL源码自己编译安装:

(参照:http://www.cnblogs.com/free–coder/archive/2012/09/12/2681361.html)

1.下载源码并解压:

1
2
wget http://effbot.org/downloads/Imaging-1.1.7.tar.gz
tar -xzvf Imaging-1.1.7.tar.gz

2.编译安装(注意要root权限):

1
2
python setup.py build
python setup.py install 

 

安装倒是成功了,但是python脚本运行时报错:

1
2
3
4
5
6
7
8
/usr/lib64/python2.7/site-packages/PIL/Image.py:81: RuntimeWarning: The _imaging extension was built for another  version of Pillow or PIL
  warnings.warn(str(v), RuntimeWarning)
Traceback (most recent call last):
  File "captcha.py", line 3, in <module>
    import Image, ImageDraw, ImageFont, ImageFilter
  File "/usr/lib64/python2.7/site-packages/PIL/Image.py", line 65, in <module>
    raise ImportError("The _imaging extension was built for another "
ImportError: The _imaging extension was built for another  version of Pillow or PIL

似乎版本不对。。。。。

放弃了

在win7 64位系统下安装Flask - 指尖跳动的精灵的个人页面

mikel阅读(1180)

来源: 在win7 64位系统下安装Flask – 指尖跳动的精灵的个人页面

摘要: 之前一直是在linux下开发flask应用。为了毕业论文,可能需要在win7下开发。所以记录了在win7下安装flask的过程及出现的问题。

安装环境简介:

系统:win7  64位。

安装python和easy_install:

我安装的python是python2.7.安装步骤就不详述了。关键是如何安装easy_install。

因为我是64位的,所以,需要先下载ez_setup.py(需要复制该链接中的内容,然后另存为ez_setup.py)。然后双击运行ez_setup.py。过一会即可安装完毕。

然后,添加easy_install命令和其他python脚本的到命令行搜索路径,方法为:添加你 python安装目录中的Scripts文件夹到环境变量 PATH 中。添加方法:右键桌面的“我的电脑” 图标或者开始菜单中的“计算机”,然后选在“属性”。之后,在Vista和Win7下,单击“高级系统 设置”。然后,单击“环境变量”按钮,双击“系统变量”中的“path”变量。 在那里添加你的Python解释器的 Scripts文件夹;确保你使用分号将它与现有的值隔开。 假设你在使用默认路径的Python2.7,加入下面的值

  1. ;C:\Python27\Scripts

安装virtualenv

配置虚拟环境(如在D盘):

此时,D盘就多了一个myproject文件。

安装Flask:

cd 到myproject目录下的Scripts,输入activate.bat,此时进入了虚拟环境了。然后输入easy_install Flask

此时,安装完毕。

实验:

在myproject目录下新建myapp目录。进入myapp目录,创建hello.py文件,输入如下代码:

from flask import Flask  
app=Flask(__name__)  
@app.route('/')  
def hello_world():  
    return "Hello World"  
if __name__ == '__main__':  
    app.run()

保存后,运行:

在浏览器中输入127.0.0.1:5000即可看到“Hello World”

安装过程中可能遇到的问题:

1、出现如下错误:

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xb0 in position 1: ordinal not in range(128)

Something went wrong during the installation.

解决方法:

打开C:\Python27\Lib下的 mimetypes.py 文件,找到‘default_encoding = sys.getdefaultencoding()’。

在这行前面添加三行:

if sys.getdefaultencoding() != ‘gbk’:

reload(sys)

sys.setdefaultencoding(‘gbk’)

default_encoding = sys.getdefaultencoding()

保存后问题就解决了。

2、出现如下问题:

“ImportError: Entry point (‘console_scripts’, ‘easy_install’) not found”

之前一开始安装esay_install是按32位安装的,所以由重新安装easy_install。

Please install a more recent version first, using ‘easy_install -U distribute’.”,我就执行“sudo easy_install -U distribute”命令升级distribute。没想到,升级后easy_install就不可用了,遇到上述错误。

大约是distribute升级到0.7之后的版本,就和以前的easy_install不兼容了,因为distribute从0.7版本后就和setuptools合并在一起了。

解决方案:

将安装python目录下的Scripts目录中有关esay_install的文件全部删除,然后重新安装即可。

Python和Flask真是太强大了 - Python - 伯乐在线

mikel阅读(1118)

作者是一个python开发员,同时也写Python书籍赚点小钱。某次网友抱怨他在线的图书付款流程太复杂,因而“大怒”,遂用Flask百余行代码完成整个流程。绝对的实战案例,让你领教Flask的威力。

来源: Python和Flask真是太强大了 – Python – 伯乐在线

作为一个程序员,我有时候忘了自己所具有的能力。当事情没有按照你想要的方式发展时,却很容易忘记你有能力去改变它。昨天,我意识到,我已经对我所出售的书的付款处理方式感到忍无可忍了。我的书完成后,我使用了三个不同的数字商品支付处理器,在对它们三个都感到不满后,我用Python和Flask,两个小时的时间写出了我自己的解决方案。没错!两个小时!现在,这个系统支撑着我的书籍付费流程,整个过程难以置信的简单,你可以在20秒内购买书籍并开始阅读。

往下看,看我是如何在一夜之间完成我自己的数字商品支付解决方案的。

支付处理器的付款问题

在我开始卖书的时候,我综合用了两种支付服务(一种是信用卡,另一种是PayPal)。最终,我发现了一个可以支持两者的处理方式。可是我对它们都不满意。最常用的那个支付处理器,要求用户在销售商的系统中创建一个账户,并且输入他们的邮箱地址(尽管邮箱并没有用)。

另外,我尝试使用Google Analytics 在全部的访问中追踪访客,包括他们的结账过程,这一过程也很艰辛。我经常感觉到,如果我能够让它工作起来,并且能够在我的书籍页面进行A/B测试,我能极大地提高销量。但是因为不能很好的追踪,我就没那么走运了。

最后,使用三个不同的支付处理器,发送书籍更新非常耗时。没有一个能很好的支持更新,而我希望有个“一键”解决方案来发送我的书籍更新。我就没找到一个类似的服务。

欧耶,我是个程序员

昨天,当我收到一个顾客的邮件,抱怨支付过程是如何的困难并且告诉我可能因此损失了很多销量后,我忍无可忍了。我决定整一个自己的数字商品管理解决方案。我需要做到下面这样了流程:

当客户点击“Buy Now”按钮后,他们应该仅仅被要求输入他们的email地址和信用卡信息。点击“Confirm”后被带到一个独一无二的URL去下载书籍(专门为了这次交易而生成的)。一封包含这个URL的邮件应该被发送给客户(防止用户需要重新下载这本书)。对他们重复下载的次数应该有个限制(5次)。交易信息和客户信息应该被存放在数据库中,发送书籍更新应该只是一个命令的事。

显然,这并不是那么的复杂。最复杂的部分是动态生成导向特定书籍版本的独一无二的URL。其他的事情都挺简单的。

“Flask前来救援”或是“一个100行代码的数字商品支付解决方案”

剧透:程序的最终结果正好是100行代码。对于这种规模的web应用,Flask是个很好的选择。并不需要大量的模板(cough就像 Django cough),但是有很多很好的插件作为支持。Bottle会是另外一个不错的选择,但是我最近都在用Flask,所以我就选它了。

开始的时候,我需要决定如何来存放用户和交易信息。我决定使用SQLAlchemy,因为sandman的原因,我比较熟悉它SQLAlchemy。Flask有一个插件叫Flask-SQLAlchemy,这使得结合使用两者非常容易。因为我不需要任何花哨的数据库操作,我选择SQLite作为我的后台数据库。

决定这样做之后,我创建了一个app.py 文件并且创建了如下的模型:

在向数据库添加了5种不同版本的书籍后(我创建了一个populate_db.py 文件,并把这些版本作为SQLAlchemy模型来添加进数据库),我需要决定我究竟要如何处理支付。幸运的是,Stripe让接受一个信用卡变得非常简单,并且我也已经有了一个他们的账户。他们的”checkout.js”方案会在你的页面上创建一个表单和按钮。当点击这个按钮时,一个简洁又引人注目的浮动层会弹出来。

这个表单的action 属性指向你的站点的一个页面,当用户完成支付后就会被带到那里。我在我的书籍销售页面添加了5个这样的按钮,还有一个隐藏的表单栏,包含了被交易产品的id(product_id)(1-5之间的一个整数)

处理支付

显然,我的应用需要一个后端来处理一次成功付款。我添加了以下这些函数来完成这一目的:

正如你所看到的,我写代码的时候有点偷懒了(因为我正在愤怒的编程……)首先,我有一个内联HTML,在付费不成功时返回,还有已购买成功时返回邮箱。这些东西应该被放在一个全局变量,或者,更好的方法是放在一个单独的文件中。另外,在创建Purchase 时我并没有进行任何的错误检查。但是实际上,唯一可能出错的地方是尝试插入重复的 uuid,但是我并不担心,因为发生的几率太低了(潜台词:微乎其微)。

你可以看的我使用了一个mail 对象,这个对象来自于Flask-Mail包,这个插件让发送邮件变得轻松。我就设置它使用GMail作为服务器,然后所有东西都可以正常工作了。

好吧,现在该给我书了

现在,支付的部分已经搞定,我需要添加一个后端功能,在完成支付后初始化下载。因为我使用UUID作为主键,所以我同样可以使用它作为URL。当有人访问包含UUID的URL时,我需要检查该UUID是不是包含在数据库中。如果是的话,提供书籍文件并且把剩余下载(downloads_left)次数属性减少1次。如果不是的话,就返回404错误。下面是我写的代码:

非常直观。使用UUID作为一个URL变量,寻找交易信息。如果存在,就检查是否还有可用下载次数,然后提供所购买的文件。否则,等着你的是404错误。

最后,我需要我需要添加一个测试来让我可以模拟交易过程。下面是测试代码和让这个app运行的代码:

能力越大…责任越大!

实际上我对于自己能如此快速简单让这一切工作起来感到吃惊。整个应用程序包含在一个100行代码的文件中。而且它替代了我每天使用的那些重要服务,我对那些服务一直都不满意。最后,我可以追踪交易,没有任何问题,这让我确信自己可以提高销量。

作为一个开发者,能意识到你有能力塑造我们和数字世界的交互是很好的一件事。比方说,我会忘记,如果有一些科技不能按照我预想的方式去工作,我有能力改变它。从自动化机械式的任务比如输入数据,到自动排序和整理电子邮件,开发者们有能力去简化他们每天的工作。

拥有Flask这样的工具对解决这些问题非常重要。正如像作为程序员那样进步,你应该建立你的一套解决“核心”问题的工具集。Flask就是很好的例子,因为匆匆忙忙的拼凑一个web应用是一件司空见惯的事情。

当然,分享你的作品同样非常的重要。如果我做一些东西,对我自己有用,但没有去分享给别人,我就会怠慢。“分享”不仅仅意味着”把项目放进一个GitHub公共仓库“。你还需要让大家知道有这个东西。从邮件列表到论坛再到个人博客,从来都不缺少让大家知道你创造了一些东西的途径。我总是设法回馈社区,因为我从中得到了很多东西。

Jeff Knupp,发表于2014年1月18日

npm无法安装node-sass的解决方法 - 王洪宝 - 博客园

mikel阅读(1204)

来源: npm无法安装node-sass的解决方法 – 王洪宝 – 博客园

使用npm install 命令安装node-sass时,经常出现安装失败的情况。原因在于npm服务器在美国,还有就是某强大的防火墙作用。导致模块无法下载。

1 npm install node-sass
复制代码
1 Cannot download https://github.com/sass/node-sass/releases/download/v3.4.2/win32-x64-46_binding.node
2 
3 Hint: If github.com is not accessible in your location
4 try setting a proxy via HTTP_PROXY, e.g. 
5 export HTTP_PROXY=http://example.com:1234
6 or configure npm proxy via
7 npm config set proxy http://example.com:8080'
复制代码

 

解决方法:
1、使用淘宝镜像完成安装。

1 npm install -g cnpm --registry=https://registry.npm.taobao.org
2 cnpm install node-sass

2、下载FQ软件直接完成下载安装

node-sass 安装失败的解决办法 - 志文工作室

mikel阅读(1133)

来源: node-sass 安装失败的解决办法 – 志文工作室

node-sass 安装失败的原因

npm 安装 node-sass 依赖时,会从 github.com 上下载 .node 文件。由于国内网络环境的问题,这个下载时间可能会很长,甚至导致超时失败。
这是使用 sass 的同学可能都会遇到的郁闷的问题。

解决方案就是使用其他源,或者使用工具下载,然后将安装源指定到本地。

解决方法一:使用淘宝镜像源

设置变量 sass_binary_site,指向淘宝镜像地址。示例:

npm i node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/

// 也可以设置系统环境变量的方式。示例
// linux、mac 下
SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ npm install node-sass

// window 下
set SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ && npm install node-sass

或者设置全局镜像源:

npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/

之后再涉及到 node-sass 的安装时就会从淘宝镜像下载。

解决方法二:使用 cnpm

另外,使用 cnpm 安装 node-sass 会默认从淘宝镜像源下载,也是一个办法:

cnpm install node-sass

解决方法三:下载 .node 到本地

到这里去根据版本号、系统环境,选择下载 .node 文件:

https://github.com/sass/node-sass/releases

然后安装时,指定变量 sass_binary_path,如:

npm i node-sass --sass_binary_path=/Users/lzwme/Downloads/darwin-x64-48_binding.node

安装失败后重新安装问题

最后,有同学问,之前安装失败,再安装就不去下载了,怎么办呢?那就先卸载再安装:

npm uninstall node-sass && npm i node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/

相关参考

https://github.com/lmk123/blog/issues/28
https://github.com/cnpm/cnpm/pull/76

Meteor 离线安装组件包 - 简书

mikel阅读(1572)

来源: Meteor 离线安装组件包 – 简书

meteor有非常优秀package机制,安装package是meteor开发过程中经常要做的事情。但在安装package的过程中常常因为网络原因安装失败。所在在这里介绍一种本地安装package的方法。

在 atmospherejs.com 找到想要安装的package,在package介绍页面会有一个github按钮,也就是这个package在github的源代码库地址。

右下角的按钮

点击Github按钮就会进入这个组件在github的源代码库中。

在这里找到这个类似这样的git连接。

找到git项目的地址

拷贝出像这样的地址。

https://github.com/moment/moment.git

先进入项目目录

cd yourself-project

创建packages文件夹,这个目录是你本地package所在的目录,所有的package都可以放在这里

mkdir packages

进入packages目录

cd packages

下载moment插件

git clone https://github.com/moment/moment.git

返回项目目录,安装插件

cd ..

meteor add momentjs:moment

你会看到package很快就安装完成了。有了这个方法妈妈再也不用担心你安装不上package了~呵呵~

TensorFlow的安装 - 尘续缘的博客 - 博客频道 - CSDN.NET

mikel阅读(2063)

来源: TensorFlow的安装 – 尘续缘的博客 – 博客频道 – CSDN.NET

1. 前提说明

在公司试着学习下深度学习项目,决定使用TensorFlow框架,公司的服务器上之前有人搭建过,遇到不懂的也也可以顺便请教。至于为什么还要自己重新搭建一个,因为公司的TensorFlow可能版本较老,在运行mnist的深度学习模型不能运行,所以还得自己重新装一个。
先说明一下现有的条件吧,

  1. 服务器系统为Linux
  2. 有NVIDIA的K80显卡
  3. 并不是服务器的管理者,没有root权限
  4. python 版本2.7

2. Virtualenv下安装TensorFlow

TensorFlow的安装方式有许多种,包括Pip, Docker, Virtualenv, Anaconda 或 源码编译的方法安装.不同的平台下官网上也有相应的安装教程,详见TensorFlow开源社区orTensorFlow中文社区
因为服务器上有众多用户使用,所以对我而言比较好的办法是在沙盒中运行,因此使用Virtualenv安装方式。

# 在 Linux 上:
$ sudo apt-get install python-pip python-devpython-virtualenv

接下来, 建立一个全新的 virtualenv 环境。可以将环境设在指定目录下,这里设为 /tensorflowtest :

$ virtualenv --system-site-packages tensorflowtest
$ cd tensorflowtest

然后在自己创建的tensorflow目录下, 激活 virtualenv:

$ source bin/activate  # 如果使用 bash
$ source bin/activate.csh  # 如果使用 csh
(tensorflowtest)$  # 终端提示符应该发生变化

接下来按照按照官网上的步骤
image_1b950fa5r1ji29mi16b81aub1gusg.png-51.6kB
执行

(tensorflowtest)$ pip install --upgrade tensorflow

坑就来了。。。
image_1b950q6vb9bv1qdlek3v841nugt.png-120.9kB

❌Could not find any downloads that satisfy the requirement tensorflow in /usr/lib/python2.7/site-packages.
这一般是由于pip版本过低所致,查看了以下pip版本号,

image_1b950uc2hu8a6661qj0gjthkv1a.png-43.6kB

然后update一下,

(tensorflowtest)$ pip install -U pip

image_1b95124rtej0146215eo1o8g11461n.png-71.8kB

再重新pip安装一下,就没问题了。此处安装的是CPU版本,如果没有GPU使用需求的话,至此应该是结束了。
但是按照教程安装GPU版本的话,

(tensorflowtest)$ pip install --upgrade tensorflow-gpu

image_1b951fi2rgr21vj01phmest1imc24.png-54.3kB

至此,我也以为万事大吉了,但是在import tensorflow时,

❌CImportError: libcudart.so.8.0: cannot open shared object file: No such file or directory
查了https://github.com/tensorflow/tensorflow/issues/5625,这是由于CUDA和CUDNN版本不匹配所造成的。
有条件的同学可以自己升级或者下载匹配的CUDA和CUDNN,但是服务器并不是我一人独享,所以环境配置不能随便更改。因此,只能重新用源码安装TensorFlow以适配当前服务器的环境。

3. 用源码安装TensorFlow

主要参考卜居的博客,上面说的也很详细。

下载源码

$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow

安装 Bazel

参考 http://bazel.io/docs/install.html

配置

$ ./configure 参考lenbow的博客
里面有一项3.5-5.2运算能力的设置,可以参考https://developer.nvidia.com/cuda-gpus
在我的配置过程中,有一个选项是:

Do you wish to build TensorFlow with OpenCL support? [y/N] n

如果用不上的话千万不要选,否则会出现如下一直循环的情况
image_1b953gcd7hcpa4aejhl121i8t2h.png-136.5kB
❌Clease specify the location where ComputeCpp for SYCL 1.2 is installed. [Default is /usr/local/computecpp]:
Invalid SYCL 1.2 library path. /usr/local/computecpp/lib/libComputeCpp.so cannot be found

编译

  • 仅 CPU 支持,无 GPU 支持:
$ bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
  • 有 GPU 支持:
$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package 
  • 生成 pip 安装包
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
  • cd 到 /tmp/tensorflow_pkg目录下,找到编译好的whl文件
  • 再使用PIP 工具安装
  • 这里如果要有gpu版本的话,也记得要加上–config=cuda
$ pip install --config=cuda /tmp/tensorflow_pkg/tensorflow-x.x.x-py2-none-linux_x86_64.whl

编译目标程序, 开启 GPU 支持

$ bazel build -c opt --config=cuda //tensorflow/cc:tutorials_example_trainer

$ bazel-bin/tensorflow/cc/tutorials_example_trainer --use_gpu
# 大量的输出信息. 这个例子用 GPU 迭代计算一个 2x2 矩阵的主特征值 (major eigenvalue).
# 最后几行输出和下面的信息类似.
000009/000005 lambda = 2.000000 x = [0.894427 -0.447214] y = [1.788854 -0.894427]
000006/000001 lambda = 2.000000 x = [0.894427 -0.447214] y = [1.788854 -0.894427]
000009/000009 lambda = 2.000000 x = [0.894427 -0.447214] y = [1.788854 -0.894427]

至此,折腾了一天半的TensorFlow安装之旅圆满结束。:)

树莓派中获得root权限(转) - jdh99的专栏 - 博客频道 - CSDN.NET

mikel阅读(971)

树莓派中获得root权限(转)原链接:http://my.oschina.net/quanpower/blog/1351961.重新开启root账号,可由pi用户登录后,在命令行下执行sudo passwd root2.执行此命令后系统会提示输入两遍的root密码,输入你想设的密码即可,然后在执行sudo passwd –unlock root

来源: 树莓派中获得root权限(转) – jdh99的专栏 – 博客频道 – CSDN.NET

1.重新开启root账号,可由pi用户登录后,在命令行下执行

sudo passwd root

2.执行此命令后系统会提示输入两遍的root密码,输入你想设的密码即可,然后在执行

sudo passwd --unlock root

这样就可以解锁root账户了。

WEKA使用教程(经典教程转载) - Coding for Dreams - 博客频道 - CSDN.NET

mikel阅读(1586)

WEKA使用教程目录 1. 简介2. 数据格式3.数据准备4. 关联规则(购物篮分析)5. 分类与回归6. 聚类分析 1. 简介 WEKA的全名是怀卡托智能分析环境(Waikato Environment for Knowledge Analysis),它的源代码可通过http://www.cs.waikato.ac.nz/ml/weka得到。同时weka也

来源: WEKA使用教程(经典教程转载) – Coding for Dreams – 博客频道 – CSDN.NET

WEKA使用教程

目录
1. 简介
2. 数据格式
3.数据准备
4. 关联规则(购物篮分析)
5. 分类与回归
6. 聚类分析

1. 简介

WEKA的全名是怀卡托智能分析环境(Waikato Environment for Knowledge Analysis),它的源代码可通过http://www.cs.waikato.ac.nz/ml/weka得到。同时weka也是新西兰的一种鸟名,而WEKA的主要开发者来自新西兰。

WEKA作为一个公开的数据挖掘工作平台,集合了大量能承担数据挖掘任务的机器学习算法,包括对数据进行预处理,分类,回归、聚类、关联规则以及在新的交互式界面上的可视化。
如果想自己实现数据挖掘算法的话,可以看一看weka的接口文档。在weka中集成自己的算法甚至借鉴它的方法自己实现可视化工具并不是件很困难的事情。

2005年8月,在第11届ACM SIGKDD国际会议上,怀卡托大学的Weka小组荣获了数据挖掘和知识探索领域的最高服务奖,Weka系统得到了广泛的认可,被誉为数据挖掘和机器学习历史上的里程碑,是现今最完备的数据挖掘工具之一(已有11年的发展历史)。Weka的每月下载次数已超过万次。

–整理自http://www.china-pub.com/computers/common/info.asp?id=29304

2. 数据格式

巧妇难为无米之炊。首先我们来看看WEKA所用的数据应是什么样的格式。
跟很多电子表格或数据分析软件一样,WEKA所处理的数据集是图1那样的一个二维的表格。

图1 新窗口打开
这里我们要介绍一下WEKA中的术语。表格里的一个横行称作一个实例(Instance),相当于统计学中的一个样本,或者数据库中的一条记录。竖行称作一个属性(Attrbute),相当于统计学中的一个变量,或者数据库中的一个字段。这样一个表格,或者叫数据集,在WEKA看来,呈现了属性之间的一种关系(Relation)。图1中一共有14个实例,5个属性,关系名称为“weather”。

WEKA存储数据的格式是ARFF(Attribute-Relation File Format)文件,这是一种ASCII文本文件。图1所示的二维表格存储在如下的ARFF文件中。这也就是WEKA自带的“weather.arff”文件,在WEKA安装目录的“data”子目录下可以找到。


需要注意的是,在Windows记事本打开这个文件时,可能会因为回车符定义不一致而导致分行不正常。推荐使用UltraEdit这样的字符编辑软件察看ARFF文件的内容。

下面我们来对这个文件的内容进行说明。
识别ARFF文件的重要依据是分行,因此不能在这种文件里随意的断行。空行(或全是空格的行)将被忽略。
以“%”开始的行是注释,WEKA将忽略这些行。如果你看到的“weather.arff”文件多了或少了些“%”开始的行,是没有影响的。
除去注释后,整个ARFF文件可以分为两个部分。第一部分给出了头信息(Head information),包括了对关系的声明和对属性的声明。第二部分给出了数据信息(Data information),即数据集中给出的数据。从“@data”标记开始,后面的就是数据信息了。

关系声明
关系名称在ARFF文件的第一个有效行来定义,格式为
@relation <relation-name>
<relation-name>是一个字符串。如果这个字符串包含空格,它必须加上引号(指英文标点的单引号或双引号)。

属性声明
属性声明用一列以“@attribute”开头的语句表示。数据集中的每一个属性都有它对应的“@attribute”语句,来定义它的属性名称和数据类型。
这些声明语句的顺序很重要。首先它表明了该项属性在数据部分的位置。例如,“humidity”是第三个被声明的属性,这说明数据部分那些被逗号分开的列中,第三列数据 85 90 86 96 … 是相应的“humidity”值。其次,最后一个声明的属性被称作class属性,在分类或回归任务中,它是默认的目标变量。
属性声明的格式为
@attribute <attribute-name> <datatype>
其中<attribute-name>是必须以字母开头的字符串。和关系名称一样,如果这个字符串包含空格,它必须加上引号。
WEKA支持的<datatype>有四种,分别是
numeric————————-数值型
<nominal-specification>—–分类(nominal)型
string—————————-字符串型
date [<date-format>]——–日期和时间型
其中<nominal-specification> 和<date-format> 将在下面说明。还可以使用两个类型“integer”和“real”,但是WEKA把它们都当作“numeric”看待。注意“integer”,“real”,“numeric”,“date”,“string”这些关键字是区分大小写的,而“relation”“attribute ”和“date”则不区分。

数值属性
数值型属性可以是整数或者实数,但WEKA把它们都当作实数看待。

分类属性
分类属性由<nominal-specification>列出一系列可能的类别名称并放在花括号中:{<nominal-name1>, <nominal-name2>, <nominal-name3>, …} 。数据集中该属性的值只能是其中一种类别。
例如如下的属性声明说明“outlook”属性有三种类别:“sunny”,“ overcast”和“rainy”。而数据集中每个实例对应的“outlook”值必是这三者之一。
@attribute outlook {sunny, overcast, rainy}
如果类别名称带有空格,仍需要将之放入引号中。

字符串属性
字符串属性中可以包含任意的文本。这种类型的属性在文本挖掘中非常有用。
示例:
@ATTRIBUTE LCC string

日期和时间属性
日期和时间属性统一用“date”类型表示,它的格式是
@attribute <name> date [<date-format>]
其中<name>是这个属性的名称,<date-format>是一个字符串,来规定该怎样解析和显示日期或时间的格式,默认的字符串是ISO-8601所给的日期时间组合格式“yyyy-MM-ddTHH:mm:ss”。
数据信息部分表达日期的字符串必须符合声明中规定的格式要求(下文有例子)。

数据信息
数据信息中“@data”标记独占一行,剩下的是各个实例的数据。

每个实例占一行。实例的各属性值用逗号“,”隔开。如果某个属性的值是缺失值(missing value),用问号“?”表示,且这个问号不能省略。例如:
@data
sunny,85,85,FALSE,no
?,78,90,?,yes

字符串属性和分类属性的值是区分大小写的。若值中含有空格,必须被引号括起来。例如:
@relation LCCvsLCSH
@attribute LCC string
@attribute LCSH string
@data
AG5, ‘Encyclopedias and dictionaries.;Twentieth century.’
AS262, ‘Science — Soviet Union — History.’

日期属性的值必须与属性声明中给定的相一致。例如:
@RELATION Timestamps
@ATTRIBUTE timestamp DATE “yyyy-MM-dd HH:mm:ss”
@DATA
“2001-04-03 12:12:12”
“2001-05-03 12:59:55”

稀疏数据
有的时候数据集中含有大量的0值(比如购物篮分析),这个时候用稀疏格式的数据存贮更加省空间。
稀疏格式是针对数据信息中某个实例的表示而言,不需要修改ARFF文件的其它部分。看如下的数据:
@data
0, X, 0, Y, “class A”
0, 0, W, 0, “class B”
用稀疏格式表达的话就是
@data
{1 X, 3 Y, 4 “class A”}
{2 W, 4 “class B”}
每个实例用花括号括起来。实例中每一个非0的属性值用<index> <空格> <value>表示。<index>是属性的序号,从0开始计;<value>是属性值。属性值之间仍用逗号隔开。这里每个实例的数值必须按属性的顺序来写,如 {1 X, 3 Y, 4 “class A”},不能写成{3 Y, 1 X, 4 “class A”}。
注意在稀疏格式中没有注明的属性值不是缺失值,而是0值。若要表示缺失值必须显式的用问号表示出来。

Relational型属性
在WEKA 3.5版中增加了一种属性类型叫做Relational,有了这种类型我们可以像关系型数据库那样处理多个维度了。但是这种类型目前还不见广泛应用,暂不作介绍。

–整理自http://www.cs.waikato.ac.nz/~ml/weka/arff.htmlhttp://weka.sourceforge.net/wekadoc/index.php/en:ARFF_%283.5.3%29

3.数据准备

使用WEKA作数据挖掘,面临的第一个问题往往是我们的数据不是ARFF格式的。幸好,WEKA还提供了对CSV文件的支持,而这种格式是被很多其他软件所支持的。此外,WEKA还提供了通过JDBC访问数据库的功能。
在这一节里,我们先以Excel和Matlab为例,说明如何获得CSV文件。然后我们将知道CSV文件如何转化成ARFF文件,毕竟后者才是WEKA支持得最好的文件格式。面对一个ARFF文件,我们仍有一些预处理要做,才能进行挖掘任务。

.* -> .csv
我们给出一个CSV文件的例子(bank-data.csv)。用UltraEdit打开它可以看到,这种格式也是一种逗号分割数据的文本文件,储存了一个二维表格。

Excel的XLS文件可以让多个二维表格放到不同的工作表(Sheet)中,我们只能把每个工作表存成不同的CSV文件。打开一个XLS文件并切换到需要转换的工作表,另存为CSV类型,点“确定”、“是”忽略提示即可完成操作。

在Matlab中的二维表格是一个矩阵,我们通过这条命令把一个矩阵存成CSV格式。
csvwrite(‘filename’,matrixname)
需要注意的是,Matllab给出的CSV文件往往没有属性名(Excel给出的也有可能没有)。而WEKA必须从CSV文件的第一行读取属性名,否则就会把第一行的各属性值读成变量名。因此我们对于Matllab给出的CSV文件需要用UltraEdit打开,手工添加一行属性名。注意属性名的个数要跟数据属性的个数一致,仍用逗号隔开。

.csv -> .arff
将CSV转换为ARFF最迅捷的办法是使用WEKA所带的命令行工具。
运行WEKA的主程序,出现GUI后可以点击下方按钮进入相应的模块。我们点击进入“Simple CLI”模块提供的命令行功能。在新窗口的最下方(上方是不能写字的)输入框写上
Java weka.core.converters.CSVLoader filename.csv > filename.arff
即可完成转换。
在WEKA 3.5中提供了一个“Arff Viewer”模块,我们可以用它打开一个CSV文件将进行浏览,然后另存为ARFF文件。
进入“Exploer”模块,从上方的按钮中打开CSV文件然后另存为ARFF文件亦可。

“Exploer”界面
我们应该注意到,“Exploer”还提供了很多功能,实际上可以说这是WEKA使用最多的模块。现在我们先来熟悉它的界面,然后利用它对数据进行预处理。

图2 新窗口打开
图2显示的是使用3.5版”Exploer”打开”bank-data.csv”的情况。我们根据不同的功能把这个界面分成8个区域。
区域1的几个选项卡是用来切换不同的挖掘任务面板。这一节用到的只有“Preprocess”,其他面板的功能将在以后介绍。
区域2是一些常用按钮。包括打开数据,保存及编辑功能。我们在这里把”bank-data.csv”另存为”bank-data.arff”。
在区域3中“Choose”某个“Filter”,可以实现筛选数据或者对数据进行某种变换。数据预处理主要就利用它来实现。
区域4展示了数据集的一些基本情况。
区域5中列出了数据集的所有属性。勾选一些属性并“Remove”就可以删除它们,删除后还可以利用区域2的“Undo”按钮找回。区域5上方的一排按钮是用来实现快速勾选的。
在区域5中选中某个属性,则区域6中有关于这个属性的摘要。注意对于数值属性和分类属性,摘要的方式是不一样的。图中显示的是对数值属性“income”的摘要。
区域7是区域5中选中属性的直方图。若数据集的最后一个属性(我们说过这是分类或回归任务的默认目标变量)是分类变量(这里的“pep”正好是),直方图中的每个长方形就会按照该变量的比例分成不同颜色的段。要想换个分段的依据,在区域7上方的下拉框中选个不同的分类属性就可以了。下拉框里选上“No Class”或者一个数值属性会变成黑白的直方图。
区域8是状态栏,可以查看Log以判断是否有错。右边的weka鸟在动的话说明WEKA正在执行挖掘任务。右键点击状态栏还可以执行Java内存的垃圾回收。

预处理
bank-data数据各属性的含义如下:
id a unique identification number
age age of customer in years (numeric)
sex MALE / FEMALE
region inner_city/rural/suburban/town
income income of customer (numeric)
married is the customer married (YES/NO)
children number of children (numeric)
car does the customer own a car (YES/NO)
save_acct does the customer have a saving account (YES/NO)
current_acct does the customer have a current account (YES/NO)
mortgage does the customer have a mortgage (YES/NO)
pep did the customer buy a PEP (Personal Equity Plan) after the last mailing (YES/NO)

通常对于数据挖掘任务来说,ID这样的信息是无用的,我们将之删除。在区域5勾选属性“id”,并点击“Remove”。将新的数据集保存一次,并用UltraEdit打开这个ARFF文件。我们发现,在属性声明部分,WEKA已经为每个属性选好了合适的类型。

我们知道,有些算法,只能处理所有的属性都是分类型的情况。这时候我们就需要对数值型的属性进行离散化。在这个数据集中有3个变量是数值型的,分别是“age”,“income”和“children”。
其中“children”只有4个取值:0,1,2,3。这时我们在UltraEdit中直接修改ARFF文件,把
@attribute children numeric
改为
@attribute children {0,1,2,3}
就可以了。
在“Explorer”中重新打开“bank-data.arff”,看看选中“children”属性后,区域6那里显示的“Type”是不是变成“Nominal”了?

“age”和“income”的离散化我们需要借助WEKA中名为“Discretize”的Filter来完成。在区域2中点“Choose”,出现一棵“Filter树”,逐级找到“weka.filters.unsupervised.attribute.Discretize”,点击。若无法关闭这个树,在树之外的地方点击“Explorer”面板即可。
现在“Choose”旁边的文本框应该显示“Discretize -B 10 -M -0.1 -R first-last”。 点击这个文本框会弹出新窗口以修改离散化的参数。
我们不打算对所有的属性离散化,只是针对对第1个和第4个属性(见区域5属性名左边的数字),故把attributeIndices右边改成“1,4”。计划把这两个属性都分成3段,于是把“bins”改成“3”。其它框里不用更改,关于它们的意思可以点“More”查看。点“OK”回到“Explorer”,可以看到“age”和“income”已经被离散化成分类型的属性。若想放弃离散化可以点区域2的“Undo”。
如果对“”(-inf-34.333333]””这样晦涩的标识不满,我们可以用UltraEdit打开保存后的ARFF文件,把所有的“’\'(-inf-34.333333]\””替换成“0_34”。其它标识做类似地手动替换。

经过上述操作得到的数据集我们保存为bank-data-final.arff

—-整理自http://maya.cs.depaul.edu/~classes/ect584/WEKA/preprocess.html

4. 关联规则(购物篮分析)
注意:目前,WEKA的关联规则分析功能仅能用来作示范,不适合用来挖掘大型数据集。

我们打算对前面的“bank-data”数据作关联规则的分析。用“Explorer”打开“bank-data-final.arff”后,切换到“Associate”选项卡。默认关联规则分析是用Apriori算法,我们就用这个算法,但是点“Choose”右边的文本框修改默认的参数,弹出的窗口中点“More”可以看到各参数的说明。

背景知识
首先我们来温习一下Apriori的有关知识。对于一条关联规则L->R,我们常用支持度(Support)和置信度(Confidence)来衡量它的重要性。规则的支持度是用来估计在一个购物篮中同时观察到L和R的概率P(L,R),而规则的置信度是估计购物栏中出现了L时也出会现R的条件概率P(R|L)。关联规则的目标一般是产生支持度和置信度都较高的规则。
有几个类似的度量代替置信度来衡量规则的关联程度,它们分别是
Lift(提升度?): P(L,R)/(P(L)P(R))
Lift=1时表示L和R独立。这个数越大,越表明L和R存在在一个购物篮中不是偶然现象。
Leverage(不知道怎么翻译):P(L,R)-P(L)P(R)
它和Lift的含义差不多。Leverage=0时L和R独立,Leverage越大L和R的关系越密切。
Conviction(更不知道译了):P(L)P(!R)/P(L,!R) (!R表示R没有发生)
Conviction也是用来衡量L和R的独立性。从它和lift的关系(对R取反,代入Lift公式后求倒数)可以看出,我们也希望这个值越大越好。
值得注意的是,用Lift和Leverage作标准时,L和R是对称的,Confidence和Conviction则不然。

参数设置
现在我们计划挖掘出支持度在10%到100%之间,并且lift值超过1.5且lift值排在前100位的那些关联规则。我们把“lowerBoundMinSupport”和“upperBoundMinSupport”分别设为0.1和1,“metricType”设为lift,“minMetric”设为1.5,“numRules”设为100。其他选项保持默认即可。“OK” 之后在“Explorer”中点击“Start”开始运行算法,在右边窗口显示数据集摘要和挖掘结果。

下面是挖掘出来的lift排前5的规则。
Best rules found:
1. age=52_max save_act=YES current_act=YES 113 ==> income=43759_max 61 conf:(0.54) < lift:(4.05)> lev:(0.0 [45] conv:(1.85)
2. income=43759_max 80 ==> age=52_max save_act=YES current_act=YES 61 conf:(0.76) < lift:(4.05)> lev:(0.0 [45] conv:(3.25)
3. income=43759_max current_act=YES 63 ==> age=52_max save_act=YES 61 conf:(0.97) < lift:(3.85)> lev:(0.0 [45] conv:(15.72)
4. age=52_max save_act=YES 151 ==> income=43759_max current_act=YES 61 conf:(0.4) < lift:(3.85)> lev:(0.0 [45] conv:(1.49)
5. age=52_max save_act=YES 151 ==> income=43759_max 76 conf:(0.5) < lift:(3.77)> lev:(0.09) [55] conv:(1.72)
对于挖掘出的每条规则,WEKA列出了它们关联程度的四项指标。

命令行方式
我们也可以利用命令行来完成挖掘任务,在“Simlpe CLI”模块中输入如下格式的命令:
java weka.associations.Apriori options -t directory-path\bank-data-final.arff
即可完成Apriori算法。注意,“-t”参数后的文件路径中不能含有空格。
在前面我们使用的option为
-N 100 -T 1 -C 1.5 -D 0.05 -U 1.0 -M 0.1 -S -1.0 命令行中使用这些参数得到的结果和前面利用GUI得到的一样。
我们还可以加上“- I”参数,得到不同项数的频繁项集。我用的命令如下:
java weka.associations.Apriori -N 100 -T 1 -C 1.5 -D 0.05 -U 1.0 -M 0.1 -S -1.0 -I -t d:\weka\bank-data-final.arff
挖掘结果在上方显示,应是这个文件的样子。

—-整理自http://maya.cs.depaul.edu/~classes/ect584/WEKA/associate.html

5. 分类与回归

背景知识
WEKA把分类(Classification)和回归(Regression)都放在“Classify”选项卡中,这是有原因的。
在这两个任务中,都有一个目标属性(输出变量)。我们希望根据一个样本(WEKA中称作实例)的一组特征(输入变量),对目标进行预测。为了实现这一目的,我们需要有一个训练数据集,这个数据集中每个实例的输入和输出都是已知的。观察训练集中的实例,可以建立起预测的模型。有了这个模型,我们就可以新的输出未知的实例进行预测了。衡量模型的好坏就在于预测的准确程度。
在WEKA中,待预测的目标(输出)被称作Class属性,这应该是来自分类任务的“类”。一般的,若Class属性是分类型时我们的任务才叫分类,Class属性是数值型时我们的任务叫回归。

选择算法
这一节中,我们使用C4.5决策树算法对bank-data建立起分类模型。
我们来看原来的“bank-data.csv”文件。“ID”属性肯定是不需要的。由于C4.5算法可以处理数值型的属性,我们不用像前面用关联规则那样把每个变量都离散化成分类型。尽管如此,我们还是把“Children”属性转换成分类型的两个值“YES”和“NO”。另外,我们的训练集仅取原来数据集实例的一半;而从另外一半中抽出若干条作为待预测的实例,它们的“pep”属性都设为缺失值。经过了这些处理的训练集数据在这里下载;待预测集数据在这里下载。

我们用“Explorer”打开训练集“bank.arff”,观察一下它是不是按照前面的要求处理好了。切换到“Classify”选项卡,点击“Choose”按钮后可以看到很多分类或者回归的算法分门别类的列在一个树型框里。3.5版的WEKA中,树型框下方有一个“Filter…”按钮,点击可以根据数据集的特性过滤掉不合适的算法。我们数据集的输入属性中有“Binary”型(即只有两个类的分类型)和数值型的属性,而Class变量是“Binary”的;于是我们勾选“Binary attributes”“Numeric attributes”和“Binary class”。点“OK”后回到树形图,可以发现一些算法名称变红了,说明它们不能用。选择“trees”下的“J48”,这就是我们需要的C4.5算法,还好它没有变红。
点击“Choose”右边的文本框,弹出新窗口为该算法设置各种参数。点“More”查看参数说明,点“Capabilities”是查看算法适用范围。这里我们把参数保持默认。
现在来看左中的“Test Option”。我们没有专门设置检验数据集,为了保证生成的模型的准确性而不至于出现过拟合(overfitting)的现象,我们有必要采用10折交叉验证(10-fold cross validation)来选择和评估模型。若不明白交叉验证的含义可以Google一下。

建模结果
OK,选上“Cross-validation”并在“Folds”框填上“10”。点“Start”按钮开始让算法生成决策树模型。很快,用文本表示的一棵决策树,以及对这个决策树的误差分析等等结果出现在右边的“Classifier output”中。同时左下的“Results list”出现了一个项目显示刚才的时间和算法名称。如果换一个模型或者换个参数,重新“Start”一次,则“Results list”又会多出一项。

我们看到“J48”算法交叉验证的结果之一为
Correctly Classified Instances 206 68.6667 %
也就是说这个模型的准确度只有69%左右。也许我们需要对原属性进行处理,或者修改算法的参数来提高准确度。但这里我们不管它,继续用这个模型。

右键点击“Results list”刚才出现的那一项,弹出菜单中选择“Visualize tree”,新窗口里可以看到图形模式的决策树。建议把这个新窗口最大化,然后点右键,选“Fit to screen”,可以把这个树看清楚些。看完后截图或者关掉

这里我们解释一下“Confusion Matrix”的含义。
=== Confusion Matrix ===
a b <– classified as
74 64 | a = YES
30 132 | b = NO
这个矩阵是说,原本“pep”是“YES”的实例,有74个被正确的预测为“YES”,有64个错误的预测成了“NO”;原本“pep”是“NO”的实例,有30个被错误的预测为“YES”,有132个正确的预测成了“NO”。74+64+30+132 = 300是实例总数,而(74+132)/300 = 0.68667正好是正确分类的实例所占比例。这个矩阵对角线上的数字越大,说明预测得越好。

模型应用
现在我们要用生成的模型对那些待预测的数据集进行预测了。注意待预测数据集和训练用数据集各个属性的设置必须是一致的。即使你没有待预测数据集的Class属性的值,你也要添加这个属性,可以将该属性在各实例上的值均设成缺失值。
在“Test Opion”中选择“Supplied test set”,并且“Set”成你要应用模型的数据集,这里是“bank-new.arff”文件。
现在,右键点击“Result list”中刚产生的那一项,选择“Re-evaluate model on current test set”。右边显示结果的区域中会增加一些内容,告诉你该模型应用在这个数据集上表现将如何。如果你的Class属性都是些缺失值,那这些内容是无意义的,我们关注的是模型在新数据集上的预测值。
现在点击右键菜单中的“Visualize classifier errors”,将弹出一个新窗口显示一些有关预测误差的散点图。点击这个新窗口中的“Save”按钮,保存一个Arff文件。打开这个文件可以看到在倒数第二个位置多了一个属性(predictedpep),这个属性上的值就是模型对每个实例的预测值。

使用命令行(推荐)
虽然使用图形界面查看结果和设置参数很方便,但是最直接最灵活的建模及应用的办法仍是使用命令行。
打开“Simple CLI”模块,像上面那样使用“J48”算法的命令格式为:
java weka.classifiers.trees.J48 -C 0.25 -M 2 -t directory-path\bank.arff -d directory-path \bank.model
其中参数“ -C 0.25”和“-M 2”是和图形界面中所设的一样的。“-t ”后面跟着的是训练数据集的完整路径(包括目录和文件名),“-d ”后面跟着的是保存模型的完整路径。注意!这里我们可以把模型保存下来。
输入上述命令后,所得到树模型和误差分析会在“Simple CLI”上方显示,可以复制下来保存在文本文件里。误差是把模型应用到训练集上给出的。
把这个模型应用到“bank-new.arff”所用命令的格式为:
java weka.classifiers.trees.J48 -p 9 -l directory-path\bank.model -T directory-path \bank-new.arff
其中“-p 9”说的是模型中的待预测属性的真实值存在第9个(也就是“pep”)属性中,这里它们全部未知因此全部用缺失值代替。“-l”后面是模型的完整路径。“-T”后面是待预测数据集的完整路径。
输入上述命令后,在“Simple CLI”上方会有这样一些结果:
0 YES 0.75 ?
1 NO 0.7272727272727273 ?
2 YES 0.95 ?
3 YES 0.8813559322033898 ?
4 NO 0.8421052631578947 ?

这里的第一列就是我们提到过的“Instance_number”,第二列就是刚才的“predictedpep”,第四列则是“bank-new.arff”中原来的“pep”值(这里都是“?”缺失值)。第三列对预测结果的置信度(confidence )。比如说对于实例0,我们有75%的把握说它的“pep”的值会是“YES”,对实例4我们有84.2%的把握说它的“pep”值会是“NO”。
我们看到,使用命令行至少有两个好处。一个是可以把模型保存下来,这样有新的待预测数据出现时,不用每次重新建模,直接应用保存好的模型即可。另一个是对预测结果给出了置信度,我们可以有选择的采纳预测结果,例如,只考虑那些置信度在85%以上的结果。

—-整理自http://maya.cs.depaul.edu/~classes/ect584/WEKA/classify.html

6. 聚类分析

原理与实现
聚类分析中的“类”(cluster)和前面分类的“类”(class)是不同的,对cluster更加准确的翻译应该是“簇”。聚类的任务是把所有的实例分配到若干的簇,使得同一个簇的实例聚集在一个簇中心的周围,它们之间距离的比较近;而不同簇实例之间的距离比较远。对于由数值型属性刻画的实例来说,这个距离通常指欧氏距离。
现在我们对前面的“bank data”作聚类分析,使用最常见的K均值(K-means)算法。下面我们简单描述一下K均值聚类的步骤。
K均值算法首先随机的指定K个簇中心。然后:1)将每个实例分配到距它最近的簇中心,得到K个簇;2)计分别计算各簇中所有实例的均值,把它们作为各簇新的簇中心。重复1)和2),直到K个簇中心的位置都固定,簇的分配也固定。

上述K均值算法只能处理数值型的属性,遇到分类型的属性时要把它变为若干个取值0和1的属性。WEKA将自动实施这个分类型到数值型的变换,而且WEKA会自动对数值型的数据作标准化。因此,对于原始数据“bank-data.csv”,我们所做的预处理只是删去属性“id”,保存为ARFF格式后,修改属性“children”为分类型。这样得到的数据文件为“bank.arff”,含600条实例。

用“Explorer”打开刚才得到的“bank.arff”,并切换到“Cluster”。点“Choose”按钮选择“SimpleKMeans”,这是WEKA中实现K均值的算法。点击旁边的文本框,修改“numClusters”为6,说明我们希望把这600条实例聚成6类,即K=6。下面的“seed”参数是要设置一个随机种子,依此产生一个随机数,用来得到K均值算法中第一次给出的K个簇中心的位置。我们不妨暂时让它就为10。
选中“Cluster Mode”的“Use training set”,点击“Start”按钮,观察右边“Clusterer output”给出的聚类结果。也可以在左下角“Result list”中这次产生的结果上点右键,“View in separate window”在新窗口中浏览结果。

结果解释
首先我们注意到结果中有这么一行:
Within cluster sum of squared errors: 1604.7416693522332
这是评价聚类好坏的标准,数值越小说明同一簇实例之间的距离越小。也许你得到的数值会不一样;实际上如果把“seed”参数改一下,得到的这个数值就可能会不一样。我们应该多尝试几个seed,并采纳这个数值最小的那个结果。例如我让“seed”取100,就得到
Within cluster sum of squared errors: 1555.6241507629218
我该取后面这个。当然再尝试几个seed,这个数值可能会更小。

接下来“Cluster centroids:”之后列出了各个簇中心的位置。对于数值型的属性,簇中心就是它的均值(Mean);分类型的就是它的众数(Mode),也就是说这个属性上取值为众数值的实例最多。对于数值型的属性,还给出了它在各个簇里的标准差(Std Devs)。

最后的“Clustered Instances”是各个簇中实例的数目及百分比。

为了观察可视化的聚类结果,我们在左下方“Result list”列出的结果上右击,点“Visualize cluster assignments”。弹出的窗口给出了各实例的散点图。最上方的两个框是选择横坐标和纵坐标,第二行的“color”是散点图着色的依据,默认是根据不同的簇“Cluster”给实例标上不同的颜色。
可以在这里点“Save”把聚类结果保存成ARFF文件。在这个新的ARFF文件中,“instance_number”属性表示某实例的编号,“Cluster”属性表示聚类算法给出的该实例所在的簇。

—-整理自 http://maya.cs.depaul.edu/~classes/ect584/WEKA/k-means.html