雲模型(Cloud Model)
阿新 • • 發佈:2018-11-19
一、基本概念
雲模型是由中國工程院院士李德毅在1995年提出的概念,是處理定性概念與定量描述的不確定轉換模型。已經成功應用到自然語言處理處理,資料探勘,決策分析,智慧控制,影象處理等領域。
看一下百度的定義:
嗯,亂七八糟,我也看不懂。不過沒關係,瞭解大概的概念就好。整個模型叫雲,每個小的資料,也就是每個發生在系統中的事件,叫做雲滴。
看他的數字特徵。
期望Ex:雲滴在論域空間分佈的期望,就是你理解的期望
熵En:代表雲滴分佈的不確定性和模糊性,就是你高中物理化學學的那個熵
超熵He:熵的熵。超熵越大,說明模型的不確定性越大,雲的厚度越大。
簡單來看就是一個類似正態分佈的東西。
模型的使用
模型使用就是實現雲發生器。有正反兩種。
正向雲發生器
從定性概念到其定量表示的對映。根據雲的數字特徵產生雲滴,每個雲滴都是該概念的一次具體實現。
步驟:
(1)產生一個期望值為Ex,方差為En的正態隨機數xi;
(2)產生一個期望值為En,方差為He的正態隨機數Ex`;
(3)計算yi
(4)令(xi, yi)為一個雲滴,它是該雲表示的語言值在數量上的一次具體實現,其中x為定性概念在論域中這一次對應的數值, yi 為屬於這個語言值的程度的量度;
(5)重複步驟(1)到步驟(4),直到產生滿足要求數目的雲滴數。
---------------------
作者:李小怪
來源:CSDN
原文:https://blog.csdn.net/Monster_li57/article/details/80375959
二、程式碼部分
#coding:utf-8 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D def Cloud_compute(xl): '''計算雲滴的數字特徵''' xl = np.array(xl) # S2 = np.var(xl) #用的方差 S2 = np.std(xl) #用的標準差 Ex = np.mean(xl) En = np.sqrt(np.pi/2) * np.mean( np.abs(xl-Ex) ) He = np.sqrt( np.abs(S2*S2 - En*En) ) return (Ex, En, He) def plot_cloud_model(Ex, En, He, n, title='', grid=False, moni=False): Y = np.zeros((1, n)) X = np.random.normal(loc=En, scale=He, size=n) Y = Y[0] plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標籤 plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號 fig = plt.figure(0) ax = fig.add_subplot(111) for i in range(n): Enn = X[i] X[i] = np.random.normal(loc=Ex, scale=np.abs(Enn), size=1) Y[i] = np.exp(-(X[i]-Ex)*(X[i]-Ex)/(2*Enn*Enn)) ax.scatter(X[i], Y[i], s=10, alpha=0.5, c='r', marker='o') if title == '': title = '期望:%.2f,熵:%.2f,超熵:%.2f,雲滴數:%d' % (Ex, En, He, n) ax.set_title(title) ax.set_xlabel('指標值') ax.set_ylabel('確定度') ax.grid(True) if moni: print (Cloud_compute(X)) plt.show() def plot_2d_cloud_model(Ex, En, He, n, title='', grid=False): Y = np.zeros((1, n)) X0 = np.random.normal(loc=En[0], scale=He[0], size=n) Y = Y[0] X1 = np.random.normal(loc=En[1], scale=He[1], size=n) plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標籤 plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號 fig = plt.figure(0) ax = fig.add_subplot(111, projection='3d') for i in range(n): Enn0 = X0[i] X0[i] = np.random.normal(loc=Ex[0], scale=np.abs(Enn0), size=1) # Y0[i] = np.exp(-(X0[i]-Ex[0])*(X0[i]-Ex[0])/(2*Enn*Enn)) Enn1 = X1[i] X1[i] = np.random.normal(loc=Ex[1], scale=np.abs(Enn1), size=1) Y[i] = np.exp(-(X0[i] - Ex[0]) * (X0[i] - Ex[0]) / (2 * Enn0 * Enn0)-(X1[i] - Ex[1]) * (X1[i] - Ex[1]) / (2 * Enn1 * Enn1)) ax.scatter(X0[i], X1[i], Y[i], s=10, alpha=0.5, c='r', marker='o') if title == '': title = '期望:[%.2f,%.2f],熵:[%.2f,%.2f],超熵:[%.2f,%.2f],雲滴數:%d' % (Ex[0], Ex[1], En[0], En[1], He[0], He[1], n) ax.set_title(title) ax.set_xlabel('指標值1') ax.set_ylabel('指標值2') ax.set_zlabel('確定度') ax.grid(True) plt.show() if __name__ == '__main__': #二維雲圖 plot_cloud_model(0, 1, 0.1, 500, moni=True) # print Cloud_compute(x) # #三維雲圖 # plot_2d_cloud_model([0, 1], [0.3, 0.3], [0.01, 0.05], 2000)