2015-10-08 3 views
3

Я пытаюсь обернуть голову вокруг машинного обучения внутри python. Я работал со следующим примером (http://scikit-learn.org/stable/auto_examples/plot_multioutput_face_completion.html#example-plot-multioutput-face-completion-py) с примером кода ниже.python - linear regression - image

Я хотел бы проверить/подтвердить свое понимание внутренней работы линейной регрессии. Цель состоит в том, чтобы предсказать нижнюю недостающую половину изображения, посмотрев на известную верхнюю половину изображения. Изначально было 300 64 * 64 изображений (4096 пикселей). Независимая переменная X представляет собой матрицу 300 * 2048 (300 изображений, 2048 пикселей (верхняя половина этих изображений). Зависимая переменная также является матрицей 300 * 2048 (нижняя половина изображений). Кажется, что матрица коэффициентов является . 2048 * 2048 матрицы я прав в моем понимании, что:

  • , что прогноз для одного пикселя у (например, изображений 1, наиболее uppper левого пикселя) выполняются multiplicatoin всех 2048 пикселов в верхняя половина изображения в 1 раз превышает набор коэффициентов регрессии - и, таким образом, каждый недостающий пиксель в нижней половине оценивается с учетом всех 2048 пикселей этого конкретного изображения?

  • что регрессия co (каждый пиксель y имеет различный набор коэффициентов регрессии 2048), и что эти коэффициенты оцениваются путем нахождения соответствия OLS для этого конкретного местоположения пикселей по идентичному местоположению пикселей по 300 имеющимся изображениям?

Я вполне мог бы быть смущен матрицами - поэтому, пожалуйста, исправьте меня, если я ошибаюсь. большое спасибо. W

print(__doc__) 

import numpy as np 
import matplotlib.pyplot as plt 

from sklearn.datasets import fetch_olivetti_faces 
from sklearn.utils.validation import check_random_state 

from sklearn.ensemble import ExtraTreesRegressor 
from sklearn.neighbors import KNeighborsRegressor 
from sklearn.linear_model import LinearRegression 
from sklearn.linear_model import RidgeCV 

# Load the faces datasets 
data = fetch_olivetti_faces() 
targets = data.target 

data = data.images.reshape((len(data.images), -1)) 
train = data[targets < 30] 
test = data[targets >= 30] # Test on independent people 

# Test on a subset of people 
n_faces = 5 
rng = check_random_state(4) 
face_ids = rng.randint(test.shape[0], size=(n_faces,)) 
test = test[face_ids, :] 

n_pixels = data.shape[1] 
X_train = train[:, :np.ceil(0.5 * n_pixels)] # Upper half of the faces 
y_train = train[:, np.floor(0.5 * n_pixels):] # Lower half of the faces 
X_test = test[:, :np.ceil(0.5 * n_pixels)] 
y_test = test[:, np.floor(0.5 * n_pixels):] 

# Fit estimators 
ESTIMATORS = { 
    "Extra trees": ExtraTreesRegressor(n_estimators=10, max_features=32, 
             random_state=0), 
    "K-nn": KNeighborsRegressor(), 
    "Linear regression": LinearRegression(), 
    "Ridge": RidgeCV(), 
} 

y_test_predict = dict() 
for name, estimator in ESTIMATORS.items(): 
    estimator.fit(X_train, y_train) 
    y_test_predict[name] = estimator.predict(X_test) 
+1

Линейная регрессия вряд ли будет работать для этой проблемы, вместо этого предложит нейронные сети. – par

+1

@ user2662639 проблема - демонстрация sklearn. нейронные сети не являются панацеей - в этой проблеме есть всего 300 примеров обучения, поэтому их производительность не будет существенно отличаться (попробуйте установить неподготовленную «глубокую» сеть до 300 примеров и посмотреть, что произойдет. Ваша структура сети должна быть намного меньше, чтобы иметь возможность работать). Лучшим решением будет наложение гладкости в структуру вывода, например. с регуляризованной матричной факторизацией, среди других подходов – eqzx

ответ

1

Вы правы.

В каждом изображении имеется 4096 пикселей. Каждый выходной пиксель в тестовом наборе представляет собой линейную комбинацию коэффициентов обучения для этого пикселя и 2048 входных пикселей из тестового набора.

Если вы посмотрите на sklearn Linear Regression documentation, вы увидите, что коэффициенты Многоцелевой регрессии имеют форму (n_targets, n_features) (2048 мишенями, 2048) Особенности

In [24]: ESTIMATORS['Linear regression'].coef_.shape 
Out[24]: (2048, 2048) 

Под капотом , он вызывает scipy.linalg.lstsq, поэтому важно отметить, что между коэффициентами нет «обмена информацией» в том смысле, что каждый вывод представляет собой отдельную линейную комбинацию всех 2048 входных пикселей.

Смежные вопросы