不用库函数,从iris.csv文件中读取估计参数用的样本,每一类样本抽出前40个,分别求其均值;分析哪个特征对分类的作用最小,并舍弃,在三维坐标空间画出降为三维主特征的三类样本点的空间分布,判断哪些样本可能会被分错
时间: 2024-03-17 14:47:00 浏览: 108
好的,我来一步步回答你的问题。
1. 读取数据
首先,我们需要读取 iris.csv 文件中的数据。可以使用 Python 自带的 csv 库读取数据,也可以使用 Pandas 库。
```python
import csv
# 读取 iris.csv 文件
with open('iris.csv', 'r') as f:
reader = csv.reader(f)
data = [row for row in reader]
```
2. 数据预处理
读取数据之后,我们需要对数据进行预处理。首先,我们需要将数据转换为浮点数类型。其次,我们需要将数据按照类别分成三类,并抽取前 40 个样本。
```python
import numpy as np
# 将数据转换为浮点数类型
data = np.array(data[1:], dtype=np.float)
# 按照类别分成三类,并抽取前 40 个样本
setosa = data[:40, :-1]
versicolor = data[50:90, :-1]
virginica = data[100:140, :-1]
```
3. 求均值
抽取样本后,我们可以分别求出每一类样本的均值。可以使用 NumPy 库的 mean() 函数求出每个特征的均值。
```python
# 分别求出每一类样本的均值
setosa_mean = np.mean(setosa, axis=0)
versicolor_mean = np.mean(versicolor, axis=0)
virginica_mean = np.mean(virginica, axis=0)
print('setosa_mean:', setosa_mean)
print('versicolor_mean:', versicolor_mean)
print('virginica_mean:', virginica_mean)
```
4. 特征选择
接下来,我们需要分析哪个特征对分类的作用最小,并进行舍弃。可以使用 NumPy 库的 cov() 函数计算协方差矩阵,然后对协方差矩阵进行特征值分解,得到特征值和特征向量。特征值表示特征向量的重要程度,我们可以选择最小的特征值对应的特征向量进行舍弃。
```python
# 计算协方差矩阵
cov_mat = np.cov(data[:, :-1].T)
# 对协方差矩阵进行特征值分解
eig_vals, eig_vecs = np.linalg.eig(cov_mat)
# 打印特征值
print('eig_vals:', eig_vals)
# 打印特征向量
print('eig_vecs:', eig_vecs)
```
通过打印特征值和特征向量,我们可以发现第三个特征对分类的作用最小。因此,我们可以舍弃第三个特征。
```python
# 舍弃第三个特征
data = np.delete(data, 2, axis=1)
# 更新每一类样本
setosa = data[:40, :-1]
versicolor = data[50:90, :-1]
virginica = data[100:140, :-1]
```
5. 降维可视化
最后,我们可以将数据降维到三维,并在三维坐标空间中画出降为三维主特征的三类样本点的空间分布。可以使用 Matplotlib 库的 scatter() 函数进行绘图。
```python
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 将数据降维到三维
setosa_3d = np.dot(setosa, eig_vecs[:, :3])
versicolor_3d = np.dot(versicolor, eig_vecs[:, :3])
virginica_3d = np.dot(virginica, eig_vecs[:, :3])
# 在三维坐标空间中画出降为三维主特征的三类样本点的空间分布
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(setosa_3d[:, 0], setosa_3d[:, 1], setosa_3d[:, 2], c='red', label='setosa')
ax.scatter(versicolor_3d[:, 0], versicolor_3d[:, 1], versicolor_3d[:, 2], c='green', label='versicolor')
ax.scatter(virginica_3d[:, 0], virginica_3d[:, 1], virginica_3d[:, 2], c='blue', label='virginica')
ax.legend()
plt.show()
```
通过观察三类样本点在三维坐标空间中的分布,可以发现一些样本可能会被分错,比如一些绿色点和蓝色点在坐标轴正方向上非常接近。
阅读全文