Проблема при попытке построения графика после применения PCA к набору данных - PullRequest
1 голос
/ 04 июня 2019

Я пытаюсь построить результаты PCA набора данных pima-indians-diabetes.csv .Мой код показывает проблему только в части графика:

import numpy
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import pandas as pd

# Dataset Description:
#    1. Number of times pregnant
#    2. Plasma glucose concentration a 2 hours in an oral glucose tolerance test
#    3. Diastolic blood pressure (mm Hg)
#    4. Triceps skin fold thickness (mm)
#    5. 2-Hour serum insulin (mu U/ml)
#    6. Body mass index (weight in kg/(height in m)^2)
#    7. Diabetes pedigree function
#    8. Age (years)
#    9. Class variable (0 or 1)

path = 'pima-indians-diabetes.data.csv'
dataset = numpy.loadtxt(path, delimiter=",")
X = dataset[:,0:8]
Y = dataset[:,8]

features = ['1','2','3','4','5','6','7','8','9']
df = pd.read_csv(path, names=features)

x = df.loc[:, features].values          # Separating out the values
y = df.loc[:,['9']].values              # Separating out the target
x = StandardScaler().fit_transform(x)   # Standardizing the features


pca = PCA(n_components=2)
principalComponents = pca.fit_transform(x)
# principalDf = pd.DataFrame(data=principalComponents, columns=['pca1', 'pca2'])
# finalDf = pd.concat([principalDf, df[['9']]], axis = 1)

plt.figure()
colors = ['navy', 'turquoise', 'darkorange']
lw = 2
for color, i, target_name in zip(colors, [0, 1, 2], ['Negative', 'Positive']):
    plt.scatter(principalComponents[y == i, 0], principalComponents[y == i, 1], color=color, alpha=.8, lw=lw,
                label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('PCA of pima-indians-diabetes Dataset')

Ошибка находится в следующей строке:

Traceback (most recent call last):
  File "test.py", line 53, in <module>
    plt.scatter(principalComponents[y == i, 0], principalComponents[y == i, 1], color=color, alpha=.8, lw=lw,
IndexError: too many indices for array

Пожалуйста, как это исправить?

1 Ответ

1 голос
/ 04 июня 2019

Поскольку ошибка указывает на какое-то несоответствие формы / размера, хорошей отправной точкой является проверка форм массивов, участвующих в операции:

principalComponents.shape

выходы

(768, 2)

, а

(y==i).shape

(768, 1)

Что приводит к несоответствию формы при попытке запуска

principalComponents[y==i, 0]

, поскольку первый массив уже многомерен, поэтому ошибка указывает на то, что вы использовали слишком много индексов для массива.

Вы можете исправить это путем принудительного преобразования формы y==i в одномерный массив ((768,)), например, изменив свой звонок на scatter на

    plt.scatter(principalComponents[(y == i).reshape(-1), 0],
                principalComponents[(y == i).reshape(-1), 1],
                color=color, alpha=.8, lw=lw, label=target_name)

, который затем создает сюжет для меня enter image description here

Для получения дополнительной информации о разнице между массивами формы (R, 1) и (R,) этот вопрос о StackOverflow обеспечивает хорошую отправную точку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...