示例#1
0
void
nv_mlp_predict_vector(const nv_mlp_t *mlp,
					  nv_matrix_t *p, int p_j,
					  const nv_matrix_t *x, int x_j)
{
	int m;
	float y;
	nv_matrix_t *input_y = nv_matrix_alloc(mlp->hidden, 1);
	nv_matrix_t *hidden_y = nv_matrix_alloc(mlp->output, 1);
	float dropout_scale = 1.0f - mlp->dropout;
	float noise_scale = 1.0f - mlp->noise;
	
#ifdef _OPENMP
#pragma omp parallel for private(y)
#endif
	for (m = 0; m < mlp->hidden; ++m) {
		y = NV_MAT_V(mlp->input_bias, m, 0) * NV_MLP_BIAS;
		y += nv_vector_dot(x, x_j, mlp->input_w, m) * noise_scale;
		NV_MAT_V(input_y, 0, m) = nv_mlp_sigmoid(y) * dropout_scale;
	}
	for (m = 0; m < mlp->output; ++m) {
		y = NV_MAT_V(mlp->hidden_bias, m, 0) * NV_MLP_BIAS;
		y += nv_vector_dot(input_y, 0, mlp->hidden_w, m);
		NV_MAT_V(hidden_y, 0, m) = nv_mlp_sigmoid(y);
	}
	nv_mlp_softmax(p, p_j, hidden_y, 0);

	nv_matrix_free(&input_y);
	nv_matrix_free(&hidden_y);
}
示例#2
0
/* 回帰 */
void nv_mlp_regression(const nv_mlp_t *mlp, 
					   const nv_matrix_t *x, int xm, nv_matrix_t *out, int om)
{
	int m;
	float y;
	nv_matrix_t *input_y = nv_matrix_alloc(mlp->input_w->m, 1);
	nv_matrix_t *hidden_y = nv_matrix_alloc(mlp->hidden_w->m, 1);

#ifdef _OPENMP
#pragma omp parallel for private(y)
#endif
	for (m = 0; m < mlp->input_w->m; ++m) {
		y = NV_MAT_V(mlp->input_bias, m, 0)  * NV_MLP_BIAS;
		y += nv_vector_dot(x, xm, mlp->input_w, m);
		NV_MAT_V(input_y, 0, m) = nv_mlp_sigmoid(y);
	}

	for (m = 0; m < mlp->hidden_w->m; ++m) {
		y = NV_MAT_V(mlp->hidden_bias, m, 0) * NV_MLP_BIAS;
		y += nv_vector_dot(input_y, 0, mlp->hidden_w, m);
		NV_MAT_V(hidden_y, 0, m) = y;
	}

	nv_vector_copy(out, om, hidden_y, 0);

	nv_matrix_free(&input_y);
	nv_matrix_free(&hidden_y);
}
示例#3
0
float nv_mlp_predict(const nv_mlp_t *mlp,
					 const nv_matrix_t *x, int xm, int cls)
{
	int m;
	float y;
	nv_matrix_t *input_y = nv_matrix_alloc(mlp->input_w->m, 1);
	nv_matrix_t *hidden_y = nv_matrix_alloc(mlp->output, 1);
	nv_matrix_t *output_y = nv_matrix_alloc(mlp->output, 1);
	float p;
	double dropout_scale = 1.0 - mlp->dropout;
	float noise_scale = 1.0f - mlp->noise;
	
#ifdef _OPENMP
#pragma omp parallel for private(y)
#endif
	for (m = 0; m < mlp->hidden; ++m) {
		y = NV_MAT_V(mlp->input_bias, m, 0) * NV_MLP_BIAS;
		y += nv_vector_dot(x, xm, mlp->input_w, m) * noise_scale;
		NV_MAT_V(input_y, 0, m) = nv_mlp_sigmoid(y) * dropout_scale;
	}

	for (m = 0; m < mlp->output; ++m) {
		y = NV_MAT_V(mlp->hidden_bias, m, 0) * NV_MLP_BIAS;
		y += nv_vector_dot(input_y, 0, mlp->hidden_w, m);
		NV_MAT_V(hidden_y, 0, m) = nv_mlp_sigmoid(y);
	}
	nv_mlp_softmax(output_y, 0, hidden_y, 0);
	p = NV_MAT_V(output_y, 0, cls);

	nv_matrix_free(&input_y);
	nv_matrix_free(&hidden_y);
	nv_matrix_free(&output_y);

	return p;
}
示例#4
0
void
nv_matrix_sort(nv_matrix_t *mat, int sort_column_n, nv_sort_dir_e dir)
{
	nv_matrix_t *sort_data = nv_matrix_alloc(2, mat->m);
	nv_matrix_t *tmp = nv_matrix_alloc(mat->n, mat->m);
	int m;

	for (m = 0; m < mat->m; ++m) {
		NV_MAT_V(sort_data, m, 0) = NV_MAT_V(mat, m, sort_column_n);
		NV_MAT_V(sort_data, m, 1) = (float)m;
	}
	if (dir == NV_SORT_DIR_ASC) {
		qsort(sort_data->v, sort_data->m,
			sort_data->step * sizeof(float), nv_column_cmp_asc);
	} else {
		qsort(sort_data->v, sort_data->m,
			sort_data->step * sizeof(float), nv_column_cmp_desc);
	}
	for (m = 0; m < mat->m; ++m) {
		nv_vector_copy(tmp, m, mat, (int)NV_MAT_V(sort_data, m, 1));
	}
	nv_matrix_copy(mat, 0, tmp, 0, mat->m);

	nv_matrix_free(&sort_data);
	nv_matrix_free(&tmp);
}
int
main(void)
{
	nv_matrix_t *data = nv_matrix_alloc(PATCH_SIZE * PATCH_SIZE * 3, SAMPLES);
	nv_matrix_t *centroids = nv_matrix_alloc(data->n, CENTROIDS);
	nv_matrix_t *zca_u = nv_matrix_alloc(data->n, data->n);
	nv_matrix_t *zca_m = nv_matrix_alloc(data->n, 1);
	std::vector<fileinfo_t> list;
	
	fileinfo_read(list, TRAIN_FILE);
	printf("read file list %d\n", (int)list.size());
	patch_sampling(data, list);
	printf("end patch sampling\n");
	
	nv_standardize_local_all(data, 10.0f);
	nv_zca_train(zca_m, 0, zca_u, data, 0.1f);
	nv_zca_whitening_all(data, zca_m, 0, zca_u);
	printf("end whitening\n");
	kmeans(centroids, data);
	
	nv_save_matrix_bin("zca_u.mat", zca_u);
	nv_save_matrix_bin("zca_m.mat", zca_m);
	nv_save_matrix_bin("centroids.mat", centroids);
	
	nv_matrix_free(&data);
	nv_matrix_free(&zca_u);
	nv_matrix_free(&zca_m);
	nv_matrix_free(&centroids);
	
	return 0;
}
// Mahalanobis distance
float nv_mahalanobis(const nv_cov_t *cov, const nv_matrix_t *x, int xm)
{
	int n;
	nv_matrix_t *y = nv_matrix_alloc(x->n, 1);
	nv_matrix_t *x2 = nv_matrix_alloc(x->n, 1);
	float distance;
	float delta2 = 0.0f;

	nv_matrix_zero(y);
	nv_matrix_zero(x2);
	for (n = 0; n < x2->n; ++n) {
		NV_MAT_V(x2, 0, n) = NV_MAT_V(x, xm, n) - NV_MAT_V(cov->u, 0, n);
	}
	nv_gemv(y, 0, NV_MAT_TR, cov->eigen_vec, x2, xm);
	for (n = 0; n < x->n; ++n) {
		float ev = NV_MAT_V(cov->eigen_val, n, 0);
		float xv = NV_MAT_V(y, 0, n);
		delta2 += (xv * xv) / ev;
	}

	distance = sqrtf(delta2);
	nv_matrix_free(&x2);
	nv_matrix_free(&y);

	return distance;
}
示例#7
0
void
nv_test_knn_lmca(const nv_matrix_t *train_data,
				 const nv_matrix_t *train_labels,
				 const nv_matrix_t *test_data,
				 const nv_matrix_t *test_labels)
{
	nv_matrix_t *train_data_lmca = nv_matrix_alloc(DIM, train_data->m);
	nv_matrix_t *vec = nv_matrix_alloc(DIM, 1);
	nv_matrix_t *l = nv_matrix_alloc(train_data->n, DIM);
	int i, ok;
	nv_knn_result_t results[KNN_K];
	long t;
	
	NV_TEST_NAME;
	nv_lmca_progress(1);
	
	printf("train: %d, test: %d, %ddim ->  %ddim\n",
		   train_data->m,
		   test_data->m,
		   train_data->n,
		   DIM
		);
	t = nv_clock();
	nv_lmca(l, train_data, train_labels, NK, MK, MARGIN, PUSH_RATIO, DELTA, EPOCH);
	printf("-- %ldms\n", nv_clock() - t);
	nv_lmca_projection_all(train_data_lmca, l, train_data);
	
	ok = 0;
	for (i = 0; i < test_data->m; ++i) {
		int knn[NV_TEST_DATA_K] = {0};
		int j, n, max_v, max_i;

		nv_lmca_projection(vec, 0, l, test_data, i);
		
		n = nv_knn(results, KNN_K, train_data_lmca, vec, 0);
		for (j = 0; j < n; ++j) {
			++knn[NV_MAT_VI(train_labels, results[j].index, 0)];
		}
		max_v = max_i= 0;
		for (j = 0; j < NV_TEST_DATA_K; ++j) {
			if (max_v < knn[j]) {
				max_v = knn[j];
				max_i = j;
			}
		}
		if (max_i == NV_MAT_VI(test_labels, i, 0)) {
			++ok;
		}
	}
	printf("Accuracy = %f%% (%d/%d)\n",
		   (float)ok / test_data->m * 100.0f,
		   ok, test_data->m);
	
	nv_matrix_free(&train_data_lmca);
	nv_matrix_free(&vec);
	nv_matrix_free(&l);
	
	fflush(stdout);
}
示例#8
0
int main(void)
{
	nv_matrix_t *data = nv_load_matrix(NV_TEST_DATA);
	nv_matrix_t *labels = nv_load_matrix(NV_TEST_LABEL);
	nv_matrix_t *train_data = nv_matrix_alloc(data->n, data->m / 4 * 3);
	nv_matrix_t *train_labels = nv_matrix_alloc(labels->n, labels->m / 4 * 3);
	nv_matrix_t *test_data = nv_matrix_alloc(data->n, data->m - train_data->m);
	nv_matrix_t *test_labels = nv_matrix_alloc(labels->n, labels->m - train_labels->m);

	nv_vector_normalize_all(data);
	nv_srand(11);
	nv_dataset(data, labels,
			   train_data, train_labels,
			   test_data, test_labels);
	NV_BACKTRACE;
	nv_test_sha1();
	nv_test_io();
	nv_test_serialize();
	nv_test_eigen();
	nv_test_matrix();
	nv_test_keypoint();
	
	nv_test_knn_pca(train_data, train_labels, test_data, test_labels);
	nv_test_knn2(train_data, train_labels, test_data, test_labels);
	
#ifdef NV_TEST_ML
	nv_test_knn_lmca(train_data, train_labels, test_data, test_labels);
	nv_test_knn_2pass_lmca(train_data, train_labels, test_data, test_labels);
	
	nv_test_lr(train_data, train_labels, test_data, test_labels);
	nv_test_arow(train_data, train_labels, test_data, test_labels);
	nv_test_mlp(train_data, train_labels, test_data, test_labels);
	nv_test_dae(train_data, train_labels, test_data, test_labels);
	nv_test_nb(train_data, train_labels, test_data, test_labels);
	
	nv_test_knn(train_data);
	nv_test_kmeans(train_data, train_labels, NV_TEST_DATA_K);
	nv_test_lbgu(train_data, train_labels);	
	nv_test_klr(train_data, train_labels);
	nv_test_knb(train_data, train_labels);

	nv_test_kmeans_tree(train_data, train_labels);
	nv_test_pca_kmeans_tree(train_data, train_labels);
	nv_test_klr_tree(train_data, train_labels);
	
	//nv_test_plsi();
#endif	
	nv_test_munkres();
	
	nv_matrix_free(&data);
	nv_matrix_free(&labels);
	nv_matrix_free(&train_data);
	nv_matrix_free(&train_labels);
	nv_matrix_free(&test_data);
	nv_matrix_free(&test_labels);
	
	return 0;
}
示例#9
0
文件: nv_vlad.hpp 项目: kyama/otama
	void
	extract_dense(nv_matrix_t *vlad, int j,
				  const nv_matrix_t *image,
				  nv_keypoint_dense_t *dense,
				  int ndense
		)
	{
		NV_ASSERT(vlad->n == DIM);
		int desc_m;
		nv_matrix_t *key_vec;
		nv_matrix_t *desc_vec;
		nv_matrix_t *resize, *gray, *smooth;
		
		int i;
		int km = 0;

		if (m_fit_area == 0) {
			float scale = IMG_SIZE() / (float)NV_MAX(image->rows, image->cols);	
			resize = nv_matrix3d_alloc(3, (int)(image->rows * scale),
									   (int)(image->cols * scale));
		} else {
			float axis_ratio = (float)image->rows / image->cols;
			int new_cols = (int)sqrtf(m_fit_area / axis_ratio);
			int new_rows = (int)((float)m_fit_area / new_cols);
			resize = nv_matrix3d_alloc(3, new_rows, new_cols);
		}
		gray = nv_matrix3d_alloc(1, resize->rows, resize->cols);
		smooth = nv_matrix3d_alloc(1, resize->rows, resize->cols);
		
		for (i = 0; i < ndense; ++i) {
			km += dense[i].rows * dense[i].cols;
		}
		km *= 2;
		key_vec = nv_matrix_alloc(NV_KEYPOINT_KEYPOINT_N, km);
		desc_vec = nv_matrix_alloc(NV_KEYPOINT_DESC_N, km);
		nv_resize(resize, image);
		nv_gray(gray, resize);
		nv_gaussian5x5(smooth, 0, gray, 0);
		
		nv_matrix_zero(desc_vec);
		nv_matrix_zero(key_vec);
		
		desc_m = nv_keypoint_dense_ex(m_ctx, key_vec, desc_vec, smooth, 0,
									  dense, ndense);
		feature_vector(vlad, j, key_vec, desc_vec, desc_m);
		
		nv_matrix_free(&gray);
		nv_matrix_free(&resize);
		nv_matrix_free(&smooth);
		nv_matrix_free(&key_vec);
		nv_matrix_free(&desc_vec);
	}
示例#10
0
int main(void)
{
	nv_matrix_t *train_data = nv_load_matrix_bin("../data/train_data.mat");
	nv_matrix_t *train_labels = nv_load_matrix_bin("../data/train_labels.mat");
	nv_matrix_t *test_data = nv_load_matrix_bin("../data/test_data.mat");
	nv_matrix_t *train_lmca = nv_matrix_alloc(DIM, train_data->m);
	nv_matrix_t *test_lmca = nv_matrix_alloc(DIM, test_data->m);
	nv_matrix_t *l;	
	int i;
	FILE *fp;

	nv_vector_normalize_all(train_data);
	nv_vector_normalize_all(test_data);
	
	nv_srand(11);
	
	printf("train: %d, test: %d, %ddim\n",
		   train_data->m,
		   test_data->m,
		   train_data->n);
#if !LOAD_L
	l = nv_matrix_alloc(train_data->n, DIM);	
	nv_lmca_progress(1);
	nv_lmca(l, train_data, train_labels, NK, MK, MARGIN, PUSH_RATIO, DELTA, EPOCH);
	nv_save_matrix_bin("lmca_l.mat", l);
#else
	l = nv_load_matrix_bin("lmca_l.mat");
#endif
	for (i = 0; i < train_data->m; ++i) {
		nv_lmca_projection(train_lmca, i, l, train_data, i);
	}
	for (i = 0; i < test_data->m; ++i) {
		nv_lmca_projection(test_lmca, i, l, test_data, i);
	}
	printf("end LMCA Projection\n");
	
	fp = fopen("submission.txt", "w");
	fprintf(fp, "ImageId,Label\n");
	for (i = 0; i < test_data->m; ++i) {
		fprintf(fp, "%d,%d\n", i + 1, predict(train_lmca, train_labels, test_lmca, i));
	}
	fclose(fp);
	nv_matrix_free(&train_data);
	nv_matrix_free(&train_labels);
	nv_matrix_free(&test_data);
	nv_matrix_free(&train_lmca);
	nv_matrix_free(&test_lmca);
	nv_matrix_free(&l);
	
	return 0;
}
示例#11
0
nv_plsi_t *
nv_plsi_alloc(int d, int w, int k)
{
	nv_plsi_t *p = (nv_plsi_t *)nv_malloc(sizeof(nv_plsi_t));

	p->k = k;
	p->d = d;
	p->w = w;

	p->z = nv_matrix_alloc(p->k, 1);
	p->dz = nv_matrix_alloc(p->k, p->d);
	p->wz = nv_matrix_alloc(p->k, p->w);

	return p;
}
示例#12
0
void 
nv_contrast(nv_matrix_t *dest, int dch,
			const nv_matrix_t *src, int sch,
			float angle)// 0.0f-90.0f
{
	int i, j;
	float deg_scale = NV_PI / 180.0f;
	nv_matrix_t *conv = nv_matrix_alloc(256, 1);

	NV_ASSERT(dest->m == src->m);
	NV_ASSERT(dch <= dest->n);
	NV_ASSERT(sch <= src->n);

	for (i = 0; i < conv->n; ++i) {
		NV_MAT_V(conv, 0, i) = tanf(angle * deg_scale) * ((float)i - 127.0f) + 127.0f;
		if (NV_MAT_V(conv, 0, i) > 255.0f) {
			NV_MAT_V(conv, 0, i) = 255.0f;
		}
		if (NV_MAT_V(conv, 0, i) < 0.0f) {
			NV_MAT_V(conv, 0, i) = 0.0f;
		}
	}
	for (j = 0; j < src->m; ++j) {
		NV_ASSERT(NV_MAT_V(src, j, sch) < 256.0f);
		NV_ASSERT(NV_MAT_V(src, j, sch) > 0.0f);

		NV_MAT_V(dest, j, dch) = NV_MAT_V(conv, 0, (int)NV_MAT_V(src, j, sch));
	}
}
示例#13
0
nv_pa_t *
nv_pa_alloc(int n, int k)
{
	nv_pa_t *pa = (nv_pa_t *)nv_alloc_type(nv_pa_t, 1);
	NV_ASSERT(k >= 2);
	
	pa->n = n;
	pa->k = k;
	if (pa->k == 2) {
		pa->w = nv_matrix_alloc(pa->n, 1);
	} else {
		pa->w = nv_matrix_alloc(pa->n, k);
	}
	
	return pa;
}
示例#14
0
static nv_matrix_t *
conv_image2vec(const nv_bgseg_t *bg,
			   const nv_matrix_t *image)
{
	nv_matrix_t *vec;
	nv_matrix_t *smooth;
	nv_matrix_t *resize = NULL, *gray = NULL;
	int i;
	float scale = (float)bg->size / (float)NV_MAX(image->rows, image->cols);

	if (scale != 1.0f) {
		resize = nv_matrix3d_alloc(image->n,
								   NV_ROUND_INT(image->rows * scale),
								   NV_ROUND_INT(image->cols * scale));
		nv_resize(resize, image);
		image = resize;
	}
	if (image->n != 1) {
		gray = nv_matrix3d_alloc(1, image->rows, image->cols);
		nv_gray(gray, image);
		image = gray;
	}
	vec = nv_matrix_alloc(image->rows * image->cols, 1);
	smooth = nv_matrix_clone(image);
	nv_gaussian5x5(smooth, 0, image, 0);

	for (i = 0; i < image->m; ++i) {
		NV_MAT_V(vec, 0, i) = NV_MAT_V(smooth, i, 0);
	}
	nv_matrix_free(&smooth);
	nv_matrix_free(&gray);
	nv_matrix_free(&resize);
	
	return vec;
}
示例#15
0
nv_bgseg_t *
nv_bgseg_alloc(int frame_rows, int frame_cols,
			   float zeta, float bg_v, float fg_v,
			   int size
	)
{
	nv_bgseg_t *bg = nv_alloc_type(nv_bgseg_t, 1);
	float scale = (float)size / (float)NV_MAX(frame_rows, frame_cols);
	
	bg->init_1st = 0;
	bg->init_2nd = 0;
	bg->init_1st_finished = 0;
	bg->init_2nd_finished = 0;
	bg->frame_rows = frame_rows;
	bg->frame_cols = frame_cols;
	bg->rows = NV_ROUND_INT(frame_rows * scale);
	bg->cols = NV_ROUND_INT(frame_cols * scale);
	
	bg->zeta = zeta;
	bg->bg_v = bg_v;
	bg->fg_v = fg_v;
	bg->size = size;
	
	bg->av = nv_matrix_alloc(1 * bg->rows * bg->cols, 1);
	nv_matrix_zero(bg->av);
	bg->sgm = nv_matrix_dup(bg->av);
	
	return bg;
}
示例#16
0
int nv_mlp_predict_label(const nv_mlp_t *mlp, const nv_matrix_t *x, int xm)
{
	int m;
	int label = -1;
	float max_output = -FLT_MAX;
	nv_matrix_t *input_y = nv_matrix_alloc(mlp->input_w->m, 1);
	float dropout_scale = 1.0f - mlp->dropout;
	float noise_scale = 1.0f - mlp->noise;

#ifdef _OPENMP
#pragma omp parallel for
#endif
	for (m = 0; m < mlp->hidden; ++m) {
		float y = NV_MAT_V(mlp->input_bias, m, 0) * NV_MLP_BIAS;
		y += nv_vector_dot(x, xm, mlp->input_w, m) * noise_scale;
		NV_MAT_V(input_y, 0, m) = nv_mlp_sigmoid(y) * dropout_scale;
	}
	for (m = 0; m < mlp->output; ++m) {
		float y = NV_MAT_V(mlp->hidden_bias, m, 0) * NV_MLP_BIAS;
		y += nv_vector_dot(input_y, 0, mlp->hidden_w, m);
		if (max_output < y) {
			label = m;
			max_output = y;
		}
	}
	nv_matrix_free(&input_y);

	return label;
}
示例#17
0
nv_mlp_t *nv_mlp_alloc(int input, int hidden, int k)
{
	nv_mlp_t *mlp = (nv_mlp_t *)nv_malloc(sizeof(nv_mlp_t));

	mlp->input = input;
	mlp->hidden = hidden;
	mlp->output = k;
	mlp->dropout = 0.0f;
	mlp->noise = 0.0f;
	mlp->input_w = nv_matrix_alloc(input, hidden);
	mlp->hidden_w = nv_matrix_alloc(mlp->input_w->m, k);
	mlp->input_bias = nv_matrix_alloc(1, hidden);
	mlp->hidden_bias = nv_matrix_alloc(1, k);

	return mlp;
}
示例#18
0
void nv_contrast_sigmoid(nv_matrix_t *dest, int dch,
						 const nv_matrix_t *src, int sch,
						 float gain) // 0.1f-1.0f
{
	int i, j;
	nv_matrix_t *conv = nv_matrix_alloc(256, 1);
	float max_v = -FLT_MAX;
	float min_v = FLT_MAX;

	NV_ASSERT(dest->m == src->m);
	NV_ASSERT(dch <= dest->n);
	NV_ASSERT(sch <= src->n);

	for (j = 0; j < src->m; ++j) {
		if (max_v < NV_MAT_V(src, j, sch)) {
			max_v = NV_MAT_V(src, j, sch);
		}
		if (min_v > NV_MAT_V(src, j, sch)) {
			min_v = NV_MAT_V(src, j, sch);
		}
	}

	for (i = 0; i < conv->n; ++i) {
		float x = 255.0f * ((float)i - min_v) / max_v;
		NV_MAT_V(conv, 0, i) = 255.0f * (1.0f / (1.0f + expf(-gain * (x - 128.0f) * 0.078125f)));
	}
	for (j = 0; j < src->m; ++j) {
		NV_ASSERT(NV_MAT_V(src, j, sch) < 256.0f);
		NV_ASSERT(NV_MAT_V(src, j, sch) > 0.0f);
		NV_MAT_V(dest, j, dch) = NV_MAT_V(conv, 0, (int)NV_MAT_V(src, j, sch));
	}
}
示例#19
0
float 
nv_gaussian_log_predict(int npca, const nv_cov_t *cov, const nv_matrix_t *x, int xm)
{
	static const float LOG_PI_0_5_NEGA = -0.5723649f;
	nv_matrix_t *y = nv_matrix_alloc(x->n, 1);
	int n;
	float p;

	NV_ASSERT(npca <= x->n);

	if (npca == 0) {
		npca = (int)(x->n * 0.4f);
	}
	p = LOG_PI_0_5_NEGA * npca;

	nv_vector_sub(y, 0, x, xm, cov->u, 0);
	for (n = 0; n < npca; ++n) {
		float xv = nv_vector_dot(cov->eigen_vec, n, y, 0);
		float ev = NV_MAT_V(cov->eigen_val, n, 0) * 2.0f;
		p += -(0.5f * logf(ev)) - (xv * xv) / (ev);
	}
	nv_matrix_free(&y);

	return p;
}
示例#20
0
/* この関数は次元が高いと確率が小さくなりすぎて数値計算できないので
 * 次元が高い場合は, この関数値の対数であるnv_gaussian_log_predictを使うこと.
 */
float 
nv_gaussian_predict(const nv_cov_t *cov, const nv_matrix_t *x, int xm)
{
	int n;
	nv_matrix_t *y = nv_matrix_alloc(x->n, 2);
	float p = 1.0f;
	float d = (float)x->n;
	float delta2 = 0.0f;
	float lambda = 1.0f;

	nv_vector_sub(y, 0, x, xm, cov->u, 0);
	nv_matrix_mulv(y, 1, cov->eigen_vec, NV_MAT_TR, y, 0);
	for (n = 0; n < x->n; ++n) {
		float ev = NV_MAT_V(cov->eigen_val, n, 0);
		float xv = NV_MAT_V(y, 1, n);
		if (ev > 0.0f) {
			delta2 += (xv * xv) / ev;
			lambda *= sqrtf(ev);
		}
	}
	p = (1.0f / powf(2.0f * NV_PI, d / 2.0f)) * (1.0f / lambda) * expf(-0.5f * delta2);

	nv_matrix_free(&y);

	return p;
}
示例#21
0
static void
nv_test_klr_tree_inherit(const nv_matrix_t *data,const nv_matrix_t *labels,
						 nv_klr_tree_t *tree, const nv_klr_tree_t *base)
{
	nv_matrix_t *cluster_labels = nv_matrix_alloc(1, data->m);
	float purity;
	int i;

	NV_TEST_NAME;
	printf("tree: ");
	for (i = 0; i < tree->height; ++i) {
		if (i != 0) {
			printf(", ");
		}
		printf("%d", tree->dim[i]);
	}
	printf("\n");

	if (base == NULL) {
		nv_klr_tree_train(tree, data, NV_LR_PARAM(4, 0.1f, NV_LR_REG_L1, 0.0001f, 1), 100);
	} else {
		nv_klr_tree_inherit_train(tree, base,
								  data, NV_LR_PARAM(4, 0.1f, NV_LR_REG_L1, 0.0001f, 1), 100);
	}
	for (i = 0; i < data->m; ++i) {
		NV_MAT_V(cluster_labels, i, 0) = (float)nv_klr_tree_predict_label(tree, data, i);
	}
	purity = nv_purity(K, NV_TEST_DATA_K, cluster_labels, labels);
	printf("purity: %f\n", purity);
	NV_ASSERT(purity > 0.5f);
	
	nv_matrix_free(&cluster_labels);
}
示例#22
0
static void nv_test_klr_tree_ex(const nv_matrix_t *data, const nv_matrix_t *labels,
								int *width, int height)
{
	nv_matrix_t *cluster_labels = nv_matrix_alloc(1, data->m);
	nv_klr_tree_t *tree = nv_klr_tree_alloc(data->n, width, height);
	float purity;
	int i;

	NV_TEST_NAME;
	printf("tree: ");
	for (i = 0; i < height; ++i) {
		if (i != 0) {
			printf(", ");
		}
		printf("%d", width[i]);
	}
	printf("\n");

	nv_klr_tree_train(tree, data, NV_LR_PARAM(4, 0.1f, NV_LR_REG_L1, 0.0001f, 1), 100);
	for (i = 0; i < data->m; ++i) {
		NV_MAT_V(cluster_labels, i, 0) = (float)nv_klr_tree_predict_label(tree, data, i);
	}
	purity = nv_purity(K, NV_TEST_DATA_K, cluster_labels, labels);
	printf("purity: %f\n", purity);
	NV_ASSERT(purity > 0.5f);
	
	nv_klr_tree_free(&tree);
	nv_matrix_free(&cluster_labels);
}
示例#23
0
nv_matrix_t *nv_matrix3d_alloc(int n, int rows, int cols)
{
	nv_matrix_t *mat = nv_matrix_alloc(n, rows * cols);
	mat->rows = rows;
	mat->cols = cols;

	return mat;
}
示例#24
0
nv_arow_t *
nv_arow_alloc(int n, int k)
{
	nv_arow_t *arow = (nv_arow_t *)nv_alloc_type(nv_arow_t, 1);
	NV_ASSERT(k >= 2);
	
	arow->n = n;
	arow->k = k;
	if (arow->k == 2) {
		arow->w = nv_matrix_alloc(arow->n, 1);
	} else {
		arow->w = nv_matrix_alloc(arow->n, k);
	}
	arow->bias = nv_matrix_alloc(1, k);
	
	return arow;
}
void
kmeans(nv_matrix_t *centroids,
	   const nv_matrix_t *data)
{
	nv_matrix_t *cluster_labels = nv_matrix_alloc(1, data->m);
	nv_matrix_t *count = nv_matrix_alloc(1, CENTROIDS);

	nv_matrix_zero(count);
	nv_matrix_zero(centroids);
	nv_matrix_zero(cluster_labels);
	
	nv_kmeans_progress(1);
	nv_kmeans(centroids, count, cluster_labels, data, CENTROIDS, 50);

	nv_matrix_free(&cluster_labels);
	nv_matrix_free(&count);
}
示例#26
0
/*
 * 45°回転したIntegral Image
 */
void 
nv_integral_tilted(nv_matrix_t *integral,
				   const nv_matrix_t *img, int channel)
{
	int row, col, scol, srow;
	int erow = img->rows + 1;
	int ecol = img->cols + 1;
	nv_matrix_t *prev_tilted = nv_matrix_alloc(img->cols + 1, 1);

	NV_ASSERT(
		integral->rows - 1 == img->rows 
		&& integral->cols - 1 == img->cols
	);

	nv_matrix_zero(prev_tilted);
	nv_matrix_zero(integral);

	for (scol = img->cols; scol > 0; --scol) {
		float tilted_sum = 0.0f;
		for (row = 1, col = scol; row < erow && col < ecol; ++row, ++col) {
			float tilted_val = NV_MAT3D_V(img, row - 1, col - 1, channel);
			if (col + 1 == ecol) {
				NV_MAT3D_V(integral, row, col, 0) = 
					NV_MAT3D_V(integral, row - 1, col, 0)
					+ tilted_sum + tilted_val;
			} else {
				NV_MAT3D_V(integral, row, col, 0) = 
					NV_MAT3D_V(integral, row - 1, col + 1, 0) 
					+ NV_MAT_V(prev_tilted, 0, col)
					+ tilted_sum + tilted_val;
			}
			tilted_sum += tilted_val;
			NV_MAT_V(prev_tilted, 0, col) = tilted_sum;
		}
	}
	for (srow = 2; srow < erow; ++srow) {
		float tilted_sum = 0.0f;
		for (row = srow, col = 1; row < erow && col < ecol; ++row, ++col) {
			float tilted_val = NV_MAT3D_V(img, row - 1, col - 1, channel);
			if (col + 1 == ecol) {
				NV_MAT3D_V(integral, row, col, 0) = 
					NV_MAT3D_V(integral, row - 1, col, 0)
					+ tilted_sum + tilted_val;
			} else {
				NV_MAT3D_V(integral, row, col, 0) = 
					NV_MAT3D_V(integral, row - 1, col + 1, 0) 
					+ NV_MAT_V(prev_tilted, 0, col)
					+ tilted_sum + tilted_val;
			}
			tilted_sum += tilted_val;
			NV_MAT_V(prev_tilted, 0, col) = tilted_sum;
		}
	}

	nv_matrix_free(&prev_tilted);
}
示例#27
0
nv_lr_t *
nv_lr_alloc(int n, int k)
{
	nv_lr_t *lr = (nv_lr_t *)nv_malloc(sizeof(nv_lr_t));
	lr->n = n;
	lr->k = k;
	lr->w = nv_matrix_alloc(lr->n, k);

	nv_matrix_zero(lr->w);

	return lr;
}
示例#28
0
文件: nv_vlad.hpp 项目: kyama/otama
	inline char *
	serialize(const nv_matrix_t *vlad, int j)
	{
		nv_matrix_t *mat = nv_matrix_alloc(vlad->n, 1);
		char *s;
		
		nv_vector_copy(mat, 0, vlad, j);
		s = nv_serialize_matrix(mat);
		nv_matrix_free(&mat);
		
		return s;
	}
示例#29
0
void nv_test_lbgu(const nv_matrix_t *data, const nv_matrix_t *labels)
{
	nv_matrix_t *cluster_labels = nv_matrix_alloc(1, data->m);
	nv_matrix_t *centroids = nv_matrix_alloc(data->n, K);
	nv_matrix_t *count = nv_matrix_alloc(1, K);
	float purity;
	
	NV_TEST_NAME;

	nv_lbgu(centroids, count, cluster_labels, data, K, 50, 50);
	
	purity = nv_purity(K, NV_TEST_DATA_K, cluster_labels, labels);
	printf("purity: %f\n", purity);
	NV_ASSERT(purity > 0.7f);
	
	nv_matrix_free(&cluster_labels);
	nv_matrix_free(&centroids);
	nv_matrix_free(&count);

	fflush(stdout);
}
示例#30
0
static void
normalize(nv_matrix_t *data)
{
	int j;
	nv_matrix_t *mean = nv_matrix_alloc(data->n, 1);
	nv_matrix_mean(mean, 0, data);
	for (j = 0; j < data->m; ++j) {
		nv_vector_sub(data, j, data, j, mean, 0);
	}
	nv_matrix_normalize_shift(data, 0.0f, 1.0f);
	nv_matrix_free(&mean);
}