前言
模糊数据库,是指能够处理模糊数据的数据库。一般的数据库都是以二直逻辑和精确的数据工具为基础的,不能表示许多模糊不清的事情。随着模糊数学理论体系的建立,人们可以用数量来描述模糊事件并能进行模糊运算。这样就可以把不完全性、不确定性、模糊性引入数据库系统中,从而形成模糊数据库。模糊数据库研究主要有两方面,首先是如何在数据库中存放模糊数据;其次是定义各种运算建立模糊数据上的函数。模糊数的表示主要有模糊区间数、模糊中心数、模糊集合数和隶属函数等。
自从1965年美国加州大学伯克利分校的LoftiZadeh提出了模糊逻辑以来,人类在这一领域内的研究一直没有终止过;在数据库领域内,模糊逻辑理论也得到了一定的应用,本文就模糊数据的输入与判别谈一下自己的认识,意在抛砖引玉。
一、模糊逻辑基本原理;;
U 为某些对象的集合,称为论域,可以是连续的或离散的;u 表示U 的元素,记作U ={u}。
定义1 模糊集合(fuzzy sets) 论域U 到[0,1]区间的任一映射mF ,即mF :U ®[0,1],都确定U 的一个模糊子集F ;mF称为F的隶属函数(membership function)或隶属度(grade of membership)。也就是说,mF 表示u属于模糊子集F的程度或等级。在论域U中,可把模糊子集表示为元素u与其隶属函数mF(u)的序偶集合,记为:
F ={(u,mF(u)|uÎU)};;
若U 为连续,则模糊集F 可记作:
F =òUmF(u)/u;;
若U 为离散,则模糊集F 可记为:
F=mF(u1)/u1+mF(u2)/u2+….+mF(un)/un= åmF(ui)/ui;;
定义2 模糊支集、交叉点及模糊单点 如果模糊集是论域U 中所有满足mF(u)>0的元素u 构成的集合,则称该集合为模糊集F的支集。当u 满足mF =10,则称此模糊集为模糊单点。;;
定义3 语言变量 一个语言变量可定义为多元组(x,T(x),U,G,M)。其中,x为变量名;T(x)为x的词集,即语言值名称的集合;U 为论域;G 是产生语言值名称的语法规则;M 是与各语言值含义有关的语法规则。语言变量的每个语言值对应一个定义在论域U 中的模糊数。语言变量基本词集把模糊概念与精确值联系起来,实现对定性概念的定量化以及定量数据的定性模糊化。 例如,某浴室锅炉把水的温度作为一个语言变量,其词集T(温度)可为:
T(温度)={超高,很高,较高,适中,较低,很低,过低}
二、 数据库中存放模糊数据的方法
1、 数据模型的选择
近年应用较多的数据库模型主要有关系数据模型、面向对象模型、对象-关系数据模型。
模糊数据库要求存储的数据具有抽象度高、数据类型复杂、面向对象操作的特点,特别针对模糊识别功能的实现还必须具即时的隶属函数。
关系数据模型具有结构统一、面向记录、有限数据类型、不能清晰表示和有效处理复杂对象的缺点,难以满足模糊数据库的需求。
面向对象数据库管理系统(OODBMS)是从对象观点出发,移向数据库管理思维,以面向对象的程序设计语言为基础的持久化的程序设计语言,目前实行的是ODMG-93标准,适合于具有复杂数据要求的工程、图形、多媒体等领域,是目前比较先进的一种数据模型理念。但是它在查询、事物管理和并发方面较差,而且用户端的参与不好,同时由于其属于新生事物,尚不成熟,因此各大数据库厂家对其的支持较差,可谓“曲高和寡”。因此也不是最好的选择。
对象-关系数据库管理系统(ORDBMS)是从关系数据库观点出发,移向对象思维,以关系数据库和SQL为基础的扩展关系模型,具扩展复杂数据类型和允许用户自定义函数(SQL或C语言)功能。具面向对象特性,受通用性强的SQL3(SQL99)标准支持。ORDBMS既满足了传统关系型数据库用户的要求,同时又具有复杂数据需要的应用,具强大查询语言功能,同时也有很多大的数据库厂商支持。是建立模糊数据库的最佳选择。
2、 数据模型的建立
首先建立非1NF文档关系:
[sayyes]http://www.computerworld.com.cn/htm/app/service/01_7_13_3.gif[/sayyes]
以例某浴室锅炉把水的温度作为一个语言变量,其词集T(温度)可为:
T(温度)={超高,很高,较高,适中,较低,很低,过低}
----------------------------------------------------------------------------
SQL99语句:
Create type mynum1 integer varying.
Create type mynum2 numeric varying.
/*建立复杂类型*/
create table temperature
(fuzzytemp char(4),
x mynum1 [10],
mn mynum2 [10],
/*使用数组,以确定各数的位置*/
check (fuzzytemp in (‘超高’,’很高’,’较高’,’适中’,’较低’,’很低’,’过低’))
create table measure
(time time,
temp smallint;
check (temp<=100))
三、模糊数据的判决
通过模糊推理得到的结果是一个模糊集合或者隶属函数,但在实际使用中,特别是在模糊逻辑控制中,必须用一个确定的值才能去控制伺服机构。在推理得到的模糊集合中取一个相对最能代表这个模糊集合的单值的过程就称作模糊判决或解模糊(Defuzzification)。模糊判决可以采用不同的方法,用不同的方法所得到的结果也是不同的。理论上用重心法比较合理,但是计算比较复杂,因而在实时性要求较高的系统不采用这种方法。最简单的方法是最大隶属度方法,这种方法取所有模糊集合或者隶属函数中隶属度最大的那个值作为输出,但是这种方法未考虑其他隶属度较小的值的影响,代表性不好,所以它往往用于比较简单的系统。介于这两者之间的还有几种平均法:如加权平均法、隶属度限幅(α-cut)元素平均法等。下面介绍各种模糊判决方法,并以“水温适中”为例,说明不同方法的计算过程及其SQL查询的实现。
这里假设“水温适中”的隶属函数为:
mN(xi)={X: 0.0/0+0.0/10+0.33/20+0.67/30+1.0/40+1.0/50+0.75/60+0.5/70+0.25/80+0.0/90+0.0/100}
1. 重心法
所谓重心法就是取模糊隶属函数曲线与横坐标轴围成面积的重心作为代表点。理论上应该计算输出范围内一系列连续点的重心,即
u =åxi×mN(xi)/åmN(xi) 但实际上是计算输出范围内整个采样点(即若干离散值)的重心。这样,在不花太多时间的情况下,用足够小的取样间隔来提供所需要的精度,这是一种最好的折衷方案。即;;
u =åxi×mN(xi)/åmN(xi)
=(0·0.0+10·0.0+20·0.33+30·0.67+40·1.0+50·1.0
+60·0.75+70·0.5+80·0.25+90·0.0+100·0.0)
/(0.0+0.0+0.33+0.67+1.0+1.0+0.75+0.5+0.25+0.0+0.0)
=48.2
在隶属函数不对称的情况下,其输出的代表值是48.2℃。如果模糊集合中没有48.2℃,那么就选取最靠近的一个温度值50℃输出。
2. 最大隶属度法
这种方法最简单,只要在推理结论的模糊集合中取隶属度最大的那个元素作为输出量即可。不过,要求这种情况下其隶属函数曲线一定是正规凸模糊集合(即其曲线只能是单峰曲线)。如果该曲线是梯形平顶的,那么具有最大隶属度的元素就可能不止一个,这时就要对所有取最大隶属度的元素求其平均值。例如,对于“水温适中”,按最大隶属度原则,有两个元素40和50具有最大隶属度1.0,那就要对所有取最大隶属度的元素40和50求平均值,执行量应取:
umax=(40+50)/2=45
3. 系数加权平均法
系数加权平均法的输出执行量由下式决定:
u =Ski×xi/Ski;;
式中,系数ki的选择要根据实际情况而定,不同的系统就决定系统有不同的响应特性。当该系数选择ki=mN(xi)时,即取其隶属函数时,这就是重心法。在模糊逻辑控制中,可以通过选择和调整该系数来改善系统的响应特性。因而这种方法具有灵活性。
4. 隶属度限幅元素平均法
用所确定的隶属度值α对隶属度函数曲线进行切割,再对切割后等于该隶属度的所有元素进行平均,用这个平均值作为输出执行量,这种方法就称为隶属度限幅元素平均法。
例如,当取α为最大隶属度值时,表示“完全隶属”关系,这时α=1.0。在“水温适中”的情况下,40℃和50℃的隶属度是1.0,求其平均值得到输出代表量:
u =(40+50)/2=45
这样,当“完全隶属”时,其代表量为45℃。
如果当α=0.5时,表示“大概隶属”关系,切割隶属度函数曲线后,这时从30℃到70℃的隶属度值都包含在其中,所以求其平均值得到输出代表量:
u =(30+40+50+60+70)/5=50
这样,当“大概隶属”时,其代表量为50℃
----------------------------------------------------------------------------
例:用重心法通过SQL语言查询何时该锅炉水温适中?
SQL99语句:
create function sum()
returns integer as;;
select (x[1]* mn[1]+ x[2]* mn[2] + x[3]* mn[3] + x[4]* mn[4] + x[5]* mn[5] + x[6]* mn[6] + x[7]* mn[7] + x[8]* mn[8] + x[9]* mn[9] + x[10]* mn[10])/( mn[1]+ mn[2] + mn[3] + mn[4] + mn[5] +mn[6] +mn[7] + mn[8] + mn[9] +mn[10])
from temperature
where fuzzytemp=’适中’)
/*使用ORDBMS中的用户定义函数用重心法建立隶属函数*/
select time
from measure
where (temp-sum())<5 or (temp-sum())>-5
/*通过使用隶属函数的返回值完成查询,并将水温适中的误差范围定为5℃以内?a*/