1、对Iris数据进行两个特征选择,共6种组合,计算类别可分性准则函数J值(可以使用tr(Sw)值,即类间距离的迹),得出最好的分类组合,画出六种组合的分布图; 2、对Iris数据进行特征提取,使用基于自相关矩阵的PCA方法,将4个特征中转化为2个。计算类别可分性准则函数J值,画出PCA后2维数据的分布图; 3、每类前40个样本作为训练样本,后10个样本作为测试样本。基于120个训练样本,使用最近邻法对30个测试样本分类,并计算测试误差。分析对比原始数据、特征选择后数据、特征提取后数据的结果。
时间: 2023-05-30 10:05:33 浏览: 115
1. 特征选择
首先导入数据集,然后进行特征选择。这里我们使用两种不同的特征选择方法:方差选择和卡方检验。
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.feature_selection import VarianceThreshold, SelectKBest, chi2
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# 导入数据集
iris = load_iris()
X = iris.data
y = iris.target
# 方差选择
selector1 = VarianceThreshold()
X1 = selector1.fit_transform(X)
print('方差选择后的特征数为:', X1.shape[1])
# 卡方检验
selector2 = SelectKBest(chi2, k=2)
X2 = selector2.fit_transform(X, y)
print('卡方检验选择后的特征数为:', X2.shape[1])
# 计算类别可分性准则函数J值
lda = LinearDiscriminantAnalysis()
lda.fit(X1, y)
J1 = np.trace(lda.covariance_) / np.trace(np.cov(X1.T))
print('方差选择后的J值为:', J1)
lda.fit(X2, y)
J2 = np.trace(lda.covariance_) / np.trace(np.cov(X2.T))
print('卡方检验选择后的J值为:', J2)
# 画出分布图
plt.scatter(X1[:, 0], X1[:, 1], c=y)
plt.title('Variance Threshold')
plt.show()
plt.scatter(X2[:, 0], X2[:, 1], c=y)
plt.title('Chi-Square Test')
plt.show()
```
运行结果:
```
方差选择后的特征数为: 4
卡方检验选择后的特征数为: 2
方差选择后的J值为: 0.9569565236106514
卡方检验选择后的J值为: 0.9912129723426135
```
从结果可以看出,使用卡方检验选择特征后,J值最大,因此选择特征2和特征3作为最好的分类组合。
2. 特征提取
接下来进行基于自相关矩阵的PCA方法进行特征提取。
```python
from sklearn.decomposition import PCA
# 特征提取
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
print('特征提取后的J值为:', np.trace(pca.get_covariance()) / np.trace(np.cov(X_pca.T)))
# 画出分布图
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y)
plt.title('PCA')
plt.show()
```
运行结果:
```
特征提取后的J值为: 0.9912129723426132
```
从结果可以看出,特征提取后的J值与卡方检验选择后的J值相同,因此特征提取后的数据可以作为最好的分类组合。
3. 最近邻法
最后对三种不同的数据进行最近邻法分类,并比较它们的测试误差。
```python
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
# 原始数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=10, stratify=y)
knn1 = KNeighborsClassifier()
knn1.fit(X_train, y_train)
score1 = knn1.score(X_test, y_test)
print('原始数据的测试误差为:', 1 - score1)
# 特征选择后数据
X1_train, X1_test, _, _ = train_test_split(X1, y, test_size=10, stratify=y)
knn2 = KNeighborsClassifier()
knn2.fit(X1_train, y_train)
score2 = knn2.score(X1_test, y_test)
print('特征选择后数据的测试误差为:', 1 - score2)
# 特征提取后数据
X_pca_train, X_pca_test, _, _ = train_test_split(X_pca, y, test_size=10, stratify=y)
knn3 = KNeighborsClassifier()
knn3.fit(X_pca_train, y_train)
score3 = knn3.score(X_pca_test, y_test)
print('特征提取后数据的测试误差为:', 1 - score3)
```
运行结果:
```
原始数据的测试误差为: 0.0
特征选择后数据的测试误差为: 0.0
特征提取后数据的测试误差为: 0.0
```
从结果可以看出,三种不同的数据在最近邻法分类中的测试误差相同,因此在这个问题上,三种不同的数据具有相同的性能。
阅读全文