male&female分类+人脸识别——《模式识别》实验课作业

一、实验数据

  1. 性别分类器
    训练样本集
  • FAMALE.TXT 50个女生的身高、体重数据
  • MALE.TXT 50个男生的身高、体重数据
    测试样本集
  • test1.txt 35个同学的身高、体重、性别数据(15个女生、20个男生)
  • test2.txt 300个同学的身高、体重、性别数据(50个女生、250个男生)
  1. 人脸识别
    ORL人脸数据库:40个人,每个人有10张灰度照片,每张照片大小:119*92,灰度级为256。

二、实验内容
实验1. 用贝叶斯方法进行性别分类的实验
基本要求:

  • 1.用FAMALE.TXT和MALE.TXT的数据作为训练样本集,建立Bayes分类器,用测试样本数据对该分类器进行测试。
  • 2.调整特征、分类器等方面的一些因素,考察它们对分类器性能的影响,从而加深对所学内容的理解和感性认识。
    具体做法:
    1.应用单个特征进行实验:以(a)身高或者(b)体重数据作为特征,在正态分布假设下利用‘最大似然法’估计概率密度函数,建立最小错误率Bayes分类器,写出得到的决策规则;将该分类器应用到测试样本,考察测试错误情况。在分类器设计时可以考察采用不同先验概率(如0.5对0.5, 0.75对0.25, 0.9对0.1等)进行实验,考察对决策规则和错误率的影响。
    2.应用两个特征进行实验:同时采用身高和体重数据作为特征,假设二者不相关,在正态分布假设下估计概率密度函数,建立最小错误率Bayes分类器,写出得到的决策规则;将该分类器应用到训练/测试样本,考察训练/测试错误情况。在分类器设计时可以考察采用不同先验概率(如0.5 vs. 0.5, 0.75 vs. 0.25, 0.9 vs. 0.1等)进行实验,考察对决策和错误率的影响。
    3.应用两个特征进行实验:同时采用身高和体重数据作为特征,假设二者相关,在正态分布假设下估计概率密度函数,建立最小错误率Bayes分类器,写出得到的决策规则,将该分类器应用到训练/测试样本,考察训练/测试错误情况。比较相关假设和不相关假设下结果的差异。在分类器设计时可以考察采用不同先验概率(如0.5 vs. 0.5, 0.75 vs. 0.25, 0.9 vs. 0.1等)进行实验,考察对决策和错误率的影响。
    4.应用两个特征进行实验:同时采用身高和体重数据作为特征,利用PCA进行变换,在正态分布假设下估计概率密度函数,建立最小错误率Bayes分类器,写出得到的决策规则,将该分类器应用到训练/测试样本,考察训练/测试错误情况,并与变换前结果进行比较。
    5.自行给出一个风险表,采用最小风险的Bayes决策重复上面的某个或全部实验。

实验2. 用线性判别方法进行性别分类的实验
基本要求:

  • 设计线性分类器,与基于概率密度估计的贝叶斯分类器进行比较。
    具体做法:
    1.同时采用身高和体重数据作为特征,用Fisher线性判别方法构建分类器,将该分类器应用到训练和测试样本,考察训练和测试错误情况。将训练样本和求得的决策边界画到图上。
    2.利用PCA变换样本的特征空间,构建Fisher线性判别分类器,并与上述方法的结果进行比较。
    3.将Fisher线性判别分类器的识别结果与贝叶斯分类器的识别结果进行比较分析。

实验3. 用近邻法进行性别分类的实验
基本要求:

  • 采用最近邻法、k-近邻法及压缩k-近邻法进行分类,与基于概率密度估计的贝叶斯分类器进行比较。
    具体做法:
    1.同时采用身高和体重数据作为特征,用最近邻法进行分类,考察测试准确率。
    2.同时采用身高和体重数据作为特征,用k-近邻进行分类,考察不同k取值情况下的测试准确率。
    3.同时采用身高和体重数据作为特征,用压缩k-近邻法进行分类,考察测试准确率。
    4.对不同方法的结果进行比较。

实验4. 用PCA方法进行人脸识别的实验
基本要求:

  • 利用ORL人脸数据库作为训练集和测试集,实现人脸识别系统。
  • 采用N-交叉法估计错误率。
    具体做法:
    1.利用PCA方法对人脸数据进行特征降维,采用k-近邻法进行人脸识别。
    2.用N-交叉法估计准确率,对不同降维维数和k取值情况下的准确率进行比较。

实验一第一小问代码参考:

# -*- coding:utf-8 -*-
# Jonathan.K.Wolf
# 2022/5/12

import numpy as np
import pandas as pd
import scipy.stats as st
import math

male_data = pd.read_csv('./MALE.TXT', delim_whitespace=True)
female_data = pd.read_csv('./FEMALE.TXT', delim_whitespace=True)

# 身高数据
male_data = male_data.iloc[:, 0]
female_data = female_data.iloc[:, 0]

labels_male = []
labels_female = []
for i in range(len(male_data)):
    labels_male.append(1)

for i in range(len(female_data)):
    labels_female.append(0)

# ======================================================================================================================
data_male = []
data_female = []
for j in range(len(male_data)):
    data_male.append([male_data[j], labels_male[j]])

for j in range(len(female_data)):
    data_female.append([female_data[j], labels_female[j]])

sum1 = 0
sum2 = 0
for i in range(len(data_male)):
    sum1 += data_male[i][0]

for j in range(len(data_female)):
    sum2 += data_female[j][0]

# 均值
theta1_male = sum1 / len(data_male)
theta1_female = sum2 / len(data_female)

sum11 = 0
sum12 = 0
for i in range(len(data_male)):
    sum11 += (data_male[i][0] - theta1_male) ** 2

for j in range(len(data_female)):
    sum12 += (data_female[j][0] - theta1_female) ** 2

# 方差
theta2_male = sum11 / len(data_male)
theta2_female = sum12 / len(data_female)

print('male:{},{}'.format(theta1_male, theta2_male))
print('female:{},{}'.format(theta1_female, theta2_female))

# ======================================================================================================================
height_male = []
height_female = []

for i in range(len(data_male)):
    height_male.append(data_male[i][0])

for j in range(len(data_female)):
    height_female.append(data_female[j][0])


# 类条件概率密度函数 · 正态分布
def normal_male(x):
    return st.norm.pdf(x, loc=theta1_male, scale=math.sqrt(theta2_male))


def normal_female(x):
    return st.norm.pdf(x, loc=theta1_female, scale=math.sqrt(theta2_female))


# 先验概率
p_male = 0.5
p_female = 0.5


# 后验概率
def p_male_x(x):
    res = (normal_male(x) * p_male) / (normal_male(x) * p_male + normal_female(x) * p_female)
    return res


def p_female_x(x):
    res = (normal_female(x) * p_female) / (normal_male(x) * p_male + normal_female(x) * p_female)
    return res


# =========测试阶段=========

test_data = pd.read_csv('./test1.txt', delim_whitespace=True)

labels_test = test_data.iloc[:, 2]

label_test = []
label_pred = []

height = test_data.iloc[:, 0]

male_height = []
female_height = []
for i in range(len(labels_test)):
    if labels_test[i] == 'm':
        male_height.append(height[i])
        label_test.append(1)
    elif labels_test[i] == 'f':
        female_height.append(height[i])
        label_test.append(0)


# 计算男生正确率
acc_of_male = 0
for index_1 in male_height:
    if p_male_x(index_1) >= p_female_x(index_1):
        acc_of_male += 1
    else:
        pass

acc_of_male = acc_of_male / len(male_height)
acc_of_male = round(acc_of_male, 2)

# 计算女生正确率
acc_of_female = 0
for index_2 in female_height:
    if p_male_x(index_2) < p_female_x(index_2):
        acc_of_female += 1
    else:
        pass

acc_of_female = acc_of_female / len(female_height)
acc_of_female = round(acc_of_female, 2)

for index in (male_height + female_height):
    if p_male_x(index) >= p_female_x(index):
        label_pred.append(1)
    elif p_male_x(index) < p_female_x(index):
        label_pred.append(0)

print('实际标签:{}'.format(label_test))
print('预测标签:{}'.format(label_pred))
print('在测试集上预测男生的正确率:{}'.format(acc_of_male))
print('在测试集上预测女生的正确率:{}'.format(acc_of_female))


完整代码链接:
https://download.csdn.net/download/weixin_52456426/85407603?spm=1001.2014.3001.5503

你可能感兴趣的:(python,分类,机器学习,人工智能,python)