概率论与随机过程--作业6

发布于:2025-02-10 ⋅ 阅读:(26) ⋅ 点赞:(0)
计算题

今从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类。


网站公告

今日签到

点亮在社区的每一天
去签到