gpt4 book ai didi

python - 没有运行时错误,但虹膜 PCA 绘图错误

转载 作者:行者123 更新时间:2023-12-01 09:33:36 25 4
gpt4 key购买 nike

我正在使用以下代码对 iris 数据集执行 PCA:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# get iris data to a dataframe:
from sklearn import datasets
iris = datasets.load_iris()
varnames = ['SL', 'SW', 'PL', 'PW']
irisdf = pd.DataFrame(data=iris.data, columns=varnames)
irisdf['Species'] = [iris.target_names[a] for a in iris.target]

# perform pca:
from sklearn.decomposition import PCA
model = PCA(n_components=2)
scores = model.fit_transform(irisdf.iloc[:,0:4])
loadings = model.components_

# plot results:
scoredf = pd.DataFrame(data=scores, columns=['PC1','PC2'])
scoredf['Grp'] = irisdf.Species
sns.lmplot(fit_reg=False, x="PC1", y='PC2', hue='Grp', data=scoredf) # plot point;
loadings = loadings.T
for e, pt in enumerate(loadings):
plt.plot([0,pt[0]], [0,pt[1]], '--b')
plt.text(x=pt[0], y=pt[1], s=varnames[e], color='b')
plt.show()

我得到以下情节:

enter image description here

但是,当我与其他网站的绘图(例如 http://marcoplebani.com/pca/ )进行比较时,我的绘图不正确。似乎存在以下差异:

  1. 花瓣长度和花瓣宽度线的长度应相似。
  2. 萼片长度线应更接近花瓣长度和花瓣宽度线,而不是更接近萼片宽度线。
  3. 所有 4 条线都应位于 x 轴的同一侧。

为什么我的情节不正确。错误在哪里以及如何纠正?

最佳答案

这取决于您是否缩放方差。 “其他站点”使用 scale=TRUE。如果您想使用 sklearn 执行此操作,请在拟合模型之前添加 StandardScaler 并使用缩放后的数据拟合模型,如下所示:

from sklearn.preprocessing import StandardScaler
X = StandardScaler().fit_transform(irisdf.iloc[:,0:4])
scores = model.fit_transform(X)

enter image description here

编辑:StandardScalernormalize 之间的区别

这里是an answer它指出了一个关键的区别(行与列)。即使您在这里使用 normalize,您也可能需要考虑 X = normalize(X.T).T。下面的代码显示了转换后的一些差异:

import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler, normalize

iris = datasets.load_iris()
varnames = ['SL', 'SW', 'PL', 'PW']

fig, ax = plt.subplots(2, 2, figsize=(16, 12))

irisdf = pd.DataFrame(data=iris.data, columns=varnames)
irisdf.plot(kind='kde', title='Raw data', ax=ax[0][0])

irisdf_std = pd.DataFrame(data=StandardScaler().fit_transform(irisdf), columns=varnames)
irisdf_std.plot(kind='kde', title='StandardScaler', ax=ax[0][1])

irisdf_norm = pd.DataFrame(data=normalize(irisdf), columns=varnames)
irisdf_norm.plot(kind='kde', title='normalize', ax=ax[1][0])

irisdf_norm = pd.DataFrame(data=normalize(irisdf.T).T, columns=varnames)
irisdf_norm.plot(kind='kde', title='normalize', ax=ax[1][1])

plt.show()

enter image description here

我不确定我能对算法/数学进行深入研究。 StandardScaler 的要点是获得跨特征的统一/一致的均值和方差。假设具有大测量单位的变量不一定(也不应该)在 PCA 中占主导地位。换句话说,StandardScaler 使功能对 PCA 的贡献同等。正如您所看到的,归一化不会给出一致的均值或方差。

关于python - 没有运行时错误,但虹膜 PCA 绘图错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49736849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com