【问题标题】:How do I show a scatter plot in Python after doing PCA?进行 PCA 后如何在 Python 中显示散点图?
【发布时间】:2017-05-22 06:12:49
【问题描述】:

我自己制作了一个随机数据,其中包含一个包含 18 行和 5 列的文本文件,其中包含所有整数条目。

我成功地进行了 PCA,但现在卡住了。我无法做散点图。这是我的代码:

f=open(r'<path>mydata.txt')
print(f.read()) #reading from a file


with open(r'<path>mydata.txt') as f:
emp= []
for line in f:
    line = line.split() 
    if line:            
        line = [int(i) for i in line]
        emp.append(line)


from sklearn.decomposition import PCA
import pylab as pl
from itertools import cycle
X = emp
pca = PCA(n_components=3, whiten=True).fit(X)
X_pca = pca.transform(X) #regular PCA

现在,完成 PCA 并知道我的方差后,我该如何绘图?

这是我的数据集中的示例数据的外观:

2    1    2    3    0
2    3    2    3    0
1    3    1    1    0
1    5    2    1    0
2    3    1    1    0
3    3    0    1    0
7    1    1    1    1
7    2    2    1    1
1    1    1    4    1
3    2    3    2    1
2    2    2    2    1
1    3    2    3    1
2    3    2    1    2
2    2    1    1    2
7    5    3    2    2
3    4    2    4    2
2    1    1    1    2
7    1    3    3    2

【问题讨论】:

  • 为问题添加一些上下文,您想用散点图显示什么,示例数据集中的列是什么,您编写了哪些代码来解决问题。
  • 样本数据的最后一列代表一种类型,我将数据分为三种类型。该数据类似于 Fisher 的 Iris 数据集,但数字是捏造的。我希望散点图以聚类的形式向我展示不同的类型。
  • this 回答你的问题了吗?
  • @Skynet 在 PCA 之后,由于我的数据现在减少到 3 维,我应该考虑哪些数组?因为,如果您可以在上面看到我的代码,则数据已被制成列表列表。现在,我想在 PCA 之后做一个散点图,以便点聚集。数据类似于 Fisher Iris 数据。
  • 那么您是在问我们,如何在散点图中可视化数据的某些行/列(会是哪些?),或者您是在问我们,您应该考虑哪些行/列?在第一种情况下,我们可以帮助您,在第二种情况下,您可能问错了地方。例如,有一个 StackExchange 站点专门用于统计数据,称为 CrossValidated

标签: python matplotlib statistics anaconda data-science


【解决方案1】:

这是你要求的吗?

import numpy as np
from matplotlib import pyplot as plt


data1 = [np.random.normal(0,0.1, 10), np.random.normal(0,0.1,10)]
data2 = [np.random.normal(1,0.2, 10), np.random.normal(2,0.3,10)]
data3 = [np.random.normal(-2,0.1, 10), np.random.normal(1,0.5,10)]


plt.scatter(data1[0],data1[1])
plt.scatter(data2[0],data2[1])
plt.scatter(data3[0],data3[1])

plt.show()

三个不同数据集的结果如下所示:

编辑

希望我现在能更好地理解您的问题。这里是新代码:

import numpy as np
from matplotlib import pyplot as plt    

with open(r'mydata.txt') as f:
    emp= []
    for line in f:
        line = line.split() 
        if line:            
            line = [int(i) for i in line]
            emp.append(line)


from sklearn.decomposition import PCA
import pylab as pl
from itertools import cycle
X = emp
pca = PCA(n_components=3, whiten=True).fit(X)
X_pca = pca.transform(X) #regular PCA

jobs = ['A', 'B', 'C']
job_id = np.array([e[4] for e in emp])

fig, axes = plt.subplots(3,3, figsize=(5,5))

for row in range(axes.shape[0]):
    for col in range(axes.shape[1]):
        ax = axes[row,col]
        if row == col:
            ax.tick_params(
                axis='both',which='both',
                bottom='off',top='off',
                labelbottom='off',
                left='off',right='off',
                labelleft='off'
            )
            ax.text(0.5,0.5,jobs[row],horizontalalignment='center')
        else:
            ax.scatter(X_pca[:,row][job_id==0],X_pca[:,col][job_id==0],c='r')
            ax.scatter(X_pca[:,row][job_id==1],X_pca[:,col][job_id==1],c='g')
            ax.scatter(X_pca[:,row][job_id==2],X_pca[:,col][job_id==2],c='b')
fig.tight_layout()
plt.show()

我将作业命名为 'A', 'B', and 'C',并分别使用 ID 0, 1, and 2。从emp 的最后一行,我创建了一个numpy 数组来保存这些索引。在关键的绘图命令中,我通过作业 ID 屏蔽数据。希望这会有所帮助。

生成的图如下所示:

编辑 2

如果你只想要一个你关联的图,比如 X_pca 的第一列和第二列,代码会变得更简单:

import numpy as np
from matplotlib import pyplot as plt

with open(r'mydata.txt') as f:
    emp= []
    for line in f:
        line = line.split() 
        if line:            
            line = [int(i) for i in line]
            emp.append(line)


from sklearn.decomposition import PCA
import pylab as pl
from itertools import cycle
X = emp
pca = PCA(n_components=3, whiten=True).fit(X)
X_pca = pca.transform(X) #regular PCA

jobs = ['A', 'B', 'C']
job_id = np.array([e[4] for e in emp])

row = 0
col = 1

plt.scatter(X_pca[:,row][job_id==0],X_pca[:,col][job_id==0],c='r')
plt.scatter(X_pca[:,row][job_id==1],X_pca[:,col][job_id==1],c='g')
plt.scatter(X_pca[:,row][job_id==2],X_pca[:,col][job_id==2],c='b')

plt.show()

结果如下:

我强烈建议您阅读这些示例中使用的函数的文档。

【讨论】:

  • 我可能无法正确表达我的问题。这是我想要实现的screenshot。只是我的原始数据没有与之关联的属性,只有数字。这个可以吗?
  • 我的数据中的列代表公司、技能、年龄、位置和工作类型。完成 PCA 后,我希望散点图将我的数据聚类为 3 种类型,每种类型与一种工作相关联。就像 Fisher 的鸢尾花数据所做的那样,根据花卉种类将其聚类为 3 组。同样,我的散点图应根据作业类型 0、1 或 2 分为 3 组。
  • 好吧,现在我觉得自己很愚蠢(我对统计不太了解)。我使用示例输入运行了您的代码,结果 X_pca 是一个 3x4 矩阵。您想要从empX_pca 中的原始数据生成的散点图,并且您只想要一个图,还是像this one 这样的一组图?我是否假设正确,您显示的示例数据集是 emp 的内容?
  • 我想要 x_pca 的散点图。一个情节就可以了,但如果你能帮助我绘制一系列情节,我将不胜感激。
  • 是的,我给出的示例数据是原始数据集的一个实例。 Emp 只是数据列表的列表。
【解决方案2】:

根据您想要获得此功能的评论 (https://imgur.com/a/NJAzU),以下是使用 sklearn 库的方法:

在这个例子中,我使用的是虹膜数据:

第 1 部分:仅绘制散点图

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from numpy import linalg as LA
import pandas as pd
from scipy import stats

iris = datasets.load_iris()
X = iris.data
y = iris.target
#In general a good idea is to scale the data
X = stats.zscore(X)

pca = PCA()
x_new = pca.fit_transform(X)

plt.scatter(x_new[:,0], x_new[:,1], c = y)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()

结果 1

第 2 部分:如果您想绘制著名的双标图

#Create the biplot function
def biplot(score,coeff,labels=None):
    xs = score[:,0]
    ys = score[:,1]
    n = coeff.shape[0]
    scalex = 1.0/(xs.max() - xs.min())
    scaley = 1.0/(ys.max() - ys.min())
    plt.scatter(xs * scalex,ys * scaley, c = y)
    for i in range(n):
        plt.arrow(0, 0, coeff[i,0], coeff[i,1],color = 'r',alpha = 0.5)
        if labels is None:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, "Var"+str(i+1), color = 'g', ha = 'center', va = 'center')
        else:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, labels[i], color = 'g', ha = 'center', va = 'center')
plt.xlim(-1,1)
plt.ylim(-1,1)
plt.xlabel("PC{}".format(1))
plt.ylabel("PC{}".format(2))
plt.grid()


#Call the function. Use only the 2 PCs.
biplot(x_new[:,0:2],np.transpose(pca.components_[0:2, :]))
plt.show()

结果 2

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2017-11-28
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多