Python正态云发生器

Python正态云发生器

  • 云模型
    • 数字特征
    • 逆向云发生器
    • 正向云发生器
  • 一维逆向云模型
    • 方法一
    • 方法二
  • 一维正向云模型
  • 二维正向云模型
  • 多维正向云模型
  • 总体代码

云模型

数字特征

期望Ex:最能代表定性概念的点。
熵En:相当于概率论的方差,隶属度的模糊程度。
超熵He:熵的熵,反映偏离正态分布的程度,隶属度的不确定性。

逆向云发生器

定量——〉定性

Python正态云发生器_第1张图片

正向云发生器

定性——〉定量
Python正态云发生器_第2张图片

一维逆向云模型

方法一

需要确定度信息的逆向云模型

  1. 设共有n个样本点,求样本均值 x = 1 n ∑ i = 1 n x i x = \frac{1}{n}\sum_{i=1}^nx_i x=n1i=1nxi,作为Ex
  2. 将μ>0.999的点剔除(因为影响大),剩下m个样本点
  3. 计算 E n i = ∣ x i − E x ∣ − 2 l n y i , i = 1 , 2 , 3... En_i=\frac{|x_i-Ex|}{\sqrt{-2lny_i}\quad},i=1,2,3... Eni=2lnyi xiEx,i=1,2,3...
  4. 取Eni的平均值作为En的估计值
  5. 计算 H e = 1 m − 1 ∑ i = 1 m E n j He=\sqrt{\frac{1}{m-1}\sum_{i=1}^mEn_j} He=m11i=1mEnj

python代码:

def computeCloud1(x,y):#一维逆向云(方法一,需确定度)
    i=0
    while(i0.999):
            del x[i]
            del y[i]
        i=i+1
    x=np.array(x)
    y=np.array(y)
    Ex=np.mean(x)
    En=np.zeros(x.shape)
    for i in range(len(x)):
        En[i]=np.abs(x[i]-Ex)/pow(-2*math.log(y[i],math.e),1/2)
    En_1=np.mean(En)
    He=np.sqrt(np.std(En))
    return Ex,En_1,He

方法二

无需确定度信息的逆向云模型

  1. 设共有n个样本点,求样本均值 x = 1 n ∑ i = 1 n x i x = \frac{1}{n}\sum_{i=1}^nx_i x=n1i=1nxi,作为Ex
  2. 求一阶样本绝对中心矩 d = 1 n ∑ i = 1 n ∣ x i − x ∣ d= \frac{1}{n}\sum_{i=1}^n|x_i-x| d=n1i=1nxix
  3. 计算 E n = π 2 d En=\sqrt{\frac{\pi}{2}}d En=2π d
  4. 求样本方差: s 2 = 1 n − 1 ∑ i = 1 n ( x i − x ) 2 s^2=\frac{1}{n-1}\sum_{i=1}^n(x_i-x)^2 s2=n11i=1n(xix)2
  5. 计算 H e = s 2 − E n 2 He=\sqrt{s^2-En^2} He=s2En2

python代码:

def computeCloud2(x):#一维逆向云发生器(方法二,无需确定度)
   x=np.array(x);
   Ex=np.mean(x);
   En=np.sqrt(np.pi/2)*np.mean(np.abs(x-Ex))
   S2=np.std(x)
   He=np.sqrt(np.abs(S2*S2-En*En))
   return Ex,En,He

一维正向云模型

  1. 生成以En为期望,He为标准差的正态分布随机数En’
  2. 生成以Ex为期望,|En‘|为标准差的正态分布随机数x
  3. u = e − ( x − E x ) 2 2 ( E n ′ ) 2 u=e^{-\frac{(x-Ex)^2}{2(En')^2}} u=e2(En)2(xEx)2

python代码:

def forwardCloud(Ex,En,He,N):       #正向云模型(生成云)
    cloudpoint=[];
    for i in range(N):
        En_1=np.random.normal(En,He)
        x=np.random.normal(Ex,abs(En_1))
        y=math.exp(-pow(x-Ex,2)/(2*pow(En_1,2)))
        cloudpoint.append([x,y])
    return cloudpoint

二维正向云模型

和一维原理差不多
u = e − ( ( x − E x ) 2 2 ( E n x ′ ) 2 + ( y − E y ) 2 2 ( E n y ′ ) 2 ) u=e^{-(\frac{(x-Ex)^2}{2(Enx')^2}+\frac{(y-Ey)^2}{2(Eny')^2})} u=e(2(Enx)2(xEx)2+2(Eny)2(yEy)2)
python代码:

def twoDimensionforwardCloud(Ex1,En1,He1,Ex2,En2,He2,N):#二维正向云模型(生成云)
    cloudpoint=[];
    for i in range(N):
        t1=np.random.normal()
        t2=np.random.normal()
        En1_1=He1*t1+En1
        En2_1=He2*t2+En2
        t1=np.random.normal()
        t2=np.random.normal()
        x=En1_1*t1+Ex1
        y=En2_1*t2+Ex2
        z=math.exp(-1/2*(pow(x-Ex1,2)/(pow(En1_1,2))+pow(y-Ex2,2)/(pow(En2_1,2))))
        cloudpoint.append([x,y,z])
    return cloudpoint

多维正向云模型

u = e − ( ( x − E x ) 2 2 ( E n x ′ ) 2 + ( y − E y ) 2 2 ( E n y ′ ) 2 ) = u x + u y u=e^{-(\frac{(x-Ex)^2}{2(Enx')^2}+\frac{(y-Ey)^2}{2(Eny')^2})}=u_x+u_y u=e(2(Enx)2(xEx)2+2(Eny)2(yEy)2)=ux+uy
python代码:

def mutiForwardCloud(Ex,En,He,N):#多维云生成
    cloudpoint=np.zeros([N,len(Ex)+1]);
    muti_u=np.zeros([N,len(Ex)]);
    i=0;
    for ex,en,he in zip(Ex,En,He):
        sub_cloudpoint=forwardCloud(ex,en,he,N)
        x=[x[0] for x in sub_cloudpoint]
        cloudpoint[:,i]=x
        u=[x[1] for x in sub_cloudpoint]
        muti_u[:,i]=u
        i=i+1
    cloudpoint[:,i]=muti_u.prod(1)
    return cloudpoint

总体代码

    # -*- coding: utf-8 -*-
   
    import math
    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D  #画三维图
    
    def forwardCloud(Ex,En,He,N):       #正向云模型(生成云)
        cloudpoint=[];
        for i in range(N):
            En_1=np.random.normal(En,He)
            x=np.random.normal(Ex,abs(En_1))
            y=math.exp(-pow(x-Ex,2)/(2*pow(En_1,2)))
            cloudpoint.append([x,y])
        return cloudpoint
    
    def twoDimensionforwardCloud(Ex1,En1,He1,Ex2,En2,He2,N):#二维正向云模型(生成云)
        cloudpoint=[];
        for i in range(N):
            t1=np.random.normal()
            t2=np.random.normal()
            En1_1=He1*t1+En1
            En2_1=He2*t2+En2
            t1=np.random.normal()
            t2=np.random.normal()
            x=En1_1*t1+Ex1
            y=En2_1*t2+Ex2
            z=math.exp(-1/2*(pow(x-Ex1,2)/(pow(En1_1,2))+pow(y-Ex2,2)/(pow(En2_1,2))))
            cloudpoint.append([x,y,z])
        return cloudpoint
    
    def mutiForwardCloud(Ex,En,He,N):#多维云生成
        cloudpoint=np.zeros([N,len(Ex)+1]);
        muti_u=np.zeros([N,len(Ex)]);
        i=0;
        for ex,en,he in zip(Ex,En,He):
            sub_cloudpoint=forwardCloud(ex,en,he,N)
            x=[x[0] for x in sub_cloudpoint]
            cloudpoint[:,i]=x
            u=[x[1] for x in sub_cloudpoint]
            muti_u[:,i]=u
            i=i+1
        cloudpoint[:,i]=muti_u.prod(1)
        return cloudpoint
            
    #可视化
    res=twoDimensionforwardCloud(0,10,1,3,15,0.5,1000)
    x=[x[0] for x in res]
    y=[x[1] for x in res]
    z=[x[2] for x in res]
    fig=plt.figure()
    ax=Axes3D(fig)
    ax.scatter(x,y,z)
    plt.show()
    
    res=mutiForwardCloud([1,3],[10,15],[1,0.5],1000)
    fig=plt.figure()
    ax=Axes3D(fig)
    ax.scatter(res[:,0],res[:,1],res[:,2])
    plt.show()
    
    def computeCloud1(x,y):#一维逆向云(方法一,需确定度)
        i=0
        while(i<len(y)):
            if(y[i]>0.999):
                del x[i]
                del y[i]
            i=i+1
        x=np.array(x)
        y=np.array(y)
        Ex=np.mean(x)
        En=np.zeros(x.shape)
        for i in range(len(x)):
            En[i]=np.abs(x[i]-Ex)/pow(-2*math.log(y[i],math.e),1/2)
        En_1=np.mean(En)
        He=np.sqrt(np.std(En))
        return Ex,En_1,He
    def computeCloud2(x):#一维逆向云发生器(方法二,无需确定度)
        x=np.array(x);
        Ex=np.mean(x);
        En=np.sqrt(np.pi/2)*np.mean(np.abs(x-Ex))
        S2=np.std(x)
        He=np.sqrt(np.abs(S2*S2-En*En))
        return Ex,En,He
            
    res=forwardCloud(0,10,1,3000)
    x=[x[0] for x in res]
    y=[x[1] for x in res]
    fig=plt.figure()
    plt.scatter(x,y)
    plt.show()
    a,b,c=computeCloud1(x,y)
    print(a,b,c)
    a,b,c=computeCloud2(x)
    print(a,b,c)

Python正态云发生器_第3张图片
Python正态云发生器_第4张图片
Python正态云发生器_第5张图片
4

你可能感兴趣的:(Python,云模型,正态云模型)