①加载数据集代码:
import sklearn
from sklearn.datasets import load_iris
iris = load_iris()
if __name__ == '__main__':
iris = sklearn.datasets.load_iris()
# data对应了样本的4个特征,150行4列
print('>> shape of data:')
print(iris.data.shape)
# 显示样本特征的前5行
print('>> line top 5:')
print(iris.data[:5])
# target对应了样本的类别(目标属性),150行1列
print('>> shape of target:')
print(iris.target.shape)
# 显示所有样本的目标属性
print('>> show target of data:')
print(iris.target)
②数据标准化(去均值)代码:
R=np.array(iris.data)
# 求每一列的平均值
B=np.mean(R,axis=0,keepdims=True)
print('>>average matrix')
print(B)
# 得到均值矩阵
R=np.matrix(R)-np.matrix(B)
print('after-ave top 5 matrix')
print(R[:5])
此处使用np.mean()函数直接求均值,并将R直接减去均值矩阵(np.matrix()函数会自动对均值矩阵进行扩容),得到标准化(去均值)后的代码。
③求协方差矩阵代码:
R_cov = np.cov(R, rowvar=False)
iris_covmat = pd.DataFrame(data=R_cov, columns=iris.feature_names)
此处引入np.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None)函数,对给定的数据和权重,估计协方差矩阵
并通过pandas库的DataFrame函数对协方差矩阵进行展示;
④求特征值和特征向量代码:
# 计算特征值和特征向量
eig_values, eig_vectors = np.linalg.eig(R_cov)
# 选取前两个特征向量进行后续操作
featureVector = eig_vectors[:, :2]
此处使用np.linalg.eig()函数求协方差矩阵的特征值与特征向量。此处将iris数据集降维至二维,故选取前两个特征向量进行操作。
⑤将数据降到k维(k的值可以依据原数据集选取,如果使用iris数据集,k可以取值为2),按特征值大小排序,选取前k个特征值对应的特征向量,计算:
# 二维简化:
featureVector_t = np.transpose(featureVector)
R_t = np.transpose(R)
newDataset_t = np.matmul(featureVector_t, R_t)
newDataset = np.transpose(newDataset_t)
print('>>2D data:')
print(newDataset[:5])
为了建立新的数据集,我们需要将新特征向量(选定的主成分)的转置左乘原始矩阵(R)的转置。之后,输出前五组降维成功后的数值。
(作业请勿直接复制粘贴请勿直接复制粘贴请勿直接复制粘贴)