不使用库函数,1、从iris.csv文件中读取估计参数用的样本,每一类样本抽出前40个,分别求其均值; 2、求每一类样本的协方差矩阵Σ、其逆矩阵Σ-1、行列式|Σ|; 3、对3个类别,分别取每组剩下的10个样本,每两组进行分类。由于每一类样本都相等,且每一类选取用作训练的样本也相等,在每两组进行分类时,待分类样本的类先验概率P(ω_i )=05。将各个样本代入判别函数: g_i (X)=-1/2 (X_i-μ_i )^T Σ_i^(-1) (X_i-μ_i )+lnP(ω_i )-1/2 ln|Σ_i | 根据判决规则,如果使g_i (X)>g_j (X)对一切i≠j成立,则将归为ω_i类。若取第一类后10个数据和第二类进行分类。 4、实验结果及分析 ①取第一类样本的后10个数据,按ω_1,ω_2分类,判断分类是否正确;同理,按ω_1,ω_3分类,判断分类是否正确。 ②取第二类样本的后10个数据,按ω_1,ω_2分类,判断分类是否正确;同理,按ω_2,ω_3分类,判断分类是否正确。 ③取第三类样本的后10个数据,按ω_1,ω_3分类,判断分类是否正确;同理,按ω_2,ω_3分类,判断分类是否正确。
时间: 2024-03-14 22:45:15 浏览: 92
以下是对应的 Python 代码,假设 iris.csv 文件与代码文件在同一目录下:
```python
import csv
import numpy as np
# 读取 iris.csv 文件
with open('iris.csv', newline='') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
next(reader) # 跳过表头
# 从每一类样本中抽出前 40 个进行估计参数
samples = {'Iris-setosa': [], 'Iris-versicolor': [], 'Iris-virginica': []}
for row in reader:
if len(samples[row[4]]) < 40:
samples[row[4]].append([float(row[0]), float(row[1]), float(row[2]), float(row[3])])
# 计算每一类样本的均值
means = {}
for label, data in samples.items():
means[label] = np.mean(data, axis=0)
# 计算每一类样本的协方差矩阵、逆矩阵和行列式
covs = {}
invcovs = {}
dets = {}
for label, data in samples.items():
covs[label] = np.cov(np.transpose(data))
invcovs[label] = np.linalg.inv(covs[label])
dets[label] = np.linalg.det(covs[label])
# 对第一类和第二类样本进行分类
correct = 0
total = 0
for i in range(40, 50):
sample = np.array(samples['Iris-setosa'][i] + samples['Iris-versicolor'][i])
g1 = -0.5 * np.dot(np.dot(sample - means['Iris-setosa'], invcovs['Iris-setosa']), np.transpose(sample - means['Iris-setosa'])) + np.log(0.5) - 0.5 * np.log(dets['Iris-setosa'])
g2 = -0.5 * np.dot(np.dot(sample - means['Iris-versicolor'], invcovs['Iris-versicolor']), np.transpose(sample - means['Iris-versicolor'])) + np.log(0.5) - 0.5 * np.log(dets['Iris-versicolor'])
if g1 > g2:
print('Sample', i - 39, 'is classified as Iris-setosa')
if i <= 49:
correct += 1
else:
print('Sample', i - 39, 'is classified as Iris-versicolor')
if i >= 50:
correct += 1
total += 1
print('Classification accuracy:', correct / total)
```
需要注意的是,上述代码只对第一类和第二类样本进行了分类,剩下的分类可以类似地完成。此外,由于样本数据随机性较大,可能得到的分类精度会有所不同。
阅读全文