监督学习和无监督学习


文章目录

  • 监督学习和无监督学习
    • 监督学习算法包括
    • 无监督学习算法包括
    • OpenCV十个子类
    • 举例:


监督学习和无监督学习

监督学习和无监督学习是机器学习领域中两种不同的学习范式,它们之间的区别在于数据的标签或标记的可用性以及学习任务的性质。

  1. 监督学习(Supervised Learning):

    • 监督学习是一种利用带有标签(标记)的数据进行训练的机器学习方法。
    • 在监督学习中,训练数据包含输入样本和对应的标签(预期输出)。
    • 学习的目标是通过训练数据构建一个模型,该模型能够对新的未标记数据进行预测或分类。
    • 监督学习的典型应用包括分类(如垃圾邮件识别)和回归(如房价预测)等。
  2. 无监督学习(Unsupervised Learning):

    • 无监督学习是一种在没有标签(标记)的数据中发现模式和结构的机器学习方法。
    • 在无监督学习中,训练数据只包含输入样本,没有相应的标签或预期输出。
    • 学习的目标是从数据中推断出隐藏的结构、关系或规律。
    • 无监督学习的典型应用包括聚类(将数据划分为类别)、降维(减少数据的维度)和关联规则挖掘等。

总结:
监督学习需要有带有标签的训练数据,目标是训练模型进行预测或分类。而无监督学习则不需要标签,目标是从未标记数据中发现结构和模式。监督学习的任务是明确的,而无监督学习的任务是隐式的,需要从数据中提取有用的信息。两者在应用场景和数据类型上都有所不同,选择使用哪种学习方法取决于具体的问题和可用数据。

监督学习和无监督学习的主要区别可以总结如下:

  1. 数据类型:在监督学习中,训练数据包含输入样本和相应的标签(预期输出)。而在无监督学习中,训练数据只包含输入样本,没有相应的标签或预期输出。

  2. 学习目标:监督学习的目标是通过训练数据构建一个模型,该模型能够对新的未标记数据进行预测或分类。而无监督学习的目标是从数据中推断出隐藏的结构、关系或规律。

  3. 应用场景:监督学习常用于分类和回归等任务,其中我们有明确的目标和标签信息。无监督学习常用于聚类、降维和关联规则挖掘等任务,其中我们试图从未标记的数据中发现模式和结构。

  4. 数据需求:监督学习需要带有标签的训练数据,这通常需要人工标注或专家知识。而无监督学习不需要标签,因此可以利用更丰富的未标记数据。

  5. 模型评估:在监督学习中,我们可以使用标签信息来评估模型的性能,例如计算分类准确度或均方误差。而在无监督学习中,评估模型的性能更加困难,通常需要使用一些内部指标或人工验证。

尽管监督学习和无监督学习有明显的区别,但在实际应用中,它们也可以相互结合使用。例如,可以使用无监督学习进行数据预处理和特征提取,然后使用监督学习算法构建分类模型。这种结合使用的方法被称为半监督学习。此外,还有其他学习范式,如强化学习,它涉及在动态环境中学习最佳行动策略。

监督学习算法包括

监督学习中有多种算法可用于分类和回归任务。以下是一些常见的监督学习算法:

  1. 决策树(Decision Trees):决策树根据特征的值进行分割,并根据最终的叶节点进行预测或分类。它易于理解和解释,可处理离散和连续特征,适用于分类和回归任务。

  2. 支持向量机(Support Vector Machines,SVM):SVM是一种基于间隔最大化的二分类算法。它通过在特征空间中找到一个最优超平面来进行分类。SVM可以处理线性和非线性问题,并具有较强的泛化能力。

  3. 朴素贝叶斯(Naive Bayes):朴素贝叶斯是一组基于贝叶斯定理和特征条件独立性假设的概率分类算法。它通过计算后验概率来进行分类,并假设特征之间相互独立。

  4. K最近邻(K-Nearest Neighbors,KNN):KNN基于实例之间的距离进行分类。它根据最近的K个邻居的标签进行预测,适用于分类和回归问题。

  5. 线性回归(Linear Regression):线性回归用于预测连续输出变量的值。它建立了输入特征和输出之间的线性关系,并根据最小化误差来拟合最佳拟合线。

  6. 逻辑回归(Logistic Regression):逻辑回归用于二分类问题。它使用逻辑函数(sigmoid函数)将线性组合的特征转换为概率,并基于阈值进行分类。

  7. 随机森林(Random Forests):随机森林是一种集成学习方法,通过组合多个决策树来进行分类或回归。它使用随机特征选择和投票来提高模型的准确性和泛化能力。

  8. 梯度提升(Gradient Boosting):梯度提升是一种通过迭代训练弱学习器并进行加权组合来提高模型性能的集成方法。常见的梯度提升算法包括梯度提升树(Gradient Boosted Trees)和XGBoost。

以上只是一些常见的监督学习算法示例,实际上还有其他许多算法和变体可供选择,每个算法都有其适用的场景和假设。选择合适的算法取决于数据的特征、问题的性质和性能需求。

无监督学习算法包括

无监督学习涉及从未标记的数据中发现模式、结构和关联。以下是一些常见的无监督学习算法:

  1. 聚类算法(Clustering Algorithms):聚类算法用于将数据样本划分为不同的组或簇,每个簇内的样本具有相似的特征。常见的聚类算法包括K均值聚类(K-means clustering)、层次聚类(Hierarchical clustering)和DBSCAN(Density-Based Spatial Clustering of Applications with Noise)。

  2. 主成分分析(Principal Component Analysis,PCA):PCA是一种降维算法,用于减少数据的维度,同时保留最重要的特征。它通过线性变换将原始特征映射到较低维度的新特征空间,其中新特征称为主成分。

  3. 关联规则挖掘(Association Rule Mining):关联规则挖掘用于发现数据中的频繁项集和关联规则。它可以揭示数据中的隐含关系和相关性,例如超市购物篮中的商品组合。Apriori算法和FP-Growth算法是常用的关联规则挖掘算法。

  4. 异常检测(Anomaly Detection):异常检测算法用于识别数据中的异常或异常行为。它通过与正常模式的差异来识别异常样本,有助于发现潜在的问题或异常情况。

  5. 自组织映射(Self-Organizing Maps,SOM):SOM是一种神经网络算法,用于将多维数据映射到一个二维或三维的拓扑结构上。它可以可视化数据的分布和聚类结构。

  6. 高斯混合模型(Gaussian Mixture Models,GMM):GMM是一种概率模型,用于建模多个高斯分布的组合。它可以用于聚类、密度估计和生成新的样本。

  7. t-SNE:t-SNE是一种非线性降维算法,用于可视化高维数据。它能够在保持数据之间的局部和全局关系的同时,将高维数据映射到低维空间。

这些算法只是无监督学习中的一些常见例子。根据具体的问题和数据,可能会选择其他算法或算法组合来发现数据中的模式、结构和关联。

OpenCV十个子类

在这里插入图片描述

在OpenCV 4.5.1版本中,cv::ml::StatModel类是一个抽象基类,用于表示统计模型。它定义了许多用于机器学习任务的通用接口和方法。在这个版本中,cv::ml::StatModel有以下八个子类:

  1. cv::ml::SVM:支持向量机(Support Vector Machine)是一种二分类模型,它通过在特征空间中找到一个超平面来实现分类。cv::ml::SVM类提供了训练和预测SVM模型的功能,并且支持不同的内核函数和参数设置。

  2. cv::ml::KNearest:K最近邻(K-Nearest Neighbors)是一种基于实例的学习方法,它通过计算输入样本与训练样本之间的距离来进行分类。cv::ml::KNearest类实现了K最近邻算法,可以用于分类和回归任务。

  3. cv::ml::DTrees:决策树(Decision Trees)是一种常见的机器学习算法,用于分类和回归问题。cv::ml::DTrees类实现了决策树算法,支持二叉和多叉决策树,并提供了一些参数用于控制树的生长和剪枝。

  4. cv::ml::RTrees:随机森林(Random Forests)是一种集成学习方法,通过组合多个决策树来进行分类和回归。cv::ml::RTrees类是随机森林的实现,它支持二叉和多叉决策树,提供了参数用于控制森林的大小和生长。

  5. cv::ml::Boost:Boosting是一种集成学习方法,通过串行训练多个弱分类器来构建一个强分类器。cv::ml::Boost类实现了Boosting算法,支持二分类和多分类任务,并提供了参数用于控制弱分类器的数量和类型。

  6. cv::ml::ANN_MLP:人工神经网络(Artificial Neural Network)是一种模拟人脑神经系统的计算模型,用于进行模式识别和函数逼近。cv::ml::ANN_MLP类实现了多层感知器(Multilayer Perceptron)神经网络,支持多层、多输出和非线性激活函数。

  7. cv::ml::LogisticRegression:逻辑回归(Logistic Regression)是一种用于二分类问题的线性模型,通过将输入特征映射到一个概率函数来进行分类。cv::ml::LogisticRegression类实现了逻辑回归算法,并提供了参数用于控制正则化和收敛性。

  8. cv::ml::EM:期望最大化(Expectation-Maximization)是一种用来估计具有隐藏变量的概率模型参数的方法。cv::ml::EM类实现了EM算法,用于高斯混合模型(Gaussian Mixture Model)的训练和参数估计。

  9. cv::ml::SVMSGD类是一个线性分类器,使用随机梯度下降算法来训练支持向量机模型。它适用于处理大规模数据集,因为随机梯度下降算法对数据进行逐个样本的更新,而不需要在整个数据集上进行计算。
    cv::ml::SVMSGD类提供了训练和预测支持向量机模型的功能。它支持不同的损失函数、正则化和优化参数的设置,以及在线学习和增量学习的能力。

  10. cv::ml::NormalBayesClassifier是一个基于贝叶斯决策理论的分类器,假设每个类别的特征值都符合正态分布。它通过计算输入特征的条件概率来进行分类,利用贝叶斯公式和最大似然估计进行模型训练和预测。
    cv::ml::NormalBayesClassifier类提供了训练和预测正态贝叶斯分类器的功能。它可以处理多类别分类问题,并支持不同的参数设置,如类先验概率的估计和特征的独立性假设。

在OpenCV 4.5.1版本中,cv::ml::StatModel类有以下十个子类,用于机器学习任务:

  1. cv::ml::SVM:支持向量机(Support Vector Machine),用于二分类和多分类问题。

  2. cv::ml::KNearest:K最近邻(K-Nearest Neighbors),用于分类和回归任务。

  3. cv::ml::DTrees:决策树(Decision Trees),支持二叉和多叉决策树的分类和回归。

  4. cv::ml::RTrees:随机森林(Random Forests),用于分类和回归任务。

  5. cv::ml::Boost:Boosting算法,用于二分类和多分类问题。

  6. cv::ml::ANN_MLP:多层感知器(Artificial Neural Network),用于模式识别和函数逼近。

  7. cv::ml::LogisticRegression:逻辑回归(Logistic Regression),用于二分类问题。

  8. cv::ml::EM:期望最大化(Expectation-Maximization),用于高斯混合模型的参数估计。

  9. cv::ml::SVMSGD:支持向量机的随机梯度下降版本,适用于大规模数据集。

  10. cv::ml::NormalBayesClassifier:正态贝叶斯分类器,基于贝叶斯决策理论的分类器。

这些子类提供了不同的机器学习算法和模型,适用于各种分类和回归任务。它们具有各自的特定参数和功能,并共享一些通用的方法,如训练(train)、预测(predict)和保存/加载模型(save/load)。

根据上述提到的十个分类器,可以将它们按照监督学习和无监督学习的分类方式进行划分:

监督学习算法:

  1. cv::ml::SVM
  2. cv::ml::KNearest
  3. cv::ml::DTrees
  4. cv::ml::RTrees
  5. cv::ml::Boost
  6. cv::ml::ANN_MLP
  7. cv::ml::LogisticRegression

无监督学习算法:

  1. cv::ml::EM
  2. cv::ml::SVMSGD
  3. cv::ml::NormalBayesClassifier

监督学习算法是指在训练过程中,需要提供带有标签的训练数据,算法通过学习输入特征和相应的标签之间的关系来进行模型训练和预测。这些算法可以用于分类任务(如SVM、K最近邻、决策树、随机森林、逻辑回归和Boosting算法)和回归任务(如多层感知器)。

无监督学习算法是指在训练过程中,不需要提供标签的训练数据,算法通过对数据的统计特征或潜在结构的学习来进行模型训练和预测。这些算法可以用于聚类任务(如期望最大化和正态贝叶斯分类器)和密度估计任务(如支持向量机的随机梯度下降版本)。

需要注意的是,虽然有些算法在上述分类中属于监督学习或无监督学习,但它们可能具有灵活的使用方式,可以根据具体问题的需求进行调整和应用。此外,还有其他类型的学习算法,如半监督学习和强化学习,它们在上述分类中并未提及。

举例:

以下是对于上述十个算法的一些简单的C++使用教程示例。请注意,这些示例仅用于演示目的,具体的实现和参数设置可能因实际问题而有所不同。建议参考OpenCV官方文档和其他学习资源以获取更详细和全面的教程。

  1. cv::ml::SVM 示例:
#include <opencv2/opencv.hpp>int main() {// 创建SVM对象cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();// 加载训练数据和标签cv::Mat trainingData; // 训练数据cv::Mat labels;       // 标签// ...// 设置SVM参数svm->setType(cv::ml::SVM::C_SVC);svm->setKernel(cv::ml::SVM::RBF);// ...// 训练SVM模型svm->train(trainingData, cv::ml::ROW_SAMPLE, labels);// 使用训练好的模型进行预测cv::Mat testData;  // 测试数据cv::Mat predictions;svm->predict(testData, predictions);return 0;
}
  1. cv::ml::KNearest 示例:
#include <opencv2/opencv.hpp>int main() {// 创建KNearest对象cv::Ptr<cv::ml::KNearest> knn = cv::ml::KNearest::create();// 加载训练数据和标签cv::Mat trainingData; // 训练数据cv::Mat labels;       // 标签// ...// 设置KNearest参数knn->setDefaultK(3);knn->setIsClassifier(true);// ...// 训练KNearest模型knn->train(trainingData, cv::ml::ROW_SAMPLE, labels);// 使用训练好的模型进行预测cv::Mat testData;  // 测试数据cv::Mat predictions;knn->findNearest(testData, knn->getDefaultK(), predictions);return 0;
}
  1. cv::ml::DTrees 示例:
#include <opencv2/opencv.hpp>int main() {// 创建DTrees对象cv::Ptr<cv::ml::DTrees> dtrees = cv::ml::DTrees::create();// 加载训练数据和标签cv::Mat trainingData; // 训练数据cv::Mat labels;       // 标签// ...// 设置DTrees参数dtrees->setMaxDepth(10);dtrees->setMinSampleCount(2);// ...// 训练DTrees模型dtrees->train(trainingData, cv::ml::ROW_SAMPLE, labels);// 使用训练好的模型进行预测cv::Mat testData;  // 测试数据cv::Mat predictions;dtrees->predict(testData, predictions);return 0;
}
  1. cv::ml::RTrees 示例:
#include <opencv2/opencv.hpp>int main() {// 创建RTrees对象cv::Ptr<cv::ml::RTrees> rtrees = cv::ml::RTrees::create();// 加载训练数据和标签cv::Mat trainingData; // 训练数据cv::Mat labels;       // 标签// ...// 设置RTrees参数rtrees->setMaxDepth(10);rtrees->setMinSampleCount(2);// ...// 训练RTrees模型rtrees->train(trainingData, cv::ml::ROW_SAMPLE, labels);// 使用训练好的模型进行预测cv::Mat testData;  // 测试数据cv::Mat predictions;rtrees->predict(testData, predictions);return 0;
}
  1. cv::ml::Boost 示例:
#include <opencv2/opencv.hpp>int main() {// 创建Boost对象cv::Ptr<cv::ml::Boost> boost = cv::ml::Boost::create();// 加载训练数据和标签cv::Mat trainingData; // 训练数据cv::Mat labels;       // 标签// ...// 设置Boost参数boost->setBoostType(cv::ml::Boost::REAL);boost->setWeakCount(100);// ...// 训练Boost模型boost->train(trainingData, cv::ml::ROW_SAMPLE, labels);// 使用训练好的模型进行预测cv::Mat testData;  // 测试数据cv::Mat predictions;boost->predict(testData, predictions);return 0;
}
  1. cv::ml::ANN_MLP 示例:
#include <opencv2/opencv.hpp>int main() {// 创建ANN_MLP对象cv::Ptr<cv::ml::ANN_MLP> ann = cv::ml::ANN_MLP::create();// 加载训练数据和标签cv::Mat trainingData; // 训练数据cv::Mat labels;       // 标签// ...// 设置ANN_MLP参数cv::Mat layers = cv::Mat(3, 1, CV_32S);layers.at<int>(0) = 10;  // 输入层节点数layers.at<int>(1) = 5;   // 隐藏层节点数layers.at<int>(2) = 2;   // 输出层节点数ann->setLayerSizes(layers);ann->setActivationFunction(cv::ml::ANN_MLP::SIGMOID_SYM);// ...// 训练ANN_MLP模型ann->train(trainingData, cv::ml::ROW_SAMPLE, labels);// 使用训练好的模型进行预测cv::Mat testData;  // 测试数据cv::Mat predictions;ann->predict(testData, predictions);return 0;
}
  1. cv::ml::LogisticRegression 示例:
#include <opencv2/opencv.hpp>int main() {// 创建LogisticRegression对象cv::Ptr<cv::ml::LogisticRegression> logistic = cv::ml::LogisticRegression::create();// 加载训练数据和标签cv::Mat trainingData; // 训练数据cv::Mat labels;       // 标签// ...// 设置LogisticRegression参数logistic->setIterations(100);logistic->setLearningRate(0.01);// ...// 训练LogisticRegression模型logistic->train(trainingData, cv::ml::ROW_SAMPLE, labels);// 使用训练好的模型进行预测cv::Mat testData;  // 测试数据cv::Mat predictions;logistic->predict(testData, predictions);return 0;
}
  1. cv::ml::EM 示例:
#include <opencv2/opencv.hpp>int main() {// 创建EM对象cv::Ptr<cv::ml::EM> em = cv::ml::EM::create();// 加载训练数据cv::Mat trainingData; // 训练数据// ...// 设置EM参数em->setClustersNumber(3);// ...// 训练EM模型cv::Mat logLikelihoods;em->trainEM(trainingData, cv::noArray(), cv::noArray(), cv::noArray(), logLikelihoods);// 使用训练好的模型进行预测cv::Mat testData;  // 测试数据cv::Mat labels;cv::Mat probs;em->predict2(testData, labels, probs);return 0;
}
  1. cv::ml::SVMSGD 示例:
#include <opencv2/opencv.hpp>int main() {// 创建SVMSGD对象cv::Ptr<cv::ml::SVMSGD> svm = cv::ml::SVMSGD::create();// 加载训练数据和标签cv::Mat trainingData; // 训练数据cv::Mat labels;       // 标签// ...// 设置SVMSGD参数svm->setSvmsgdType(cv::ml::SVMSGD::ASGD);svm->setMarginRegularization(0.1);// ...// 训练SVMSGD模型svm->train(trainingData, cv::ml::ROW_SAMPLE, labels);// 使用训练好的模型进行预测cv::Mat testData;  // 测试数据cv::Mat predictions;svm->predict(testData, predictions);return 0;
}
  1. cv::ml::NormalBayesClassifier 示例:
#include <opencv2/opencv.hpp>int main() {// 创建NormalBayesClassifier对象cv::Ptr<cv::ml::NormalBayesClassifier> nbClassifier = cv::ml::NormalBayesClassifier::create();// 加载训练数据和标签cv::Mat trainingData; // 训练数据cv::Mat labels;       // 标签// ...// 训练NormalBayesClassifier模型nbClassifier->train(trainingData, cv::ml::ROW_SAMPLE, labels);// 使用训练好的模型进行预测cv::Mat testData;  // 测试数据cv::Mat predictions;cv::Mat likelihoods;nbClassifier->predictProb(testData, predictions, likelihoods);return 0;
}

这些示例提供了对于每个算法的基本使用方法,但实际应用中可能需要根据具体问题的需求进行参数调整和数据处理。建议参考OpenCV的官方文档和其他学习资源,以获取更详细和全面的教程,并根据实际情况进行适当的修改和优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/1263.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【探索 Kubernetes|作业管理篇 系列 10】Pod 健康检查和恢复机制

前言 大家好&#xff0c;我是秋意零。 上一篇中介绍了&#xff0c;Pod 的服务对象&#xff0c;从而对 Pod 有了更深的理解&#xff1b; 今天的主题是 Pod 健康检查和恢复机制&#xff0c;我们将结束 Pod 的内容。 最近搞了一个扣扣群&#xff0c;旨在技术交流、博客互助&am…

电商数据分析方案和BI强强联合,一站式做分析

搭建一个电商大数据分析平台需要哪些条件&#xff1f;总的来说需要一套满足电商数据分析需求的方案&#xff0c;一个能够提供强大数据计算分析功能和数据可视化图表的平台&#xff0c;比如电商数据分析方案和奥威BI软件这样的组合。 电商数据分析方案BI软件&#xff0c;一站式…

CT-ICP: 带有闭环的实时且灵活鲁棒的LiDAR里程计

文章&#xff1a;CT-ICP: Real-time Elastic LiDAR Odometry with Loop Closure 作者&#xff1a;Pierre Dellenbach, Jean-Emmanuel Deschaud, Bastien Jacquet, and Francois Goulette 编辑&#xff1a;点云PCL 代码&#xff1a; https://github.com/jedeschaud/ct_icp https…

Apache RocketMQ EventBridge:构建下一代事件驱动引擎

作者&#xff1a;沈林 前言 事件驱动&#xff0c;这个词在部分人印象中&#xff0c;它是一个过时的技术——没什么新意。从时间上看&#xff0c;确实也是这样&#xff0c;上世纪 60 年代&#xff0c;事件驱动就已经被正式提出&#xff0c;经常会被在 GUI 编程中。但是在有些人…

印刷企业WMS仓储管理系统解决方案

在数字化转型的浪潮中&#xff0c;印刷企业也积极寻求适合自身发展的解决方案。作为印刷业的重要环节&#xff0c;仓储管理对于提高效率、降低成本至关重要。而印刷企业WMS仓储管理系统的应用&#xff0c;为印刷企业带来了全新的解决方案。 印刷WMS仓储管理系统是一种基于信息技…

区块链生态发展

文章目录 前言以太坊的到来什么是图灵完备&#xff1f;什么是智能合约&#xff1f; 以太坊的应用去中心化应用 DApp代币发行 公有链&联盟链区块链应用总结 前言 前面的区块链文章有介绍区块链的诞生以及底层运行原理&#xff0c; 本文主要介绍一下区块链应用的发展&#x…

34岁上岸,我终于圆了自己的考研梦

​ 大家好&#xff0c;我是独孤风&#xff0c;一位曾经的港口煤炭工人&#xff0c;目前在某国企任大数据负责人&#xff0c;公众号大数据流动的作者。 ​ 虽然告诉自己要平静&#xff0c;但是当接到EMS录取通知书的那一刻&#xff0c;眼眶还是忍不住有些湿润。今年正好是是东北…

flutter 简介 flutter 能为我们做什么

flutter 简介 flutter 能为我们做什么 前言一、什么是Flutter&#xff1f;二、Flutter的特点和优势三、Flutter与其他跨平台框架的比较总结 前言 陆陆续续已经写了60多篇的flutter 的文章了&#xff0c;本篇文章就来说说我对flutter 的简单看法 一、什么是Flutter&#xff1f…

ffmpeg命令参数

主要参数 -i 设定输入流 -f 设定输出格式&#xff08;format&#xff09; -ss 开始时间 -t 时间长度视频参数 -vframes 设置要输出的视频帧数 -b 设定视频码率 -b:v 视频码率 -r 设定帧率 -s 设定画面的宽与高 -vn 不处理视频 -aspect aspect 设置横纵比4:3 或16:9 或1.333或…

果蔬识别系统Python+Django+TensorFlow+卷积神经网络算法

一、介绍 果蔬识别系统&#xff0c;使用Python作为主要开发语言&#xff0c;基于深度学习TensorFlow框架&#xff0c;搭建卷积神经网络算法。并通过对数据集进行训练&#xff0c;最后得到一个识别精度较高的模型。并基于Django框架&#xff0c;开发网页端操作平台&#xff0c;…

Unity渲染工程收集

NPR 非真实渲染 UnityURP-AnimeStyleCelShader SSR 屏幕空间反射 UnitySSReflectionURP

虚拟机上用docker + nginx跑前端并支持https和http

情况是这样&#xff0c;我在虚拟机上&#xff0c;使用docker跑前端&#xff0c;需要这个前端支持https&#xff0c;原http的话自动跳转到https。另外&#xff0c;前端部署使用了负载均衡&#xff0c;即使用了3个docker跑前端&#xff1a;1个入口&#xff0c;另外2个是前端&…