程序代碼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()