Форум сайта python.su
Добрый день, не нашёл куда написать решил здесь
Кто подскажет в чём ошибка вычислений.
Получаю результаты но не те, правильные результаты получены на другой программе, и от других людей
Должно быть
theta = [ 1.273005, 0.624876, 1.177376, -2.020142, -0.912616, -1.429907, 0.125668, -0.368551, -0.360033, -0.171068, -1.460894, -0.052499, -0.618889, -0.273745, -1.192301, -0.240993, -0.207934, -0.047224, -0.278327, -0.296602, -0.453957, -1.045511, 0.026463, -0.294330, 0.014381, -0.328703, -0.143796, -0.924883, ]
from numpy import * from scipy.optimize import fmin_bfgs from pylab import scatter, show, legend, xlabel, ylabel, contour, title def sigmoid(X): den = 1.0 + e ** (-1.0 * X) d = 1.0 / den return d def compute_cost(theta,X,y, lambd): m = X.shape[0] theta = reshape(theta,(len(theta),1)) h = sigmoid(X.dot(theta)) thetaR = theta[1:, 0] J = -1.0 / m * (dot(y.transpose(), log(h)) + dot(1 - y.transpose(), log(1 - h))) J += lambd / (2 * m) * sum(theta[1 : :] ** 2) return J.flatten() def grad(theta, X, y,lambd): m = X.shape[0] p_1 = sigmoid(dot(X, theta)) error = p_1 - y grad = dot(error, X) / y.size # gradient vector return grad def grad2(theta, X, y,lambd): m = X.shape[0] x_bias = hstack((ones((m, 1)), X)) theta = atleast_2d(theta).transpose() theta = [0] * (X.shape[1] + 1) p_1 = sigmoid(dot(x_bias, theta)) error = p_1 - y grad = 1.0 / m * (dot(x_bias.transpose(), error)) #grad[1 : :] += lambd / m * theta[1 : :] return grad def grad3(theta, X1, y,lambd): h = sigmoid(X1.dot(theta)) delta = h - y sumdelta = delta.T.dot(X1[:, 1]) grad1 = (1.0 / m) * sumdelta XR = X1[:, 1:X1.shape[1]] sumdelta = delta.T.dot(XR) #thetaR = theta[1:, 0] thetaR = theta[1:] grad = (1.0 / m) * (sumdelta + lambd * thetaR) #out = zeros(shape=(grad.shape[0], grad.shape[1] + 1)) out = zeros(shape=(grad.shape[0]+1)) out[1:] = grad out[0] = lambd / m * theta[:1]#grad1 #return out.T.flatten() return out def grad4(theta, x2, y,lambd): x_bias = hstack((ones((m, 1)), x2)) theta = atleast_2d(theta).transpose() grad = 1.0 / m * (dot(x_bias.transpose(), sigmoid(dot(x_bias, theta)) - y)) grad[1 : :] += lambd / m * theta[1 : :] return grad.ravel() def grad5(theta, X1, y,lambd): h = sigmoid(X1.dot(theta)) delta = h - y #XR = X1[:, 1:X1.shape[1]] XR = X1 sumdelta = delta.T.dot(XR) grad = (1.0 / m) * (sumdelta + lambd * theta) out = zeros(shape=(grad.shape[0]+1)) out = grad out[1:] += lambd / m * theta[:1]#grad1 #return out.T.flatten() return out def grad6(theta2, X1, y,lamb): #x_bias = hstack((ones((m, 1)), x)) grad = 1.0 / m * (dot(X1.transpose(), sigmoid(dot(X1, theta2)) - y)) grad[1::] += lamb / m * theta2[1::] return grad.ravel() #return grad def map_feature(x1, x2): x1.shape = (x1.size, 1) x2.shape = (x2.size, 1) degree = 6 out = ones(shape=(x1[:, 0].size, 1)) for i in range(1, degree + 1): for j in range(i + 1): r = (x1 ** (i - j)) * (x2 ** j) out = hstack((out, r)) return out data = loadtxt('ex2data2.txt', delimiter=',') x = data[:, 0:2] y = data[:, 2] x = map_feature(x[:, 0], x[:, 1]) m = x.shape[0] initial_theta = zeros(shape=(x.shape[1], 1)) C_candidates = [0, 0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30] for C in C_candidates: args = (x,y,C) theta = fmin_bfgs(compute_cost, initial_theta,grad6, args, maxiter=400) thetaT=atleast_2d(theta).transpose() print (thetaT)
Прикреплённый файлы: ex2data2.txt (2,2 KБ)
Офлайн
Офлайн
AlenСпасибо это я знаю, но я хочу именно так реализовать, без сторонних решений
http://scikit-learn.org/stable/modules/linear_model.html#logistic-regressionhttp://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression
Офлайн
vladimircape
Спасибо это я знаю, но я хочу именно так реализовать, без сторонних решений
>>> from sklearn import linear_model >>> import numpy as np >>> data = np.loadtxt('ex2data2.txt', delimiter=',') >>> x = data[:, 0: 2] >>> y = data[:, 2] >>> >>> def map_feature(x1, x2): ... x1.shape = (x1.size, 1) ... x2.shape = (x2.size, 1) ... degree = 6 ... out = np.ones(shape=(x1[:, 0].size, 1)) ... for i in range(1, degree + 1): ... for j in range(i + 1): ... r = (x1 ** (i - j)) * (x2 ** j) ... out = np.hstack((out, r)) ... ... ... return out ... >>> x = map_feature(x[:, 0], x[:, 1]) >>> r = linear_model.LogisticRegression(C=7.87) >>> r.fit(x, y).coef_.transpose() array([[ 1.27527008], [ 1.67667301], [ 2.73909281], [-3.92749475], [-3.04555774], [-3.77871683], [ 0.66911772], [-1.02492058], [-0.54455106], [-0.40115601], [-3.08416556], [ 0.39068965], [-1.63244448], [-1.06671461], [-2.59803018], [-0.5532881 ], [-0.45571055], [ 0.44930121], [-0.99660016], [-1.06673074], [-0.21340722], [-2.43662735], [ 0.37429854], [-0.70248633], [ 0.33342375], [-1.02206424], [-0.80371194], [-1.23544215]])
Отредактировано Alen (Сен. 13, 2014 22:19:13)
Офлайн
AlenСпасибо за советы, воспользуюсь вашим решением, может поможет найти ошибку
Офлайн
Очень странно но fming_bs от Питона, дал лучший прогноз 88% чем fmin от октаве
Офлайн
есть еще момент с округлением, попробуй заюзать decim. Только есть момент со скоростью обработки, он тормозит.
Офлайн