Преобразовать массив строк в массив переменных Numpy - PullRequest
0 голосов
/ 30 марта 2020

У меня есть набор данных X, который я преобразую в пространство более высокого измерения, используя sci-kit PolynomialFeatures \ phi (x). После этого мне нужно вычислить производную от \ phi (x) по x_1, x_2 .. x_n (особенности x). В следующем примере я использовал autograd для вычисления производной функции, которую я явно определил.

Что я хотел бы сделать, это получить преобразованную функцию \ phi (x) из PolynomialFeatures get_feature_names () и получить его производную. В моей реализации я использую лямбда-функцию для определения \ phi (x). Тем не менее, get_feature_names () возвращает список строк, поэтому я не могу напрямую дать вывод get_feature_names (). Можно ли автоматизировать этот процесс (строка 52 в коде).

from __future__ import division

import autograd.numpy as np
import numpy as np
from autograd import jacobian
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import PolynomialFeatures

# #############################################################################
# Generate data
# #############################################################################
number_of_samples = 1000

# generate points and keep a subset of them
sample_points = np.linspace(0, 2, number_of_samples * 100)
rng = np.random.RandomState(0)
rng.shuffle(sample_points)
x_1 = np.sort(sample_points[:number_of_samples])

rng = np.random.RandomState(64)
rng.shuffle(sample_points)
x_2 = np.sort(sample_points[:number_of_samples])

# Add noise to targets
fx = np.sin(np.sqrt(x_1 ** 2 + x_2 ** 2)).ravel()
noise = np.random.normal(0, 0.05, number_of_samples)
fx += noise

scaler = MinMaxScaler()

x_1 = scaler.fit_transform(x_1.reshape(-1, 1))
x_2 = scaler.fit_transform(x_2.reshape(-1, 1))
fx = scaler.fit_transform(fx.reshape(-1, 1))

X = np.column_stack((x_1, x_2))
# #############################################################################

# do a polynomial transformation
poly = PolynomialFeatures(3, include_bias=False)
poly.fit(X)

# get the transformed feature names
names = []
for input_feature_num in range(X.shape[1]):
    names.append('x[{}]'.format(input_feature_num))
feature_names = poly.get_feature_names(input_features=names)
feature_names = [feature_name.replace(' ', '*') for feature_name in feature_names]
feature_names = [feature_name.replace('^', '**') for feature_name in feature_names]

# get the derivative
# TODO: get the function from the 'feature_names' instead of explicitly defining it
fun = lambda x: np.array(
    [x[0], x[1], x[0] ** 2, x[0] * x[1], x[1] ** 2, x[0] ** 3, x[0] ** 2 * x[1], x[0] * x[1] ** 2, x[1] ** 3])
# what I want
# fun = lambda x: np.array(feature_names)

val = np.random.randint(5, size=(2, 1))
test = jacobian(fun)(val)
print(test.reshape(9, 2))

...