概率论与随机过程--作业6
计算题
今从1995年世界各国人文发展指数的排序中,选取高发展水平、中等发展水平的国家各五个作为两组样品,另选四个国家作为待判样品作距离判别分析。
数据选自《世界经济统计研究》1996年第1期
类别 | 序号 | 国家名称 | 出生时的 予期寿命(岁) x1 | 成人识字率(%) 1992 x2 | 调正后人均GDP 1992 x3 |
第一类 (高发展水平国家) | 1 2 3 4 5 | 美国 日本 瑞士 阿根廷 阿联酋 | 76 79.5 78 72.1 73.8 | 99 99 99 95.9 77.7 | 5374 5359 5372 5242 5370 |
第二类 (中等发展水平国家) | 6 7 8 9 10 | 保加利亚 古巴 巴拉圭 格鲁吉亚 南非 | 71.2 75.3 70 72.8 62.9 | 93 94.9 91.2 99 80.6 | 4250 3412 3390 2300 3799 |
待判样品 | 11 12 13 14 | 中国 罗马尼亚 希腊 哥伦比亚 | 68.5 69.9 77.6 69.3 | 79.3 96.9 93.8 90.3 | 1950 2840 5233 5158 |
程序如下:
import pandas as pd
import numpy as np
from numpy import *
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #设置显示汉字
plt.rcParams['axes.unicode_minus'] = False
np.set_printoptions(precision=4) #精度设置维保留4位有效小数
###############################################################
def get_coefficient(sample_list):
k=len(sample_list)
sample=sample_list[0]
d=sample.shape[1] #维数(属性个数)
x_means=mat(np.zeros([d,k])) # 均值
s_p=mat(np.zeros([d,d]))
I=mat(np.zeros([d,k]))
C=mat(np.zeros([k,1]))
n=0
#对每类数据进行处理
i=0
for sample in sample_list:
n_i=sample.shape[0]-1
n=n+n_i
s_i=np.cov(sample,rowvar=False) #协方差矩阵
s_p=s_p+n_i*s_i
x_means[:,i]=np.mean(sample,axis=0).reshape(-1,1)
i=i+1
s_p=s_p/n
print("协方差矩阵:",s_p) #协方差
s_p_iv=s_p.I # 矩阵求逆
#计算I
for i in range(k):
I[:,i]=s_p_iv*x_means[:,i]
c=-0.5*x_means[:,i].reshape(1,-1)*s_p_iv*x_means[:,i]
C[i,0]=c
return I, C
#######################可修改部分###############################
k=2 #总体个数
d=3 #属性个数
samples_I=mat(np.array([[76,99,5374],
[79.5,99,5359],
[78,99,5372],
[72.1,95.9,5272],
[73.9,77.7,5370]
]))
samples_II=mat(np.array([[71.2,93,4250],
[75.3,94.9,3412],
[70,91.2,3390],
[72.8,99,2300],
[62.9,80.6,3799]
]))
#将训练数据添加到列表中
sample_list=[]
sample_list.append(samples_I)
sample_list.append(samples_II)
#计算得到的系数
I,C=get_coefficient(sample_list)
print("I=",I)
print("C=",C)
#输入要判定的数据样本
input_sample=mat(np.array([68.5,79.3,1950]))
#input_sample=mat(np.array([77.6,93.8,5233]))
#计算判定值
V=I.T*input_sample.T+C
#输出
print("计算得到各类别判定值为:")
for i in range(k):
print("第{}类:{}".format(i+1,round(V[i,0],4)))
x=input_sample.tolist()[0]
x=tuple(x)
print("所以,输入数据{}属于第{}类。".format(x,argmax(V)+1))
程序运行结果:
协方差矩阵: [[ 1.5329e+01 2.1508e+01 -5.6979e+02]
[ 2.1508e+01 6.6613e+01 -1.4394e+03]
[-5.6979e+02 -1.4394e+03 2.6188e+05]]
I= [[5.8621 5.1918]
[0.2692 0.2588]
[0.0347 0.0258]]
C= [[-327.8449]
[-239.0039]]
计算得到各类别判定值为:
第1类:162.6467
第2类:187.4976
所以,输入数据(68.5, 79.3, 1950.0)属于第2类。