主成分分析(PCA) C++ 实现
主成分分析(Principal Components Analysis, PCA)简介可以参考: http://blog.csdn.net/fengbingchun/article/details/78977202
以下是PCA的C++实现,参考OpenCV 3.3中的cv::PCA类。
使用ORL Faces Database作为测试图像。关于ORL Faces Database的介绍可以参考: http://blog.csdn.net/fengbingchun/article/details/79008891
pca.hpp:
#ifndef FBC_NN_PCA_HPP_
#define FBC_NN_PCA_HPP_#include <vector>
#include <string>namespace ANN {template<typename T = float>
class PCA {
public:PCA() = default;int load_data(const std::vector<std::vector<T>>& data, const std::vector<T>& labels);int set_max_components(int max_components);int set_retained_variance(double retained_variance);int load_model(const std::string& model);int train(const std::string& model);// project into the eigenspace, thus the image becomes a "point"int project(const std::vector<T>& vec, std::vector<T>& result) const;// re-create the image from the "point"int back_project(const std::vector<T>& vec, std::vector<T>& result) const;private:// width,height,eigen_vectors;width,height,eigen_values;width,height,meansint save_model(const std::string& model) const;void calculate_covariance_matrix(std::vector<std::vector<T>>& covar, bool scale = false); // calculate covariance matrixint eigen(const std::vector<std::vector<T>>& mat, bool sort_ = true); // calculate eigen vectors and eigen values// generalized matrix multiplication: dst = alpha*src1.t()*src2 + beta*src3.t()int gemm(const std::vector<std::vector<T>>& src1, const std::vector<std::vector<T>>& src2, double alpha,const std::vector<std::vector<T>>& src3, double beta, std::vector<std::vector<T>>& dst, int flags = 0) const;int gemm(const std::vector<T>& src1, const std::vector<std::vector<T>>& src2, double alpha,const std::vector<T>& src3, double beta, std::vector<T>& dst, int flags = 0) const; // GEMM_2_T: flags = 1int normalize(T* dst, int length);int computeCumulativeEnergy() const;int subtract(const std::vector<T>& vec1, const std::vector<T>& vec2, std::vector<T>& result) const;typedef struct Size_ {int width;int height;} Size_;std::vector<std::vector<T>> data;std::vector<T> labels;int samples_num = 0;int features_length = 0;double retained_variance = -1.; // percentage of variance that PCA should retainint max_components = -1; // maximum number of components that PCA should retainstd::vector<std::vector<T>> eigen_vectors; // eigenvectors of the covariation matrixstd::vector<T> eigen_values; // eigenvalues of the covariation matrixstd::vector<T> mean;int covar_flags = 0; // when features_length > samples_num, covar_flags is 0, otherwise is 1
};} // namespace ANN#endif // FBC_NN_PCA_HPP_
pca.cpp:#include "pca.hpp"
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <memory>
#include <fstream>
#include "common.hpp"namespace ANN {template<typename T>
int PCA<T>::load_data(const std::vector<std::vector<T>>& data, const std::vector<T>& labels)
{this->samples_num = data.size();this->features_length = data[0].size();if (samples_num > features_length) {fprintf(stderr, "now only support samples_num <= features_length\n");return -1;}this->data.resize(this->samples_num);for (int i = 0; i < this->samples_num; ++i) {this->data[i].resize(this->features_length);memcpy(this->data[i].data(), data[i].data(), sizeof(T)* this->features_length);}this->labels.resize(this->samples_num);memcpy(this->labels.data(), labels.data(), sizeof(T)*this->samples_num);return 0;
}template<typename T>
int PCA<T>::set_max_components(int max_components)
{CHECK(data.size() > 0);int count = std::min(features_length, samples_num);if (max_components > 0) {this->max_components = std::min(count, max_components);}this->retained_variance = -1.;
}template<typename T>
int PCA<T>::set_retained_variance(double retained_variance)
{CHECK(retained_variance > 0 && retained_variance <= 1);this->retained_variance = retained_variance;this->max_components = -1;
}template<typename T>
void PCA<T>::calculate_covariance_matrix(std::vector<std::vector<T>>& covar, bool scale)
{const int rows = samples_num;const int cols = features_length;const int nsamples = rows;double scale_ = 1.;if (scale) scale_ = 1. / (nsamples /*- 1*/);mean.resize(cols, (T)0.);for (int w = 0; w < cols; ++w) {for (int h = 0; h < rows; ++h) {mean[w] += data[h][w];}}for (auto& value : mean) {value = 1. / rows * value;}// int dsize = ata ? src.cols : src.rows; // ata = false;int dsize = rows;covar.resize(dsize);for (int i = 0; i < dsize; ++i) {covar[i].resize(dsize, (T)0.);}Size_ size{ data[0].size(), data.size() };T* tdst = covar[0].data();int delta_cols = mean.size();T delta_buf[4];int delta_shift = delta_cols == size.width ? 4 : 0;std::unique_ptr<T[]> buf(new T[size.width]);T* row_buf = buf.get();for (int i = 0; i < size.height; ++i) {const T* tsrc1 = data[i].data();const T* tdelta1 = mean.data();for (int k = 0; k < size.width; ++k) {row_buf[k] = tsrc1[k] - tdelta1[k];}for (int j = i; j < size.height; ++j) {double s = 0;const T* tsrc2 = data[j].data();const T* tdelta2 = mean.data();for (int k = 0; k < size.width; ++k) {s += (double)row_buf[k] * (tsrc2[k] - tdelta2[k]);}tdst[j] = (T)(s * scale_);}if (i < covar.size()-1) {tdst = covar[i + 1].data();}}
}namespace {template<typename _Tp>
static inline _Tp hypot_(_Tp a, _Tp b)
{a = std::abs(a);b = std::abs(b);if (a > b) {b /= a;return a*std::sqrt(1 + b*b);}if (b > 0) {a /= b;return b*std::sqrt(1 + a*a);}return 0;
}} // namespacetemplate<typename T>
int PCA<T>::eigen(const std::vector<std::vector<T>>& mat, bool sort_ = true)
{using _Tp = T; // typedef T _Tp;auto n = mat.size();for (const auto& m : mat) {if (m.size() != n) {fprintf(stderr, "mat must be square and it should be a real symmetric matrix\n");return -1;}}eigen_values.resize(n, (T)0.);std::vector<T> V(n*n, (T)0.);for (int i = 0; i < n; ++i) {V[n * i + i] = (_Tp)1;eigen_values[i] = mat[i][i];}const _Tp eps = std::numeric_limits<_Tp>::epsilon();int maxIters{ (int)n * (int)n * 30 };_Tp mv{ (_Tp)0 };std::vector<int> indR(n, 0), indC(n, 0);std::vector<_Tp> A;for (int i = 0; i < n; ++i) {A.insert(A.begin() + i * n, mat[i].begin(), mat[i].end());}for (int k = 0; k < n; ++k) {int m, i;if (k < n - 1) {for (m = k + 1, mv = std::abs(A[n*k + m]), i = k + 2; i < n; i++) {_Tp val = std::abs(A[n*k + i]);if (mv < val)mv = val, m = i;}indR[k] = m;}if (k > 0) {for (m = 0, mv = std::abs(A[k]), i = 1; i < k; i++) {_Tp val = std::abs(A[n*i + k]);if (mv < val)mv = val, m = i;}indC[k] = m;}}if (n > 1) for (int iters = 0; iters < maxIters; iters++) {int k, i, m;// find index (k,l) of pivot pfor (k = 0, mv = std::abs(A[indR[0]]), i = 1; i < n - 1; i++) {_Tp val = std::abs(A[n*i + indR[i]]);if (mv < val)mv = val, k = i;}int l = indR[k];for (i = 1; i < n; i++) {_Tp val = std::abs(A[n*indC[i] + i]);if (mv < val)mv = val, k = indC[i], l = i;}_Tp p = A[n*k + l];if (std::abs(p) <= eps)break;_Tp y = (_Tp)((eigen_values[l] - eigen_values[k])*0.5);_Tp t = std::abs(y) + hypot_(p, y);_Tp s = hypot_(p, t);_Tp c = t / s;s = p / s; t = (p / t)*p;if (y < 0)s = -s, t = -t;A[n*k + l] = 0;eigen_values[k] -= t;eigen_values[l] += t;_Tp a0, b0;#undef rotate
#define rotate(v0, v1) a0 = v0, b0 = v1, v0 = a0*c - b0*s, v1 = a0*s + b0*c// rotate rows and columns k and lfor (i = 0; i < k; i++)rotate(A[n*i + k], A[n*i + l]);for (i = k + 1; i < l; i++)rotate(A[n*k + i], A[n*i + l]);for (i = l + 1; i < n; i++)rotate(A[n*k + i], A[n*l + i]);// rotate eigenvectorsfor (i = 0; i < n; i++)rotate(V[n*k + i], V[n*l + i]);#undef rotatefor (int j = 0; j < 2; j++) {int idx = j == 0 ? k : l;if (idx < n - 1) {for (m = idx + 1, mv = std::abs(A[n*idx + m]), i = idx + 2; i < n; i++) {_Tp val = std::abs(A[n*idx + i]);if (mv < val)mv = val, m = i;}indR[idx] = m;}if (idx > 0) {for (m = 0, mv = std::abs(A[idx]), i = 1; i < idx; i++) {_Tp val = std::abs(A[n*i + idx]);if (mv < val)mv = val, m = i;}indC[idx] = m;}}}// sort eigenvalues & eigenvectorsif (sort_) {for (int k = 0; k < n - 1; k++) {int m = k;for (int i = k + 1; i < n; i++) {if (eigen_values[m] < eigen_values[i])m = i;}if (k != m) {std::swap(eigen_values[m], eigen_values[k]);for (int i = 0; i < n; i++)std::swap(V[n*m + i], V[n*k + i]);}}}eigen_vectors.resize(n);for (int i = 0; i < n; ++i) {eigen_vectors[i].resize(n);eigen_vectors[i].assign(V.begin() + i * n, V.begin() + i * n + n);}return 0;
}template<typename T>
int PCA<T>::gemm(const std::vector<std::vector<T>>& src1, const std::vector<std::vector<T>>& src2, double alpha,const std::vector<std::vector<T>>& src3, double beta, std::vector<std::vector<T>>& dst, int flags) const
{CHECK(flags == 0); // now only support flags = 0CHECK(typeid(T).name() == typeid(double).name() || typeid(T).name() == typeid(float).name()); // T' type can only be float or doubleCHECK(beta == 0. && src3.size() == 0);Size_ a_size{ src1[0].size(), src1.size() }, d_size{ src2[0].size(), a_size.height };int len{ (int)src2.size() };CHECK(a_size.height == len);CHECK(d_size.height == dst.size() && d_size.width == dst[0].size());for (int y = 0; y < d_size.height; ++y) {for (int x = 0; x < d_size.width; ++x) {dst[y][x] = 0.;for (int t = 0; t < d_size.height; ++t) {dst[y][x] += src1[y][t] * src2[t][x];}dst[y][x] *= alpha;}}return 0;
}
template<typename T>
int PCA<T>::gemm(const std::vector<T>& src1, const std::vector<std::vector<T>>& src2, double alpha,const std::vector<T>& src3, double beta, std::vector<T>& dst, int flags = 0) const
{CHECK(flags == 0 || flags == 1); // when flags = 1, GEMM_2_TCHECK(typeid(T).name() == typeid(double).name() || typeid(T).name() == typeid(float).name()); // T' type can only be float or doubleSize_ a_size{ src1.size(), 1 }, d_size;int len = 0;switch (flags) {case 0:d_size = Size_{ src2[0].size(), a_size.height };len = src2.size();CHECK(a_size.width == len);break;case 1:d_size = Size_{ src2.size(), a_size.height };len = src2[0].size();CHECK(a_size.width == len);break;}if (!src3.empty()) {CHECK(src3.size() == d_size.width);}dst.resize(d_size.width);const T* src3_ = nullptr;std::vector<T> tmp(dst.size(), (T)0.);if (src3.empty()) {src3_ = tmp.data();} else {src3_ = src3.data();}if (src1.size() == src2.size()) {for (int i = 0; i < dst.size(); ++i) {dst[i] = (T)0.;for (int j = 0; j < src2.size(); ++j) {dst[i] += src1[j] * src2[j][i];}dst[i] *= alpha;dst[i] += beta * src3_[i];}} else {for (int i = 0; i < dst.size(); ++i) {dst[i] = (T)0.;for (int j = 0; j < src1.size(); ++j) {dst[i] += src1[j] * src2[i][j];}dst[i] *= alpha;dst[i] += beta * src3_[i];}}return 0;
}template<typename T>
int PCA<T>::normalize(T* dst, int length)
{T s = (T)0., a = (T)1.;for (int i = 0; i < length; ++i) {s += dst[i] * dst[i];}s = std::sqrt(s);s = s > DBL_EPSILON ? a / s : 0.;for (int i = 0; i < length; ++i) {dst[i] *= s;}return 0;
}template<typename T>
int PCA<T>::computeCumulativeEnergy() const
{std::vector<T> g(eigen_values.size(), (T)0.);for (int ig = 0; ig < eigen_values.size(); ++ig) {for (int im = 0; im <= ig; ++im) {g[ig] += eigen_values[im];}}int L{ 0 };for (L = 0; L < eigen_values.size(); ++L) {double energy = g[L] / g[eigen_values.size() - 1];if (energy > retained_variance) break;}L = std::max(2, L);return L;
}template<typename T>
int PCA<T>::train(const std::string& model)
{CHECK(retained_variance > 0. || max_components > 0);int count = std::min(features_length, samples_num), out_count = count;if (max_components > 0) out_count = std::min(count, max_components);covar_flags = 0;if (features_length <= samples_num) covar_flags = 1;std::vector<std::vector<T>> covar(count); // covariance matrixcalculate_covariance_matrix(covar, true);eigen(covar, true);std::vector<std::vector<T>> tmp_data(samples_num), evects1(count);for (int i = 0; i < samples_num; ++i) {tmp_data[i].resize(features_length);evects1[i].resize(features_length);for (int j = 0; j < features_length; ++j) {tmp_data[i][j] = data[i][j] - mean[j];}}gemm(eigen_vectors, tmp_data, 1., std::vector<std::vector<T>>(), 0., evects1, 0);eigen_vectors.resize(evects1.size());for (int i = 0; i < eigen_vectors.size(); ++i) {eigen_vectors[i].resize(evects1[i].size());memcpy(eigen_vectors[i].data(), evects1[i].data(), sizeof(T)* evects1[i].size());}// normalize all eigenvectorsif (retained_variance > 0) {for (int i = 0; i < eigen_vectors.size(); ++i) {normalize(eigen_vectors[i].data(), eigen_vectors[i].size());}// compute the cumulative energy content for each eigenvectorint L = computeCumulativeEnergy();eigen_values.resize(L);eigen_vectors.resize(L);} else {for (int i = 0; i < out_count; ++i) {normalize(eigen_vectors[i].data(), eigen_vectors[i].size());}if (count > out_count) {eigen_values.resize(out_count);eigen_vectors.resize(out_count);}}save_model(model);return 0;
}template<typename T>
int PCA<T>::subtract(const std::vector<T>& vec1, const std::vector<T>& vec2, std::vector<T>& result) const
{CHECK(vec1.size() == vec2.size() && vec1.size() == result.size());for (int i = 0; i < vec1.size(); ++i) {result[i] = vec1[i] - vec2[i];}return 0;
}template<typename T>
int PCA<T>::project(const std::vector<T>& vec, std::vector<T>& result) const
{CHECK(!mean.empty() && !eigen_vectors.empty() && mean.size() == vec.size());std::vector<T> tmp_data(mean.size());subtract(vec, mean, tmp_data);gemm(tmp_data, eigen_vectors, 1, std::vector<T>(), 0, result, 1);return 0;
}template<typename T>
int PCA<T>::back_project(const std::vector<T>& vec, std::vector<T>& result) const
{CHECK(!mean.empty() && !eigen_vectors.empty() && eigen_vectors.size() == vec.size());gemm(vec, eigen_vectors, 1, mean, 1, result, 0);return 0;
}template<typename T>
int PCA<T>::load_model(const std::string& model)
{std::ifstream file(model.c_str(), std::ios::in | std::ios::binary);if (!file.is_open()) {fprintf(stderr, "open file fail: %s\n", model.c_str());return -1;}int width = 0, height = 0;file.read((char*)&width, sizeof(width) * 1);file.read((char*)&height, sizeof(height) * 1);std::unique_ptr<T[]> data(new T[width * height]);file.read((char*)data.get(), sizeof(T)* width * height);eigen_vectors.resize(height);for (int i = 0; i < height; ++i) {eigen_vectors[i].resize(width);T* p = data.get() + i * width;memcpy(eigen_vectors[i].data(), p, sizeof(T)* width);}file.read((char*)&width, sizeof(width));file.read((char*)&height, sizeof(height));CHECK(height == 1);eigen_values.resize(width);file.read((char*)eigen_values.data(), sizeof(T)* width * height);file.read((char*)&width, sizeof(width));file.read((char*)&height, sizeof(height));CHECK(height == 1);mean.resize(width);file.read((char*)mean.data(), sizeof(T)* width * height);file.close();return 0;
}template<typename T>
int PCA<T>::save_model(const std::string& model) const
{std::ofstream file(model.c_str(), std::ios::out | std::ios::binary);if (!file.is_open()) {fprintf(stderr, "open file fail: %s\n", model.c_str());return -1;}int width = eigen_vectors[0].size(), height = eigen_vectors.size();std::unique_ptr<T[]> data(new T[width * height]);for (int i = 0; i < height; ++i) {T* p = data.get() + i * width;memcpy(p, eigen_vectors[i].data(), sizeof(T) * width);}file.write((char*)&width, sizeof(width));file.write((char*)&height, sizeof(height));file.write((char*)data.get(), sizeof(T)* width * height);width = eigen_values.size(), height = 1;file.write((char*)&width, sizeof(width));file.write((char*)&height, sizeof(height));file.write((char*)eigen_values.data(), sizeof(T)* width * height);width = mean.size(), height = 1;file.write((char*)&width, sizeof(width));file.write((char*)&height, sizeof(height));file.write((char*)mean.data(), sizeof(T)* width * height);file.close();return 0;
}template class PCA<float>;
template class PCA<double>;} // namespace ANN
main.cpp:#include "funset.hpp"
#include <iostream>
#include "perceptron.hpp"
#include "BP.hpp""
#include "CNN.hpp"
#include "linear_regression.hpp"
#include "naive_bayes_classifier.hpp"
#include "logistic_regression.hpp"
#include "common.hpp"
#include "knn.hpp"
#include "decision_tree.hpp"
#include "pca.hpp"
#include <opencv2/opencv.hpp>// =============================== PCA(Principal Components Analysis) ===================
namespace {
void normalize(const std::vector<float>& src, std::vector<unsigned char>& dst)
{dst.resize(src.size());double dmin = 0, dmax = 255;double smin = src[0], smax = smin;for (int i = 1; i < src.size(); ++i) {if (smin > src[i]) smin = src[i];if (smax < src[i]) smax = src[i];}double scale = (dmax - dmin) * (smax - smin > DBL_EPSILON ? 1. / (smax - smin) : 0);double shift = dmin - smin * scale;for (int i = 0; i < src.size(); ++i) {dst[i] = static_cast<unsigned char>(src[i] * scale + shift);}
}
} // namespaceint test_pca()
{const std::string image_path{ "E:/GitCode/NN_Test/data/database/ORL_Faces/" };const std::string image_name{ "1.pgm" };std::vector<cv::Mat> images;for (int i = 1; i <= 15; ++i) {std::string name = image_path + "s" + std::to_string(i) + "/" + image_name;cv::Mat mat = cv::imread(name, 0);if (!mat.data) {fprintf(stderr, "read image fail: %s\n", name.c_str());return -1;}images.emplace_back(mat);}save_images(images, "E:/GitCode/NN_Test/data/pca_src.jpg", 5);cv::Mat data(images.size(), images[0].rows * images[0].cols, CV_32FC1);for (int i = 0; i < images.size(); ++i) {cv::Mat image_row = images[i].clone().reshape(1, 1);cv::Mat row_i = data.row(i);image_row.convertTo(row_i, CV_32F);}int features_length = images[0].rows * images[0].cols;std::vector<std::vector<float>> data_(images.size());std::vector<float> labels(images.size(), 0.f);for (int i = 0; i < images.size(); ++i) {data_[i].resize(features_length);memcpy(data_[i].data(), data.row(i).data, sizeof(float)* features_length);}const std::string save_model_file{ "E:/GitCode/NN_Test/data/pca.model" };ANN::PCA<float> pca;pca.load_data(data_, labels);double retained_variance{ 0.95 };pca.set_retained_variance(retained_variance);pca.train(save_model_file);const std::string read_model_file{ save_model_file };ANN::PCA<float> pca2;pca2.load_model(read_model_file);std::vector<cv::Mat> result(images.size());for (int i = 0; i < images.size(); ++i) {std::vector<float> point, reconstruction;pca2.project(data_[i], point);pca2.back_project(point, reconstruction);std::vector<unsigned char> dst;normalize(reconstruction, dst);cv::Mat tmp(images[i].rows, images[i].cols, CV_8UC1, dst.data());tmp.copyTo(result[i]);}save_images(result, "E:/GitCode/NN_Test/data/pca_result.jpg", 5);return 0;
}
执行结果如下,上三行为原始图像,下三行为使用PCA重建图像的结果,经比较与OpenCV 3.3结果一致:GitHub: https://github.com/fengbingchun/NN_Test
相关文章:

为何Google、微软、华为将亿级源代码放一个仓库?从全球最大代码管理库说起...
作者 | 夕颜编辑 | Just出品 | AI 科技大本营(ID:rgznai100)【导读】2017 年,在当时微软的一篇官方博客中,时任微软云开发服务副总裁的 Brian Harry 表示微软内部代码开始向 Git 迁移,宣布推出针对大规模 repo 的“Git…

jquery mobie导致超链接不可用
在a标签中添加rel"external"即可转载于:https://blog.51cto.com/here2142/1435434

编译器GCC与Clang的异同
GCC:GNU(Gnus Not Unix)编译器套装(GNU Compiler Collection,GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU项目的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语…

如何正确选择聚类算法? | CSDN博文精选
作者 | Josh Thompson翻译 | 张睿毅校对 | 王雨桐来源 | 数据派THU(ID:DatapiTHU)本文将介绍四种基本的聚类算法—层次聚类、基于质心的聚类、最大期望算法和基于密度的聚类算法,并讨论不同算法的优缺点。聚类算法十分容易上手,但…

Python工具 | 9个用来爬取网络站点的 Python 库
1️⃣Scrapy 一个开源和协作框架,用于从网站中提取所需的数据。 以快速,简单,可扩展的方式。 官网2️⃣cola 一个分布式爬虫框架。 GitHub3️⃣Demiurge 基于 PyQuery 的爬虫微型框架。 官网4️⃣feedparser 通用 feed 解析器。 官网5️⃣Gra…

Python并发编程实例教程
有关Python中的并发编程实例,主要是对Threading模块的应用,文中自定义了一个Threading类库。 一、简介 我们将一个正在运行的程序称为进程。每个进程都有它自己的系统状态,包含内存状态、打开文件列表、追踪指令执行情况的程序指针以及一个保存局部变量的调用栈。…

Nginx负载均衡之TCP端口高可用(二)
在前面我们实现了基本的HTTP反向代理,从互联网过来的请求已经可以分发到后端多台网站服务器上,但不是所有的业务都是网络类型的,此篇文章我们主要讨论的是TCP 端口的负载均衡做法,昨天也有小伙伴提到了,在HTTP反向代理…

语音识别大牛Daniel Povey为何加入小米?“手机+AIoT”强大生态,开源战略是关键...
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)10 月 17 日,语音识别开源工具 Kaldi 创始人,语音和 AI 领域大牛 Daniel Povey 在10 月 19 日,小米集团副总裁、集团技术委员会主席崔宝秋发布微博,欢迎 Dani…

Python运维项目中用到的redis经验及数据类型
先感叹下,学东西一定要活学活用! 我用redis也有几年的历史了,今个才想到把集合可以当python list用。 最近做了几个项目都掺杂了redis, 遇到了一些个问题和开发中提高性能的方法,这都分享出来,共同学习。…
图像边缘检测之拉普拉斯(Laplacian)C++实现
拉普拉斯算子(Laplacian)可应用到图像边缘检测中。在OpenCV中当kernel大小为3*3时,支持两种kernel算子,分别为:在OpenCV中默认的计算方式如下,假设有一个5*5的小图像,原始值依次为1,2,…25,如下图红色部分,…

从0到1,Airbnb的深度学习实践经验总结
作者 | Haldar译者 | 陆离出品 | AI科技大本营(ID: rgznai100)此前,AI科技大本营发布了关于希望通过介绍的研究成果为读者提供一些有用的帮助和指引。模型中的生态系统本文要讨论的机器学习现实应用,是关于根据用户预约的可能性来…

高并发大流量专题---8、动态语言的并发处理
高并发大流量专题---8、动态语言的并发处理 一、总结 一句话总结: 和本科毕业论文连起来了:基于消息中间件Rocket MQ的研究;用于并发处理的消息队列 1、什么是进程、线程、协程? 进程(Process)是计算机中的…

1. 文件系统——磁盘分区、各目录功能、硬盘
一、磁盘分区及文件访问入口在前文中介绍过,Linux的整个文件系统像一棵倒置的数,最顶层的是根文件系统,其下有很多一级子目录,一级子目录下面是二级子目录,依此类推:/:根目录/bin,/s…
吴恩达老师深度学习视频课笔记:逻辑回归公式推导及C++实现
逻辑回归(Logistic Regression)是一个二分分类算法。逻辑回归的目标是最小化其预测与训练数据之间的误差。为了训练逻辑回归模型中的参数w和b,需要定义一个成本函数(cost function)。成本函数(cost function):它是针对整个训练集的。衡量参数w和b在整个训…

网络运行时间提高100倍,Google使用的AI视频理解架构有多强?
译者 | 刘畅出品 | AI科技大本营(ID:rgznai100)视频理解是一个很有挑战性的问题。由于视频包含时空数据,因此图像的特征表示需要同时提取图像和运动信息。这不仅对自动理解视频语义内容有重要性,还对机器人的感知和学习也至关重要…

iOS学习笔记(十三)——获取手机信息(UIDevice、NSBundle、NSLocale)
2019独角兽企业重金招聘Python工程师标准>>> iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用户设备、系统信息、应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息࿰…
吴恩达老师深度学习视频课笔记:单隐含层神经网络公式推导及C++实现(二分类)
关于逻辑回归的公式推导和实现可以参考: http://blog.csdn.net/fengbingchun/article/details/79346691 下面是在逻辑回归的基础上,对单隐含层的神经网络进行公式推导:选择激活函数时的一些经验:不同层的激活函数可以不一样。如果…

「2019中国大数据技术大会」超值学生票来啦!
大会官网:https://t.csdnimg.cn/U1wA经过11年的沉淀与发展,中国大数据技术大会见证了大数据技术生态在中国的建立、发展和成熟,已经成为国内大数据行业极具影响力的盛会,也是大数据人非常期待的年度深度分享盛会。在新的时代背景下…

校验正确获取对象或者数组的属性方法(babel-plugin-idx/_.get)
背景: 开发中经常遇到取值属性的时候,需要校验数值的有效性。 例如: 获取props对象里面的friends属性 props.user && props.user.friends && props.user.friends[0] && props.user.friends[0].friends 对于深层的对…

Ring Tone Manager on Windows Mobile
2019独角兽企业重金招聘Python工程师标准>>> 手机铃声经常能够体现一个人的个性,有些哥们儿在自习室不把手机设置成震动,一来电就#$^%^&^%#$&$*,声音还很大,唯恐别人听不到。 Windows Mobile设备上如何来设置手…
OpenCV3.3中K-Means聚类接口简介及使用
OpenCV3.3中给出了K-均值聚类(K-Means)的实现,即接口cv::kmeans,接口的声明在include/opencv2/core.hpp文件中,实现在modules/core/src/kmeans.cpp文件中,其中:下面对此接口中的参数作个简单说明:(1)、data:…

一文读懂对抗机器学习Universal adversarial perturbations | CSDN博文精选
作者 | Icoding_F2014来源 | CSDN博客本文提出一种 universal 对抗扰动,universal 是指同一个扰动加入到不同的图片中,能够使图片被分类模型误分类,而不管图片到底是什么。示意图:形式化的定义:对于d维数据分布 μ&…

Reactor模式与Proactor模式
博主一脚刚踏进分布式的大门(看《分布式Java应用》,如果大家有啥推荐的书欢迎留言~),发现书中对NIO采用的Reactor模式、AIO采用的Proactor模式一笔带过,好奇心趋势我找了一下文章,发现两篇挺不错的文章&…

linux下使profile和.bash_profile立即生效的方法
使profile生效的方法1.source /etc/profile使用.bash_profile生效的方法1 . .bash_profile2 source .bash_profile3 exec bash --login转载于:https://blog.51cto.com/shine20/1436473
吴恩达老师深度学习视频课笔记:多隐含层神经网络公式推导(二分类)
多隐含层神经网络的推导步骤非常类似于单隐含层神经网络的步骤,只不过是多重复几遍。关于单隐含层神经网络公式的推导可以参考: http://blog.csdn.net/fengbingchun/article/details/79370310 逻辑回归是一个浅层模型(shadow model),或称单层…

Python中的元编程:一个关于修饰器和元类的简单教程
作者 | Saurabh Kukade译者 | 刘畅出品 | AI科技大本营(ID:rgznai100)最近,作者遇到一个非常有趣的概念,它就是用 Python 进行元编程。我想在本文中分享我对该主题的见解。作者希望它可以帮助解决这个问题,因为很多人说…

获取用户电脑的上网IP地址
在项目中经常要获取用户的上网的IP地址,如何获取用户的IP地址,方法很多,现在介绍以下2种。 /// <summary> /// 获取本机在局域网的IP地址 /// </summary> /// <returns></returns> …

数学图形(1.40)T_parameter
不记得在哪搞了个数学公式生成的图形. vertices 1000t from 0 to (2*PI) r 2.0 x r*(5*cos(t) - cos(6*t)) y r*(3*sin(t) - sin(4*t)) 给线加上一维变量的变化,使之变成面: vertices D1:360 D2:21u from 0 to (2*PI) D1 v from 0 to 20 D2x (v2)*cos(u) - cos((v3)*u…
K-均值聚类(K-Means) C++代码实现
K-均值聚类(K-Means)简介可以参考: http://blog.csdn.net/fengbingchun/article/details/79276668 以下是K-Means的C实现,code参考OpenCV 3.3中的cv::kmeans函数,均值点初始化的方法仅支持KMEANS_RANDOM_CENTERS。以下是从数据集MNIST中提取…

让学生网络相互学习,为什么深度相互学习优于传统蒸馏模型?| 论文精读
作者 | Ying Zhang,Tao Xiang等译者 | 李杰出品 | AI科技大本营(ID:rgznai100)蒸馏模型是一种将知识从教师网络(teacher)传递到学生网络(student)的有效且广泛使用的技术。通常来说,…