Weka 教學

(UI & Code) 

 

建立訓練資料集

使用excel建立

打開Execl

輸入下面程式碼,下拉新增100筆訓練資料。

另存檔案 副檔名為 *.csv

 

RAND() -產生亂數

ROUND("value",X) -四捨五入到x位

IF("value"> 500,"1","0") - value大於500為1,否則為0。

=ROUND(RAND()*1024,0)
=IF("value">500,"1","0")

"value" - 要判斷的欄位

value:

state:

Weka

Weka資料型態轉換

步驟:

  1. 開啟Weka
  2. 點選Explorer
  3. 載入訓練資料
  4. 修改資料屬性型態
    在這裡我們使用的範例需要的型態
    value   Numeric
    state  →  Nominal
  5. 令存檔案為*.arff檔

 

操作說明(一)

操作說明(二)

修改資料屬性型態 :

點選Choose,選擇路徑

weka > filters > unsupervise > attribute > NumericToNominal

操作說明(三)

點選紅色方框選擇型態修改的套用範圍(如下圖所示),原本first-last 修改成 last(如右圖所示)  按下OK ,按下Apply套用所制定的修改型態。

最後把修改完的屬性儲存點選Save...,存儲檔案副檔名為*.arff檔。

 

Weka(圖形介面)

使用NaiveBayes做分類

Weka訓練分類model

  1. 點選Classify
  2. Choose需要分類的演算法,這裡我們使用NaiveBayes。
    Path : weka > classifiers  > bayes > NaiveBayes
  3. 選擇使用訓練集來訓練model。
  4. 選擇要預測的屬性。
  5. 開始訓練model。

操作說明 :

Weka 使用model分類

  1. 選擇已訓練的model。
     
  2. 輸入要分類的測試集。
    PS.輸入的測試集需要跟訓練集屬性的型態相同。
     
  3. 點選More options...,
    把Output predictions勾選。
     
  4. 點選Start,開始預測分類。

操作說明 :

預測結果

Weka(Java Library)

使用NaiveBayes做分類

使用Eclipse IDE(一)

  1. 建立新專案及Main類別
     
  2. 建立一個lib資料夾,放入weka.jar(在weka安裝路徑下)、mysql-connent-java-5.1.37-bin.jar。
     
  3. 載入jar方式在專案按下右鍵點選Build Path → Configure Build Path...

使用Eclipse IDE(二)

  1. 點選Add JARs...
     
  2. 選擇所需的lib

讀取arff檔 :

    import java.io.BufferedReader;
    import java.io.FileReader;
    import weka.core.Instances;
    ...
    BufferedReader reader = new BufferedReader(
                                        new FileReader("arff檔的路徑"));
    Instances training = new Instances(reader);
    reader.close();

    //顯示資料
    System.out.println(training);

讀取database(一)

	import weka.core.Instances;
	import weka.experiment.InstanceQuery;
	...
	public static final String URL = "jdbc:mysql://資料庫IP:3306/資料庫名稱";
	public final static String USER = "使用者帳號";
	public final static String PASSWORD = "使用者密碼";

	InstanceQuery query = new InstanceQuery();
	query.setUsername(USER);
	query.setPassword(PASSWORD);
	query.setDatabaseURL(URL);
	query.setQuery("select * from {資料表}");
	Instances data = query.retrieveInstances();

	//顯示資料
	System.out.println(data );

讀取database(二)

執行完會產生錯誤訊息 : 

解決方式 : 

  1. 使用解壓縮軟體開啟weka.jar檔
  2. 路徑weka.jar\weka\experiment下找到DatabaseUtils.props,並且解壓縮該檔案。
  3. 使用文字編輯器修改DatabaseUtils.props,並輸入下列程式碼,之後將該檔案再拉回解壓縮軟體,即可修復該錯誤訊息。

 

# Database settings for MySQL 3.23.x, 4.x
#
# General information on database access can be found here:
# http://weka.wikispaces.com/Databases
#
# url:     http://www.mysql.com/
# jdbc:    http://www.mysql.com/products/connector/j/
# author:  Fracpete (fracpete at waikato dot ac dot nz)
# version: $Revision: 5836 $

# JDBC driver (comma-separated list)
jdbcDriver=org.gjt.mm.mysql.Driver
#jdbcDriver=com.mysql.jdbc.Driver

# database URL
#jdbcURL=jdbc:mysql://server_name:3306/database_name
#jdbcURL=jdbc:mysql://localhost:3306/rtest
# specific data types
# string, getString() = 0;    --> nominal
# boolean, getBoolean() = 1;  --> nominal
# double, getDouble() = 2;    --> numeric
# byte, getByte() = 3;        --> numeric
# short, getByte()= 4;        --> numeric
# int, getInteger() = 5;      --> numeric
# long, getLong() = 6;        --> numeric
# float, getFloat() = 7;      --> numeric
# date, getDate() = 8;        --> date
# text, getString() = 9;      --> string
# time, getTime() = 10;       --> date

# specific data types
 string, getString() = 0;    --> nominal
 boolean, getBoolean() = 1;  --> nominal
 double, getDouble() = 2;    --> numeric
 byte, getByte() = 3;        --> numeric
 short, getByte()= 4;        --> numeric
 int, getInteger() = 5;      --> numeric
 long, getLong() = 6;        --> numeric
 float, getFloat() = 7;      --> numeric
 date, getDate() = 8;        --> date
 text, getString() = 9;      --> string
 time, getTime() = 10;       --> date
TINYINT=3
SMALLINT=4
#SHORT=4
SHORT=5
INTEGER=5
INT=5
INT_UNSIGNED=6
BIGINT=6
LONG=6
REAL=7
NUMERIC=2
DECIMAL=2
FLOAT=2
DOUBLE=2
CHAR=0
TEXT=0
VARCHAR=0
LONGVARCHAR=9
BINARY=0
VARBINARY=0
LONGVARBINARY=9
BIT=1
BLOB=9
DATE=8
TIME=8
DATETIME=8
TIMESTAMP=8

# other options
CREATE_DOUBLE=DOUBLE
CREATE_STRING=TEXT
CREATE_INT=INT
CREATE_DATE=DATETIME
DateFormat=yyyy-MM-dd HH:mm:ss
checkUpperCaseNames=false
checkLowerCaseNames=false
checkForTable=true

# All the reserved keywords for this database
# Based on the keywords listed at the following URL (2009-04-13):
# http://dev.mysql.com/doc/mysqld-version-reference/en/mysqld-version-reference-reservedwords-5-0.html
Keywords=\
  ADD,\
  ALL,\
  ALTER,\
  ANALYZE,\
  AND,\
  AS,\
  ASC,\
  ASENSITIVE,\
  BEFORE,\
  BETWEEN,\
  BIGINT,\
  BINARY,\
  BLOB,\
  BOTH,\
  BY,\
  CALL,\
  CASCADE,\
  CASE,\
  CHANGE,\
  CHAR,\
  CHARACTER,\
  CHECK,\
  COLLATE,\
  COLUMN,\
  COLUMNS,\
  CONDITION,\
  CONNECTION,\
  CONSTRAINT,\
  CONTINUE,\
  CONVERT,\
  CREATE,\
  CROSS,\
  CURRENT_DATE,\
  CURRENT_TIME,\
  CURRENT_TIMESTAMP,\
  CURRENT_USER,\
  CURSOR,\
  DATABASE,\
  DATABASES,\
  DAY_HOUR,\
  DAY_MICROSECOND,\
  DAY_MINUTE,\
  DAY_SECOND,\
  DEC,\
  DECIMAL,\
  DECLARE,\
  DEFAULT,\
  DELAYED,\
  DELETE,\
  DESC,\
  DESCRIBE,\
  DETERMINISTIC,\
  DISTINCT,\
  DISTINCTROW,\
  DIV,\
  DOUBLE,\
  DROP,\
  DUAL,\
  EACH,\
  ELSE,\
  ELSEIF,\
  ENCLOSED,\
  ESCAPED,\
  EXISTS,\
  EXIT,\
  EXPLAIN,\
  FALSE,\
  FETCH,\
  FIELDS,\
  FLOAT,\
  FLOAT4,\
  FLOAT8,\
  FOR,\
  FORCE,\
  FOREIGN,\
  FROM,\
  FULLTEXT,\
  GOTO,\
  GRANT,\
  GROUP,\
  HAVING,\
  HIGH_PRIORITY,\
  HOUR_MICROSECOND,\
  HOUR_MINUTE,\
  HOUR_SECOND,\
  IF,\
  IGNORE,\
  IN,\
  INDEX,\
  INFILE,\
  INNER,\
  INOUT,\
  INSENSITIVE,\
  INSERT,\
  INT,\
  INT1,\
  INT2,\
  INT3,\
  INT4,\
  INT8,\
  INTEGER,\
  INTERVAL,\
  INTO,\
  IS,\
  ITERATE,\
  JOIN,\
  KEY,\
  KEYS,\
  KILL,\
  LABEL,\
  LEADING,\
  LEAVE,\
  LEFT,\
  LIKE,\
  LIMIT,\
  LINES,\
  LOAD,\
  LOCALTIME,\
  LOCALTIMESTAMP,\
  LOCK,\
  LONG,\
  LONGBLOB,\
  LONGTEXT,\
  LOOP,\
  LOW_PRIORITY,\
  MATCH,\
  MEDIUMBLOB,\
  MEDIUMINT,\
  MEDIUMTEXT,\
  MIDDLEINT,\
  MINUTE_MICROSECOND,\
  MINUTE_SECOND,\
  MOD,\
  MODIFIES,\
  NATURAL,\
  NOT,\
  NO_WRITE_TO_BINLOG,\
  NULL,\
  NUMERIC,\
  ON,\
  OPTIMIZE,\
  OPTION,\
  OPTIONALLY,\
  OR,\
  ORDER,\
  OUT,\
  OUTER,\
  OUTFILE,\
  PRECISION,\
  PRIMARY,\
  PRIVILEGES,\
  PROCEDURE,\
  PURGE,\
  READ,\
  READS,\
  REAL,\
  REFERENCES,\
  REGEXP,\
  RELEASE,\
  RENAME,\
  REPEAT,\
  REPLACE,\
  REQUIRE,\
  RESTRICT,\
  RETURN,\
  REVOKE,\
  RIGHT,\
  RLIKE,\
  SCHEMA,\
  SCHEMAS,\
  SECOND_MICROSECOND,\
  SELECT,\
  SENSITIVE,\
  SEPARATOR,\
  SET,\
  SHOW,\
  SMALLINT,\
  SONAME,\
  SPATIAL,\
  SPECIFIC,\
  SQL,\
  SQLEXCEPTION,\
  SQLSTATE,\
  SQLWARNING,\
  SQL_BIG_RESULT,\
  SQL_CALC_FOUND_ROWS,\
  SQL_SMALL_RESULT,\
  SSL,\
  STARTING,\
  STRAIGHT_JOIN,\
  TABLE,\
  TABLES,\
  TERMINATED,\
  THEN,\
  TINYBLOB,\
  TINYINT,\
  TINYTEXT,\
  TO,\
  TRAILING,\
  TRIGGER,\
  TRUE,\
  UNDO,\
  UNION,\
  UNIQUE,\
  UNLOCK,\
  UNSIGNED,\
  UPDATE,\
  UPGRADE,\
  USAGE,\
  USE,\
  USING,\
  UTC_DATE,\
  UTC_TIME,\
  UTC_TIMESTAMP,\
  VALUES,\
  VARBINARY,\
  VARCHAR,\
  VARCHARACTER,\
  VARYING,\
  WHEN,\
  WHERE,\
  WHILE,\
  WITH,\
  WRITE,\
  XOR,\
  YEAR_MONTH,\
  ZEROFILL

# The character to append to attribute names to avoid exceptions due to
# clashes between keywords and attribute names
KeywordsMaskChar=_

#flags for loading and saving instances using DatabaseLoader/Saver
nominalToStringLimit=50
idColumn=auto_generated_id

程式碼可以下拉 ↓ 請完整複製

更新database

	import weka.core.Instances;
	import weka.experiment.InstanceQuery;
	...
	public static final String URL = "jdbc:mysql://資料庫IP:3306/資料庫名稱";
	public final static String USER = "使用者帳號";
	public final static String PASSWORD = "使用者密碼";

	InstanceQuery query = new InstanceQuery();
	query.setUsername(USER);
	query.setPassword(PASSWORD);
	query.setDatabaseURL(URL);
        
        //執行更新sql
        /*
         * UPDATE light SET state = 0 WHERE id=1
         * 更新light 資料表 id = 1 更改 state = 0
         * EX: query.execute("UPDATE light SET state = 0 WHERE id=1");
         */
        query.execute("Sql語法");

Filter

	Remove remove=new Remove();

	String[] options= new String[2];
	options[0]="-R"; //範圍
	options[1]="1,4"; //第1個、第4個屬性
	        
	remove.setOptions(options);
	remove.setInputFormat(data);
	Instances dataClusterer = Filter.useFilter(data, remove);

刪除屬性 :

數值轉名詞屬性 :

	NumericToNominal convert= new NumericToNominal();

	String[] options= new String[2];
	options[0]="-R";
	options[1]="2";

	convert.setOptions(options);
	convert.setInputFormat(removedata);
	Instances Dataset=Filter.useFilter(removedata, convert);

貝氏分類

	BufferedReader reader = new BufferedReader(new FileReader("arff檔的路徑"));
	Instances training = new Instances(reader);
	reader.close();

	// 設定要分類的屬性
	training.setClassIndex(training.numAttributes() - 1);

	// 實作貝氏分類
	NaiveBayes nb = new NaiveBayes();

	// 開始訓練
	nb.buildClassifier(training);


	/*
	 * 分類 
	 * 基於測試:這邊使用訓練集的資料來做分類
	 */
	double result = nb.classifyInstance(training.instance(0));
	System.out.println(training.instance(0).value(0) + "," + result);

使用PHP取得Mysql資料

資料庫欄位

PHP 連接Mysql

<?php
    //使用者資訊
    $host = "主機IP";
    $user = "使用者帳號";
    $pass = "使用者密碼";

    //資料庫資訊
    $databaseName = "資料庫";
    $tableName = "資料表";

    //連結資料庫
    $con = mysql_connect($host,$user,$pass);
    $dbs = mysql_select_db($databaseName, $con);


    //資料庫Sql query語法
    $sql = "SELECT * FROM $tableName";

    //執行query語法
    $result = mysql_query($sql);

    //取出資料
    $data=array();
    while ($row = mysql_fetch_array($result)){
      array_push($data, $row);
    }

    //輸出並且轉成json格式
    echo json_encode($data);
?>

Code :

HighCharts

HTML

<!DOCTYPE html>
<html lang="zh-tw">
<head>
	<!--<meta charset="UTF-8" http-equiv="refresh" content="5">-->

	<title>Highcharts</title>
		<!-- jQuery js>
		<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
		
		<!--include the highcharts library-->
		<script src="http://code.highcharts.com/highcharts.js"></script>

<body>
	<div class="container">
		<div id="container" style="min-width: 310px; height: 400px; margin: 0 auto">
                    Insert Highchart Here
                </div>
	</div>		
</body>
</html>

建立一個highchart.html檔:

highchats初始化

<script language="javascript">
$(function(){
	$('#container').highcharts({
                        //標題
			title: { 
				text: 'Sensor data from MySQL to Highcharts',
				x: -20 //center
			},
                        //子標題
			subtitle: { 
				text: 'Light Value',
				x: -20
			},
                        //設定X座標
			xAxis: {
                                //X座標標題
				title: {
				    text: 'Time'
				},
                                //設定X間格
				categories: [1,2,3,4,5],
				labels:{
                                        //隱藏X軸的標籤
					enabled: false,
				}
			},
                        //設定Y座標
			yAxis: {
                                //Y座標標題
				title: {
				    text: 'value',
				}
			},
                        //圖表的資料
			series: [{
				name: 'Sensor-Light',
				data: [10,2,6,4,5]
			}]
		});
})
</script>

將下列程式碼貼在highcharts.html的<head></head>之間。

更改資料點的顏色

	series: [{
		name: 'Sensor-Light',
		data: [
                            {y:10 ,fillColor:'#FF0000'},
                            {y:6  ,fillColor:'#00FF00'},
                            {y:14 ,fillColor:'#0000FF'}
                      ]
	        }]

把原本的series,data增加一個fillColor屬性,如下:

Jquery Ajax

<script>
	$(function () {
		$.ajax({									  
			url: 'database.php',//連接的URL	  
			data: "{}",//夾帶的參數
			dataType: 'json', //資料格式 
			success: function(data)	//傳送成功的function
			{	
				for (var i = 0; i < data.length; i++)
				{
                                        //案F12選擇console 即可看到訊息
                                        console.log(
                                                    "value=" + data[i]['value'] + "," +
                                                    "state=" + data[i]['state'] + "," +
                                                    "time=" + data[i]['time']
                                                   );
				}
			} 

		});
	});
</script>

Jquery Ajax + HighCharts

<script>
$(function () {
	$.ajax({									  
		url: 'database.php',//連接的URL	  
		data: "{}",//夾帶的參數
		dataType: 'json', //資料格式 
		success: function(data)	//傳送成功的function
		{			
			var values = [];
			var time = [];
			for (var i = 0; i < data.length; i++)
			{
				values.push(parseInt(data[i]['value']));
				time.push(data[i]['time']);
			}

			$('#container').highcharts({
                                //標題
				title: { 
					text: 'Sensor data from MySQL to Highcharts',
					x: -20 //center
				},
		                //子標題
				subtitle: { 
					text: 'Light Value',
					x: -20
				},
		                //設定X座標
				xAxis: {
		                        //X座標標題
					title: {
					    text: 'Time'
					},
		                        //設定X間格
					categories: time,
					labels:{
		                                //隱藏X軸的標籤
						enabled: false,
					}
				},
		                //設定Y座標
				yAxis: {
		                         //Y座標標題
					title: {
					    text: 'value',
					}
				},
		                //圖表的資料
				series: [{
					name: 'Sensor-Light',
					data: values
				}]
			});
		} 

	});
});
</script>

原始碼參考

Weka 教學

By isamare0304

Weka 教學

weka介紹

  • 1,588