機器學習-高斯密度估計(最大似然、Bayes)

程序代碼matlab版

% script file example1.m to compute exponential of a set of numbers
clear; clc;
%%
PI = 3.1415926;
P_Male = 0.6; P_Female = 0.4;
MALE_SIZE = 600000; FEMALE_SIZE = 400000; TEST_SIZE = 100000; %Sample Size
Miu_Male_R = [170, 65]; Miu_Female_R = [160 55]; %Miu
Diata_Male_R = [5 5]; Diata_Female_R = [5 5]; %Diata
Male_Data = [Miu_Male_R(1) + Diata_Male_R(1) * randn(MALE_SIZE, 1), Miu_Male_R(2) + Diata_Male_R(2) * randn(MALE_SIZE, 1)];...
Female_Data = [Miu_Female_R(1) + Diata_Female_R(1) * randn(FEMALE_SIZE, 1), Miu_Female_R(2) + Diata_Female_R(2) * randn(FEMALE_SIZE, 1)];
Test_Data = [Miu_Male_R(1) + Diata_Male_R(1) * randn(TEST_SIZE, 1), Miu_Male_R(2) + Diata_Male_R(2) * randn(TEST_SIZE, 1);...
Miu_Female_R(1) + Diata_Female_R(1) * randn(TEST_SIZE, 1), Miu_Female_R(2) + Diata_Female_R(2) * randn(TEST_SIZE, 1)];
Test_Label = [ones(TEST_SIZE, 1); zeros(TEST_SIZE, 1)];
Miu_Male_E = mean (Male_Data); Diata_Male_E =cov (Male_Data);
Miu_Female_E = mean (Female_Data); Diata_Female_E = cov (Female_Data);

for Tmp = 1 : 2*TEST_SIZE
Px_Male = 1 / ((2*PI)^1.5 * sqrt(det(Diata_Male_E))) ...
* exp (-0.5 * (Test_Data(Tmp, :) - Miu_Male_E) ...
* inv (Diata_Male_E) * (Test_Data(Tmp, :) - Miu_Male_E)');
g_Male = Px_Male * P_Male; 
Px_Female = 1 / ((2*PI)^1.5 * sqrt(det(Diata_Female_E))) ...
* exp (-0.5 * (Test_Data(Tmp, :) - Miu_Female_E) ...
* inv (Diata_Female_E) * (Test_Data(Tmp, :) - Miu_Female_E)');
g_Female = Px_Female * P_Female; 
Decision(Tmp) = (g_Male > g_Female);
end
Accuracy = sum (Decision' == Test_Label) / (2*TEST_SIZE)
#代碼python版
import numpy as np
PI = 3.1415926
P_Male = 0.6; P_Female = 0.4;
MALE_SIZE = 600000; FEMALE_SIZE = 400000; TEST_SIZE = 100000
Miu_Male_R = [170, 65]; Miu_Female_R = [160, 55]
Diata_Male_R = [5 ,5]; Diata_Female_R = [5 ,5]
#男生數據樣本
Male_Data = [Miu_Male_R[0] + Diata_Male_R[0] *np.random.randn(MALE_SIZE, 1),
             Miu_Male_R[1] + Diata_Male_R[1] * np.random.randn(MALE_SIZE, 1)];
#女生數據樣本
Female_Data = [Miu_Female_R[0] + Diata_Female_R[0] * np.random.randn(FEMALE_SIZE, 1),Miu_Female_R[1] + Diata_Female_R[1] * np.random.randn(FEMALE_SIZE, 1)];
#測試數據
Test_M_Data = [Miu_Male_R[0] + Diata_Male_R[0] * np.random.randn(TEST_SIZE, 1),Miu_Male_R[1] + Diata_Male_R[1] * np.random.randn(TEST_SIZE, 1)]
Test_M_Data=np.hstack((Test_M_Data[0],Test_M_Data[1]))
#男測試數據格式處理
Test_F_Data=[Miu_Female_R[0] + Diata_Female_R[0] * np.random.randn(TEST_SIZE, 1), Miu_Female_R[1] + Diata_Female_R[1] * np.random.randn(TEST_SIZE, 1)]
Test_F_Data=np.hstack((Test_F_Data[0],Test_F_Data[1]))#女測試數據格式處理
Test_Data=np.vstack((Test_M_Data,Test_F_Data))#測試數據格式處理
#樣本數據的期望和協方差
Miu_Male_E = [np.mean (Male_Data[0]),np.mean(Male_Data[1])]
Diata_Male_E = np.cov (Male_Data[0].T,Male_Data[1].T);
Miu_Female_E = [np.mean (Female_Data[0]),np.mean(Female_Data[1])];
Diata_Female_E = np.cov (Female_Data[0].T,Female_Data[1].T);
#定義集合存儲對比結果
Decision=[]
#f循環測試數據進行計算
for Tmp in range(0,2*TEST_SIZE):
   #代入公式計算是男生的概率
   Px_Male = 1 / ((2 * PI)**1.5 *np.sqrt(np.linalg.det(Diata_Male_E)))
   c=(Test_Data[Tmp] - Miu_Male_E)
   Px_Male = Px_Male*np.exp(-0.5 * (Test_Data[Tmp] - Miu_Male_E)
                            .dot(np.linalg.inv(Diata_Male_E))
                            .dot(np.vstack((c[0],c[1]))))
   g_Male = Px_Male * P_Male
   # 代入公式計算是女生的概率
   Px_Female = 1 / ((2 * PI) ** 1.5 * np.sqrt(np.linalg.det(Diata_Female_E)))
   c1 = (Test_Data[Tmp] - Miu_Female_E)
   Px_Female = Px_Female * np.exp(-0.5 * (Test_Data[Tmp] - Miu_Female_E)
                              .dot(np.linalg.inv(Diata_Female_E))
                              .dot(np.vstack((c[0], c[1]))))
   g_Female = Px_Female * P_Female
   #對比結果放入集合 True-1,False-0
   Decision.insert(Tmp,(g_Male > g_Female)[0])
#男用1代表,女用0代表
Test_Label = [np.ones(TEST_SIZE),np.zeros(TEST_SIZE)]
Test_Label=np.hstack((Test_Label[0],Test_Label[1]))#格式處理
#計算
Accuracy = np.sum (Decision== Test_Label) / (2*TEST_SIZE)
print(Accuracy)

#三維圖像代碼python版,調整不同參數值呈現不同圖像。

#三維圖像代碼python版
import numpy as np
from scipy import stats
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
if __name__ == '__main__':
    #編碼和字體設置
    mpl.rcParams['axes.unicode_minus'] = False
    mpl.rcParams['font.sans-serif'] = 'SimHei'
    MALE_SIZE = 60000; FEMALE_SIZE = 40000
    TEST_SIZE = 100000; Miu_Male_R = [170, 65]
            Miu_Female_R = [160, 55]
    Diata_Male_R = [5, 5];Diata_Female_R = [5, 5]
    # 男/女生數據
    Male_Data = [Miu_Male_R[0] + Diata_Male_R[0] * np.random.randn(MALE_SIZE, 1), Miu_Male_R[1] + Diata_Male_R[1] * np.random.randn(MALE_SIZE, 1)]
    Female_Data = [Miu_Female_R[0] + Diata_Female_R[0] * np.random.randn(FEMALE_SIZE, 1), Miu_Female_R[1] + Diata_Female_R[1] * np.random.randn(FEMALE_SIZE, 1)]
    #μ和 協方差
    Miu_Male_E = [np.mean(Male_Data[0]), np.mean(Male_Data[1])]
    Diata_Male_E = np.cov(Male_Data[0].T, Male_Data[1].T)
    Miu_Female_E = [np.mean(Female_Data[0]), np.mean(Female_Data[1])]
    Diata_Female_E = np.cov(Female_Data[0].T, Female_Data[1].T)
    #男生圖像數據
    M_density=np.sqrt(MALE_SIZE)*1j;
    M_x1, M_x2 = np.mgrid[150:180:M_density,40:90:M_density]
    M_x = np.stack((M_x1, M_x2), axis=2)
    # 參數μ和cov/Miu_Male_E和Diata_Male_E
    M_norm = stats.multivariate_normal(Miu_Male_R, [[5, 0], [0,5]])
    M_y = M_norm.pdf(M_x)
    # 女生圖像數據
    F_density = np.sqrt(MALE_SIZE) * 1j;
    F_x1, F_x2 = np.mgrid[150:180:F_density,40:90:F_density]
    #F_x1, F_x2 = np.mgrid[140:180:616j, 50:60:616j]
    F_x = np.stack((F_x1, F_x2), axis=2)
    F_norm = stats.multivariate_normal(Miu_Female_R, [[5, 0], [0,5]])
    F_y = F_norm.pdf(F_x)
    #畫圖
    fig = plt.figure(facecolor='w')
    ax = plt.subplot( projection='3d')
    ax.plot_surface(M_x1, M_x2, M_y,  rstride=1, cstride=1,cmap=cm.Accent,  alpha=0.9, lw=0.9)
    ax.plot_surface(F_x1, F_x2, F_y,  rstride=1, cstride=1,cmap='rainbow',  alpha=0.9, lw=0.9)
    ax.set_xlabel('X身高')
    ax.set_ylabel('Y體重')
    ax.set_zlabel('Z')
    plt.suptitle('三維圖', fontsize=18)
    plt.show()

#二維散點圖代碼python版,調整不同參數值呈現不同圖像。

#二維散點圖代碼python版
import numpy as np
import matplotlib.pyplot as plt
#%matplotlib inline

plt.figure()
plt.axis([140,190,40,90])
plt.gca().set_aspect(1)
X = np.random.multivariate_normal(mean=[170,65], cov=[[5, 0], [0,5]], size = 600000)
X1 = np.random.multivariate_normal(mean=[160,55], cov=[[5, 0], [0,5]], size = 400000)
plt.scatter(X[:,0], X[:,1])
plt.scatter(X1[:,0], X1[:,1])
plt.show()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章