用python实现以下功能1.从iris.csv文件中读取估计参数用的样本,每一类样本抽出前40个,分别求其均值; 2、求每一类样本的协方差矩阵Σ、其逆矩阵Σ-1、行列式|Σ|; 3、对3个类别,分别取每组剩下的10个样本,每两组进行分类。由于每一类样本都相等,且每一类选取用作训练的样本也相等,在每两组进行分类时,待分类样本的类先验概率=05。将各个样本代入判别函数: 根据判决规则,如果使对一切i≠j成立,则将归为类。若取第一类后10个数据和第二类进行分类。
时间: 2024-03-30 16:36:59 浏览: 25
以下是实现以上功能的代码:
```python
import numpy as np
import pandas as pd
# 读取iris.csv文件
df = pd.read_csv('iris.csv')
# 取出前40个样本求均值
mean_setosa = np.mean(df[df['species']=='setosa'].iloc[:40, :-1], axis=0)
mean_versicolor = np.mean(df[df['species']=='versicolor'].iloc[:40, :-1], axis=0)
mean_virginica = np.mean(df[df['species']=='virginica'].iloc[:40, :-1], axis=0)
# 求协方差矩阵、逆矩阵和行列式
cov_setosa = np.cov(df[df['species']=='setosa'].iloc[:, :-1].T)
cov_versicolor = np.cov(df[df['species']=='versicolor'].iloc[:, :-1].T)
cov_virginica = np.cov(df[df['species']=='virginica'].iloc[:, :-1].T)
inv_cov_setosa = np.linalg.inv(cov_setosa)
inv_cov_versicolor = np.linalg.inv(cov_versicolor)
inv_cov_virginica = np.linalg.inv(cov_virginica)
det_cov_setosa = np.linalg.det(cov_setosa)
det_cov_versicolor = np.linalg.det(cov_versicolor)
det_cov_virginica = np.linalg.det(cov_virginica)
# 取出剩下的10个样本进行分类
test_setosa = df[df['species']=='setosa'].iloc[40:, :-1]
test_versicolor = df[df['species']=='versicolor'].iloc[40:, :-1]
test_virginica = df[df['species']=='virginica'].iloc[40:, :-1]
# 判别函数
def discriminant_function(x, mean, inv_cov, det_cov):
g = -0.5 * np.dot(np.dot((x-mean).T, inv_cov), (x-mean)) - 0.5*np.log(det_cov) + np.log(0.5)
return g
# 对第一类和第二类进行分类
correct_count = 0
for i in range(10):
x1 = test_setosa.iloc[i].values
x2 = test_versicolor.iloc[i].values
g_setosa = discriminant_function(x1, mean_setosa, inv_cov_setosa, det_cov_setosa)
g_versicolor = discriminant_function(x2, mean_versicolor, inv_cov_versicolor, det_cov_versicolor)
if g_setosa > g_versicolor:
print(f"样本{i+41}被分类为setosa")
if df.iloc[i+40, -1] == "setosa":
correct_count += 1
else:
print(f"样本{i+41}被分类为versicolor")
if df.iloc[i+40, -1] == "versicolor":
correct_count += 1
# 输出分类的正确率
print(f"分类正确率为{correct_count/20}")
```
需要注意的是,该代码实现的是两类分类中的一类和另外两类进行分类,因此输出的分类结果只有setosa和versicolor两类。如果需要对其他两类进行分类,需要更改代码中的分类方式。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)