Вопрос или проблема
У меня есть простая программа для выполнения PCA-анализа на наборе данных. Цель состоит в том, чтобы умножить набор данных на вектор признаков в конце программы.
import pandas as pd
import numpy as np
from numpy import linalg as LA
def main():
s = pd.read_csv('A1-dm.csv')
s = pca(s)
def pca(s):
# Нормализовать каждый s
A1 = s[['A1']].to_numpy()
A2 = s[['A2']].to_numpy()
print(A1.ndim)
if 'A3' in s:
A3 = s[['A3']].to_numpy()
A3_norm = A3/np.linalg.norm(A3)
A1_norm = A1/np.linalg.norm(A1)
A2_norm = A2/np.linalg.norm(A2)
data = np.array([A1_norm,A2_norm])
if 'A3' in s:
data = np.array([A1_norm,A2_norm,A3_norm]).squeeze()
# определение ковариации
covMatrix = np.cov(data,bias=True)
print(covMatrix)
# вычисление собственных векторов и собственных значений
w, v = LA.eig(covMatrix)
print("собственные векторы")
print(v)
print("собственные значения")
print(w)
varianceV = np.empty(3)
# вычисление дисперсий
varianceV[0] = w[0]/(w[0]+w[1]+w[2])
varianceV[1] = w[1]/(w[0]+w[1]+w[2])
varianceV[2] = w[2]/(w[0]+w[1]+w[2])
print(f' дисперсия v1 : {varianceV[0]}')
print(f' дисперсия v2 : {varianceV[1]}')
print(f' дисперсия v3 : {varianceV[2]}')
# вычисление вектора признаков
v_initial = 0
featureVector = np.empty(3)
for i in range(0,3):
if varianceV[i] > v_initial:
featureVector = v[i]
print(f'вектор признаков: {featureVector}')
resolved_dataset = np.concatenate(featureVector,s.to_numpy())
print(f'набор данных = {resolved_dataset}')
main()
Ожидается:
3×3 матрица, состоящая из столбцов A1, A2, A3, должна быть умножена на 3×1 вектор так, чтобы возвращенный набор данных был преобразован через главные компоненты.
Фактический:
2
[[ 2.22742836e-03 -1.08176619e-04 1.28813346e-03]
[-1.08176619e-04 2.37308545e-03 -5.81124131e-05]
[ 1.28813346e-03 -5.81124131e-05 7.48662113e-04]]
собственные векторы
[[-0.50114911 -0.84926886 0.16610832]
[-0.0016557 0.19289331 0.98121834]
[ 0.86535936 -0.49146168 0.09807444]]
собственные значения
[2.78617954e-06 2.99742571e-03 2.34896403e-03]
дисперсия v1 : 0.0005208614522544459
дисперсия v2 : 0.5603528012046752
дисперсия v3 : 0.4391263373430704
вектор признаков: [ 0.86535936 -0.49146168 0.09807444]
Ошибка трассировки (последний вызов был выполнен):
Файл ".\cov.py", строка 62, в <module>
main()
Файл ".\cov.py", строка 8, в main
s = pca(s)
Файл ".\cov.py", строка 59, в pca
resolved_dataset = np.concatenate(featureVector,s.to_numpy())
TypeError: только целочисленные массивы с масштабами могут быть преобразованы в скалярный индекс
Вот пример набора данных
A1,A2,A3,Class
2,0.4631338,1.5,3
8,0.7460648,3.0,3
6,0.264391038,2.5,2
5,0.4406713,2.3,1
2,0.410438159,1.5,3
2,0.302901816,1.5,2
6,0.275869396,2.5,3
8,0.084782428,3.0,3
2,0.53226533,1.5,2
8,0.070034818,2.9,1
2,0.668631847,1.5,2
2,0.215622639,1.5,2
2,0.148916231,1.5,3
2,0.51335434,1.5,3
Любая помощь в выяснении, как выполнить эту операцию, будет очень признательна. Спасибо.
Если я правильно понимаю, вы просто хотите умножить вектор признаков на каждый из столбцов вашего набора данных, т.е. 0.865 * 2
, -0.491 * 0.463
и 0.098 * 1.5
. Это можно просто сделать, используя знак *
:
import pandas as pd
df = pd.read_csv("data.csv")
feature_vector = [0.8653593, -0.49146168, 0.09807444]
df[["A1", "A2", "A3"]] = df[["A1", "A2", "A3"]] * feature_vector
Что возвращает следующий dataframe:
A1 | A2 | A3 | Class |
---|---|---|---|
1.73072 | -0.227613 | 0.147112 | 3 |
6.92287 | -0.366662 | 0.294223 | 3 |
5.19216 | -0.129938 | 0.245186 | 2 |
4.3268 | -0.216573 | 0.225571 | 1 |
1.73072 | -0.201715 | 0.147112 | 3 |
Ответ или решение
Для выполнения умножения DataFrame Pandas на вектор NumPy, в данном контексте, который вы описали в процессе анализа главных компонент (PCA), необходимо уточнить несколько аспектов вашего кода и воплотить правильный подход к операции.
1. Общее описание задачи
Вы хотите преобразовать ваш набор данных, представленный в виде DataFrame, с использованием вектора признаков, полученного из анализа PCA. Это преобразование позволит вам помочь в визуализации данных и в дальнейшем анализе.
2. Умножение DataFrame на вектор
Первым делом, ниже представлен корректный метод использования операции умножения для преобразования ваших данных:
import pandas as pd
import numpy as np
def main():
# Загрузка данных
df = pd.read_csv('A1-dm.csv')
feature_vector = np.array([0.86535936, -0.49146168, 0.09807444])
# Умножение DataFrame на вектор
df[['A1', 'A2', 'A3']] = df[['A1', 'A2', 'A3']].values * feature_vector
print(df)
main()
3. Пошаговое объяснение
Шаг 1: Загрузка данных
Здесь вы загружаете данные из CSV-файла, в котором находятся ваши показатели A1, A2 и A3, которые вы будете умножать на вектор признаков.
Шаг 2: Определение вектора признаков
Вектор признаков — это массив NumPy, который вы получили из анализа PCA. Убедитесь, что он имеет ту же размерность, что и колонки, которые вы хотите умножать.
Шаг 3: Умножение DataFrame на вектор
Используйте метод .values
, чтобы извлечь ваши данные в виде массива NumPy для выполнения операции умножения. Важно выделить только те колонки, с которыми вы хотите работать, и назначить результат обратно в соответствующие колонки DataFrame.
4. Решение возникшей ошибки
Вы сталкивались с ошибкой TypeError: only integer scalar arrays can be converted to a scalar index
, что указывает на неверное использование np.concatenate
. Для выполнения этого действия используется просто операция умножения, как показано выше.
5. Пример результата
При правильном выполнении этих шагов вы получите новый DataFrame, в котором значения колонок A1, A2 и A3 будут умножены на соответствующий элемент вектора признаков. Это позволит вам проверить, как преобразуются ваши данные во времени PCA.
Заключение
Суммируя, умножение DataFrame Pandas на вектор NumPy простое и эффективное. Главное – убедиться, что размеры ваших массивов совместимы и правильно обработать данные после загрузки. Это основа для успешного выполнения анализа PCA и дальнейшей работы с данными.