Pagini recente » Cod sursa (job #1687339) | Cod sursa (job #2810684) | Cod sursa (job #878465) | Cod sursa (job #2108771) | Cod sursa (job #1242614)
#include <stdio.h>
#include <math.h>
#define NMax 200010
const char IN[] = "oypara.in", OUT[] = "oypara.out";
struct point {
double x;
double y;
int p;
};
int N;
double alpha = 1.0, theta[3];
point p[2 * NMax];
inline double sqr( double x ) {
return x * x;
}
double h( double * theta, point p ) {
double sum = theta[0] + theta[1] * p.x + theta[2] * p.y;
return 1 / ( 1 + exp(-sum));
}
double J( double * theta ) {
double ret = 0;
for ( int i = 1; i <= N; ++ i ) {
ret -= 1 / 2 * ( p[i].p * log(h(theta, p[i])) + (1 - p[i].p) * log( 1 - h(theta, p[i])) );
}
return ret / N;
}
void dJ( double * theta, double * out ) {
out[0] = out[1] = out[2] = 0;
for ( int i = 1; i <= N; ++ i ) {
double val = sqr(h(theta,p[i]) - p[i].p);
out[0] -= val;
out[1] -= val * p[i].x;
out[2] -= val * p[i].y;
}
out[0] /= N;
out[1] /= N;
out[2] /= N;
}
void solve() {
static double out[3];
theta[0] = 1;
for ( int iter = 1; iter <= 40; ++ iter ) {
dJ(theta, out);
for ( int i = 0; i < 3; ++ i )
theta[i] -= alpha * out[i];
}
}
int main() {
freopen(IN, "r", stdin);
scanf("%d", &N);
for ( int i = 1; i <= N; ++ i ) {
int x, y1, y2;
scanf("%d%d%d", &x, &y1, &y2 );
p[2 * i - 1].x = x;
p[2 * i - 1].y = y1;
p[2 * i - 1].p = 1;
p[2 * i].x = x;
p[2 * i].y = y2;
p[2 * i].p = 0;
}
N *= 2;
solve();
freopen(OUT, "w", stdout);
//printf("%lf %lf %lf\n", theta[0], theta[1], theta[2]);
printf("1 %d 2 %d\n", (int)(0.5 + (theta[0] + theta[1]) / theta[2]), (int)((theta[0] + 2 * theta[1]) / theta[2]));
return 0;
}