数据集:男女身高体重(二维)

数据集:男女身高体重(二维)

本文讨论该数据集的BayesMSE分类器的设计。
前导知识文献:【正态分布下贝叶斯决策的特例(三)】【最小平方误差判别(MSE)】

Bayes判别分类器

1. 预处理

# 导包
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd # 表格处理
import math # 数学计算
import sympy as sp # 绘图

# 导入数据
train_data = pd.read_excel('traindata.xlsx')
test_data = pd.read_excel('testdata.xlsx')

# 拆分数据集:1代表男性,-1代表女性
train_data_men = train_data.iloc[0:50,1:3]
train_data_women = train_data.iloc[50:100,1:3]
test_data_men = test_data.iloc[0:50,1:3]
test_data_women = test_data.iloc[50:100,1:3]

预处理的目的为便于后续处理训练样本数据

2. 计算训练样本的均值

n = 50
mu_men = np.sum(np.array(train_data_men),axis=0)/n
mu_women = np.sum(np.array(train_data_women),axis=0)/n

mu_men

174.134
66.608

mu_women

161.03
51.956

3. 计算各类协方差矩阵

A = np.array(train_data_men)-mu_men
B = np.transpose(A)
sigma_men = np.dot(B,A)/n

A = np.array(train_data_women)-mu_women
B = np.transpose(A)
sigma_women = np.dot(B,A)/n

sigma_men

20.4958	2.20953
2.20953	70.5663

sigma_women

19.6617	9.33412
9.33412	29.1861

4. 绘制测试数据散点图

plt.scatter(test_data_men['height'],test_data_men['weight'],c='b',label='men')
plt.scatter(test_data_women['height'],test_data_women['weight'],c='r',label='women')
plt.legend();
plt.xlabel('height / cm')
plt.ylabel('weight / kg')
plt.title('Test Data (height-weight)')
plt.show()

图示
在这里插入图片描述

5. 计算分类器分类测试数据产生的错误率

const1 = -0.5*math.log(np.linalg.det(sigma_men)/np.linalg.det(sigma_women))
sigma_men_inv = np.linalg.inv(sigma_men)
sigma_women_inv = np.linalg.inv(sigma_women)
x = np.array(test_data.iloc[:,1:3])
scores = 0
for i in range(2*n):
    x1 = x[i]-mu_men
    x2 = x[i]-mu_women
    g1 = (x1.dot(sigma_men_inv)).dot(x1.transpose())
    g2 = (x2.dot(sigma_women_inv)).dot(x2.transpose())
    curve = -0.5*(g1-g2) + const1
    if ((curve>0)&(test_data['gender'][i]==1))|((curve<0)&(test_data['gender'][i]==-1)):
        scores += 1
print('errorRate:',1-scores/100)

结果

errorRate: 0.08999999999999997

6. 确定分类线区间并绘制分类线

xmin = test_data_women['height'].min() - 20
xmax = test_data_men['height'].max() + 20
ymin = test_data_women['weight'].min() - 20
ymax = test_data_men['weight'].max() + 20
fig,ax = plt.subplots(1,1)
ax.scatter(test_data_men['height'],test_data_men['weight'],c='b',label='men')
ax.scatter(test_data_women['height'],test_data_women['weight'],c='r',label='women')
x = sp.Symbol('x')
y = sp.Symbol('y')
X = np.array([x,y])
x1 = X - mu_men
x2 = X - mu_women
fin = -0.5*((x1.dot(sigma_men_inv)).dot(x1.transpose())-(x2.dot(sigma_women_inv)).dot(x2.transpose())) + const1
print(sp.simplify(fin))
xx,yy = np.linspace(xmin,xmax,15),np.linspace(ymin,ymax,15)
x,y = np.meshgrid(xx,yy)
ax.legend()
ax.contour(x,y,(0.00550446923228119*x**2 - 0.0176446572158389*x*y - 0.236968574102361*x + 0.013088557295945*y**2 + 1.66951194856611*y - 85.0026770450582),[0])
plt.show()

结果

0.00550446923228119*x**2 - 0.0176446572158389*x*y - 0.236968574102361*x + 0.013088557295945*y**2 + 1.66951194856611*y - 85.0026770450582

图示
在这里插入图片描述

MSE线性分类器

1.预处理

# 导包
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import sympy as sp # 绘图

# 导入数据
train_data = pd.read_excel('traindata.xlsx')
test_data = pd.read_excel('testdata.xlsx')

# 预处理数据
X = np.ones([100,3])
X[:,1:3] = train_data.iloc[:,1:3]
y = np.array(train_data['gender'])

y中数据为分类标签:+1或-1

2. 伪逆法求解参数

theta = ((np.linalg.inv((X.T).dot(X))).dot(X.T)).dot(y)

结果

-14.9076
0.0783155
0.0300815

3. 绘制测试数据散点图和决策线

xmin = test_data['height'].min() - 20
xmax = test_data['height'].max() + 20
ymin = test_data['weight'].min() - 20
ymax = test_data['weight'].max() + 20
fig,ax = plt.subplots(1,1)
ax.scatter(test_data['height'][0:50],test_data['weight'][0:50],c='b',label='men')
ax.scatter(test_data['height'][50:100],test_data['weight'][50:100],c='r',label='women')
x = sp.Symbol('x')
y = sp.Symbol('y')
fin = theta[0]+theta[1]*x+theta[2]*y
print(sp.simplify(fin))
xx,yy = np.linspace(xmin,xmax,15),np.linspace(ymin,ymax,15)
x,y = np.meshgrid(xx,yy)
ax.legend()
ax.contour(x,y,(0.0783155197575863*x + 0.0300815202467307*y - 14.9075641152825),[0])
plt.show()

结果

0.0783155197575863*x + 0.0300815202467307*y - 14.9075641152825

图示
在这里插入图片描述

4. 对测试集计算错误率

scores = 0
for i in range(100):
    t1 = 0.0783155197575863*test_data.iloc[i,1] + 0.0300815202467307*test_data.iloc[i,2] - 14.9075641152825
    if ((t1 > 0)&(test_data.iloc[i,0]==1))|((t1 < 0)&(test_data.iloc[i,0]==-1)):
        scores += 1
print('errorRate:',1-scores/100)

结果

errorRate: 0.08999999999999997
  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
二维人工数据集是指由人工生成的二维数据集,其目的是用于模式识别和机器学习算法的测试和验证。这种数据集通常由人工设置的特征和标签组成,使研究人员能够针对特定问题设计和评估算法。 与之相对的是 UCI 真实数据集,它是指由 UCI Machine Learning Repository(UCI机器学习库)提供的真实世界数据集。这些数据集收集并整理了各种领域的真实数据,包括医疗、金融、社交网络等等,并且这些数据集已经经过了匿名化处理以保护数据隐私。 二维人工数据集与 UCI 真实数据集在数据来源、生成方式和用途方面存在差异。二维人工数据集是由人工生成的,主要用于验证和比较算法的性能。由于数据是人工设定的,研究人员可以控制数据的分布、相关性等特性。这种数据集常常被用来构建简单的模型和进行初步的算法调试。 而 UCI 真实数据集则是通过真实领域的数据采集获得的,具有更广泛的应用背景和更真实的特征。这些数据集对于研究人员、学生和数据科学家来说非常有价值,可以用来研究真实世界中的问题,并开发出适用于实际应用的算法和模型。 总的来说,二维人工数据集和 UCI 真实数据集在研究和实践中都具有重要的作用。二维人工数据集适用于初步的算法验证和性能比较,而 UCI 真实数据集则更适合于真实世界问题的研究和应用。研究人员可以根据具体的需求选择适合的数据集来进行相关工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeeGLMath

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值