自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

原创 机器学习——主成分分析(PCA)

给定n个样本(每个样本的维度为p维)​​​​​​​定义为样本在第一主成分/主方向上的投影:其中和都是用向量表示的:每个样本都对应一个,两个向量进行内积运算就能将映射到方向上,,如果将的模约束为1,那么​​​​​​​​​​​​​​和的内积就是,即​​​​​​​样本在主方向上的投影。(为什么是,如果我没理解错的话,和都是列向量,两个向量的内积应该就是第一个转置成行向量与第二个列向量相乘)主成分分析的目标是找到,使得的方差最大,同时要满足约束条件。

2023-12-30 18:00:15 2955

原创 机器学习——支持向量机

上次实验使用的logistic回归是一种线性分类模型,其基本思想是根据数据集训练出一个线性回归模型,再使用sigmoid函数将输出映射到0到1范围内,这个输出值就是样本预测为正例的概率,根据概率分类样本,因此logistic回归是根据所有数据样本来确定一个线性模型的。

2023-12-18 21:54:20 1694

原创 算法设计基础——综合

算法设计基础中最基础的几种算法:分治法、减治法、贪心法、动态规划法、回溯法基本都掌握后,我们现在可以对这些算法做整体的比较,本次实验使用蛮力法、动态规划法、回溯法来求解0/1背包问题,来比较各个算法的优劣。问题描述:有n个物品待装入背包,给出各个物品的价值和重量以及背包的容量,需要求出一个最佳的方案使得装入背包的物品总价值最高。此问题为子集问题,总共的方案数有2^n种,这些方案可以用一串二进制序列表示:000、001、010等,这样要求出一个个的方案只需要求出一系列的二进制数即可,然后再对这些方案一个个试探

2023-12-16 23:41:15 1119

原创 数据结构——队列

队列与栈一样都是访问受限的线性表,栈是只能在一端进行删除和插入操作的线性表,而队列是只能在一端进行删除操作,在另一端进行插入操作。栈由于只能在一端操作,因此实现起来会很简单,而队列是在两端操作,实现起来比栈稍微麻烦一点,因为需要考虑两端的指针关系问题。

2023-12-08 20:38:20 1289

原创 数据结构——栈

栈是一种只能在一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶,表的另一端称为栈底。如下图所示。在栈中,栈顶的位置是动态变化的,它会根据出栈和进栈操作变更栈顶的位置,进栈操作是将一个元素插入到栈中(只能插入到栈顶),出栈操作是将栈顶元素从栈中删除。进栈操作后栈顶的位置将会变为插入元素所在的位置,出栈操作后栈顶的位置将会变为原栈顶元素的上一个元素的位置。栈顶的位置通常用一个指向栈顶元素的指针或者索引来表示,执行进栈和出栈操作后只需要更改对于的栈顶索引或者指针即可。

2023-12-06 23:01:18 1523

原创 操作系统——进程同步

生产者消费者问题主要要解决的就是进程之间同步的问题以防止进程之间无序争夺资源,造成系统混乱。生产者和消费者共用一个缓冲池,生产者写入数据,消费者取出数据,为了防止数据错误,同一个时间只能有一个进程使用缓冲池,实现进程互斥访问缓冲池;消费者要在生产者生产完产品,缓冲池中有产品后再去申请获取缓冲池资源,生产者在缓冲池满了后要在消费者取出产品后再申请缓冲池资源将产品放入缓冲池。使用信号量机制实现上面的要求就需要3个信号量,一个是缓冲池的资源数量,最大为1,实现互斥访问缓冲池;一个是缓冲池中空缓冲区数量信号量。

2023-12-05 01:00:00 1887

原创 机器学习——logistic回归

在之前实验接触到的机器学习算法都是的目的都是对数据集进行分类,即预测得到的结果是数据样本所属的类别,预测输出结果是离散的集合,比如{‘是’,‘不是’}。这次实验学习的是回归模型,与分类模型不同的是,回归模型预测得到的是一个连续的数值,比如预测房价、温度等得到的值都是连续值。logistic回归就是一种回归模型,但是logistic回归得到的预测结果是分类,它虽然在中间过程是回归,但使用它的目的和它预测的结果是分类。这次实验学习的就是使用logistic回归执行分类任务。

2023-12-04 21:57:38 1449 1

原创 数据结构——链表

链表是由多个地址不连续的存储结点连接而成的一种线性表,每个存储结构不仅包含元素本身的信息(数据域),而且包含表示元素之间的逻辑关系的信息,在c/c++中采样指针来实现,称为指针域,这个逻辑关系用指针来表示就是指向在线性表中与其相连的元素的地址。在线性表中,每个元素最多只有一个前驱结点和后继结点,采样链式存储时,每个结点需要包含前驱结点或者后继结点的地址信息,其中最简单也是最常用的方法是只存储每个结点的后继结点的地址,以这种方式构成的链表称为单链表。

2023-12-02 23:51:03 3535

原创 算法设计基础——贪心法

从上面两个例子中我们能得到贪心法求解问题的基本步骤,首先根据问题描述选择一个合适的贪心策略,贪心策略是在每个阶段求解最优解的方法,与动态规划法的动态规划函数类似,同动态规划函数一样,贪心策略也是贪心法的关键。接着将问题划分为若干个阶段,对于每个阶段,运用贪心策略求解得到最优解,贪心策略都是只根据当前的已知的信息作出的贪心选择,而不会去考虑作出此选择后对后续的影响是好是坏,因此使用贪心策略求出的解都是局部最优解,而不是整体最优解,对每个阶段都求出最优解后就能得到原问题的最优解。

2023-11-29 22:14:13 1313

原创 深度学习——卷积神经网络

如果卷积核的高和宽都为1,对乘法的计算次数的影响不大,因为一般输入矩阵的大小都远大于卷积核的大小,但加法的计算次数会得到显著的减少,因为加法计算的次数与卷积核的大小是成正比的,卷积核的高和宽为1时,比不为1能减少c0 x ci(((h+2ph-kh)/sh + (w+2pw-kw)/sw + 2) x (kh x kw - 1)- 1)+ c0次的计算。如上图这个卷积核就是一个检测物体边缘的卷积核,因为物体的边缘通常是变化巨大的,如果横向的两个元素相同,则输出结果为0,否则为非0。

2023-11-23 23:51:09 1182 1

原创 操作系统——进程通信

父进程创建子进程后,父进程和子进程都会继续执行下面的代码,为了区分父子进程,让父子进程执行不同的操作,可以根据fork函数返回的值判断,fork函数会分别在父进程和子进程返回子进程号和0。

2023-11-20 10:00:00 126

原创 深度学习——残差网络

残差网络是通过将输出从输入的映射改为输入数据加上输入的映射,这样就从学习输出的特征y表示变为学习残差,这样就有一条旁路连接输入和输出,每一层都能直接与顶层的损失进行“对话”,以此解决了梯度在反向传播的过程中逐渐消失的问题。

2023-11-18 20:07:31 3155

原创 深度学习——多层感知机MLP

多层感知机实现的大致步骤为获取数据集、初始化模型参数(通常将权重初始化为标准差为0.01均值为0的正态分布,偏置初始化为0)、定义激活函数(一般使用ReLU函数)和损失函数、定义网络模型(本次实验为线性回归模型),基本与线性回归和softmax回归模型一样,只是多层感知机的网络层数更多(本次实验添加了隐藏层),不过之前的学习中在实现时为了让我们了解多层神经网络的流水线操作,也使用了多层感知机的网络模型。

2023-11-14 14:56:39 723

原创 图像分割——霍夫变换检测直线

霍夫变换检测直线的基本思路就是给出一些可能存在的直线,计算每条直线经过的边缘点,经过的边缘点越多就说明这条直线越可能存在,通过投票的机制选择票数最多的直线,这些直线就是最可能存在的直线,霍夫变换的变换就体现在它不是在图像空间中求解的,而是转换到对偶空间(参数空间、极坐标空间)中进行求解,因为在这些空间中求解能使得问题变得简单。

2023-11-11 00:19:29 2933 1

原创 算法设计基础——动态规划法

斐波那契数列递归求解的过程类似二叉树的后序遍历,先求左子树,再求右子树,最后得到原结点,如上图,在getFibo(5)中左子树求解完getFibo(3)后,右子树getFibo(3)可以直接从表中取出该问题的解,无需再次计算,getFibo(4)也是同理,这样的执行过程就相当于剪去了右子树,只计算左子树,使得时间复杂度规模直接从O(2^n)直接降到O(log2(2^n)),即O(n),提升时非常巨大的。此外,动态规划法的填表也使得算法减少了很多重复的计算,避免了分治法的缺点。直到0到1、0到2、0到3。

2023-11-09 22:17:45 414

原创 机器学习——决策树

决策树是一个基于树形结构的分类模型,它将数据集中的不同特征的不同取值对数据集进行分割,构造出一个树形结构,这个树形结构就是决策树,使用决策树能够进行分类任务,预测数据样本的分类。我们使用的分类算法是k近邻算法,它是一个很容易实现的分类模型,可以完成很多的分类任务,但它最大的缺点就是无法给出数据的内在含义,因为它只是通过计算样本点的距离来进行分类的,这个距离并不包含对该样本分类的实际意义,而决策树的每一个分类都有对应一组特征判断的条件,可以很直观的看出分类规则,其数据形式非常容易理解。

2023-11-06 20:50:56 2314

原创 图像的频域变换

上述代码中显示频域图像时,由于我们只关心频率的幅度,频率有正有负,因此我们对其取绝对值,同时取绝对值也可以让结果是实数,避免matlab警告,频率有的值可能非常大,这样会导致频率的取值范围很大,一些较小的频率很难被观察到,因此可以将频率值取对数,使其取值范围降低到一个很小的范围。在代码实现上,我们可以使用一个矩阵,其值为0或1,将该矩阵中心一部分区间的值改为1,外围改为0,再使用原频域图像矩阵点乘此矩阵,即可使频域图像矩阵中心低频区间的值保留,外围的值变为0,达到去除高频分量的目的。

2023-11-05 22:45:02 3293

原创 霍夫曼编码

如果不为空则判断该结点是其父结点的左子树还是右子树,左子树则将code设为0,右子树设为1,然后再从该结点的父节点继续向上寻找父节点的父节点,直到根结点结束(也就是父节点为空),此时就能得到一个编码了,但这并不是真正的结果,因为编码是逆序向上的,而霍夫曼编码是顺序从根结点向下的,需要将得到的编码进行逆序操作,得到其逆序编码,此编码就是该结点的编码了,循环n次后就能将每个结点的霍夫曼编码计算出来。下面我们选取一段不少于3000字的英文材料,统计各字符出现的次数,实现Huffman编码,以及对编码结果的解码。

2023-11-04 20:10:45 1352

原创 算法设计基础——减治法

分治法是将一个大问题划分为多个子问题,接着对所有子问题求解,再将子问题的解进行合并得出原问题的解。减治法与分治法类似,也是将原问题分解为多个子问题,但却并不需要对所有子问题进行求解,它只需要求解其中一个子问题,因此不需要对子问题的解进行合并,只需通过这个子问题的解来得到原问题的解。减治法可以看做是一种特殊的分治法,但它在分解子问题的同时会不断地减少问题的规模,通常情况下其时间复杂度会比分治法低。作为入门,我们先从减一治、减半治开始来逐步了解和掌握减治法。

2023-11-03 12:30:00 962

原创 深度学习——softmax回归

在softmax回归中我们使用的数据集中的样本为28x28的图像,为了简化问题,我们将其降维看作长度为784的向量,每个像素位置视为一个特征,即每个样本拥有784个特征。在softmax回归中,输出与类别一样多,我们使用的数据集类别有10个,样本特征有784个,因此将权重设为784 X 10的矩阵,偏差值也需要有10个。要计算正确预测的个数,我们需要将y_hat中的数据与y进行比较,相同的即为正确预测,计为1,否则为错误预测,计为0.3. 将1的结果的每一行除以该行的规范化参数,使得每一行的和为1。

2023-11-02 12:15:00 165

原创 深度学习——线性回归

我们已经准备好了模型训练所需的所有要素,现在我们可以开始训练模型了,我们每次从数据集中抽取一个小批量的数据,根据小批量中的数据和模型参数,我们可以得到计算的结果y_hat,将y_hat和y传入损失函数进行计算小批量损失,接着再计算损失函数的梯度,再根据梯度优化更新参数,在更新完后,我们可以测试更新后的效果。这里我们使用小批量随机梯度下降法,首先从数据集中抽取一个小批量,然后计算损失函数的梯度,接着根据梯度向着损失减少的方向更新参数,更新的步长为学习率,我们需要选取合适的学习率以保证模型能很好的收敛。

2023-11-01 16:26:36 738 1

原创 深度学习从零开始

在学习深度学习前,我们首先需要搭建一个软件开发平台,我们使用的平台是Pytorch加OpenCV,因此我们需要先安装这两个包。

2023-10-31 17:00:00 1060 1

原创 算法设计基础——分治法

那么这样的分解要到什么时候结束呢,我们知道递归需要有递归体和递归出口,分治法也要有分解的部分和终止条件,而这个终止条件就是问题无法再继续分解下去或者这个问题的解我们已经知道了,此时就没必要再求解下去了,根据实际情况返回结果即可。分治法是一种很基础的算法,其实现原理是将大问题分解成多个子问题,通过求解子问题来得到原问题的解,而这些子问题的求解也与原问题一样可以通过将其拆分,求解它们的子问题的解来得到本身的解,这是一种典型的递归思想,因此一般我们编写程序也通常使用递归法来实现分治算法。

2023-10-30 18:59:19 314 1

原创 分类模型性能评估

上次实验我们已经实现了knn算法,这次实验我们来对分类算法进行性能评估。上次实验我们对knn分类器的性能评估只有错误率这一个单一的指标,对其的评估较为片面,这次实验我们将使用精确率Precision、召回率Recall 等指标以及ROC曲线和PR曲线对分类器进行更加全面的评估。

2023-10-20 11:04:23 255 1

原创 k-近邻算法初体验

自上次实验安装完vscode和anaconda并配置好环境后,我们就可以开始进行机器学习的实验了。今天我们要开始第一次尝试写机器学习的算法,本次实验选取较为简单的k-近邻算法作为入门的机器学习算法。

2023-10-09 20:30:00 139 3

原创 vscode+anaconda安装及conda虚拟环境的激活

下载安装包直接点击安装即可。

2023-09-25 21:17:32 9599 3

原创 多段图问题(求解最短路径)

用一个辅助数组d[n]来存储0到i点的最短距离,i从1到n-1,每次循环计算0到该点的前几个点最短距离加上这几个点到该点的距离的最小值,这个最小值即为0到该点的最小值。要求解0到9的最短路径,首先要求0到7的最短路径和0到8的最短路径,然后再取0到7到9和0到8到9这两段距离中的最短距离。直到0到1、0到2、0到3。这样就能得到0到9的最短距离了。求解起点到终点之间的最短路径首先要求解起点到与终点有边的几个点之间最短距离,然后加上这几个点到终点的距离,则这几段距离中的最短路径即为起点到终点的最短距离。...

2022-08-04 01:47:01 2077

原创 哈利波特的考试

哈利·波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可以将猫变老鼠、老鼠变鱼的魔咒连起来念:hahahehe。现在哈利·波特的手里有一本教材,里面列出了所有的变形魔咒和能变的动物。老师允许他自己带一只动物去考场,要考察他把这只动物变成任意一只指定动物的本事。于是他来问你

2022-06-14 13:20:51 489

原创 最小生成树(prim算法)实例

公路村村通

2022-06-08 23:59:45 362

原创 完全二叉树的层次遍历

给出一个完全二叉树的后序遍历序列,求该树的层次遍历序列思路:用数组储存该树的层次遍历序列。按照层次遍历的顺序从1开始排序,一颗完全二叉树的一个序列为 i 的根节点的左子树序列为2i,右子树序列为2i+1。树的后序遍历为先左再右,最后根结点,使用递归函数根据后序遍历的顺序按照结点的序列依次存入数组。该数组即为层次遍历的序列。#include<iostream>using namespace std;int n;int a[1000];void dfs(int x){

2022-05-28 00:00:00 530

原创 哈夫曼树的创建

#include<bits/stdc++.h>using namespace std; #define MAX 101#define MaxWeight 300 //最大权值 int n;struct HTreeNode //哈夫曼树结点类型{ char data; //字符 int weight; //权值 int parent; .

2022-05-27 00:00:00 259

原创 约瑟夫环(数组)

#include<iostream>using namespace std;#define Maxsize 1000int main(){ int a[Maxsize]; int t=0,i,j,m,n; cin>>m>>n; //m为人数,数到n的人出列 for(i=0;i<m;i++) a[i]=i+1; for(i=m;i>0;i--) { t=(t+n-1)%i; //出列人的编号对人数取模 cout<&lt.

2022-05-06 15:16:49 169

原创 队列的应用——求解迷宫最短路径(广搜)

#include<iostream>#define Maxsize 100using namespace std;struct Box{ int i,j; int pre;}e;template<class T>class Queue{ T *data; int front,rear; public: Queue(){ data=new T[Maxsize]; front=rear=-1; } ~Queue(){ delete[] data.

2022-04-26 12:54:14 658

原创 表达式转换并求其值(简易计算器)

后缀表达式,也称逆波兰表达式,是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。因此对中缀表达式的求值可以首先转换为后缀表达式再对其求值。这题是书本例题,书本上的例题考虑的情况比较少,只考虑了运算数不带正负号和整数的情况。在做题时经常会遇到运算数带符号和非整数的情况。所以我对书本例题进行了改进,使它能兼容这些情况。第一部分:表达式转换 stack<string> st; string a; cin>>a; int i,j=0,

2022-04-18 07:00:00 284

原创 数据结构线性表例题

#include<iostream>using namespace std;#define MaxSize 100/*typedef int ElemType;typedef struct{ ElemType datas[MaxSize];}Sqlists;*/template <class T1>class Sqlist{ T1 data[MaxSize]; int length;public: Sqlist(T1 a[],int n){ for(.

2022-03-22 11:46:31 1789

原创 c++实验四——STL

C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic programming) 的思想: 模板机 制,以及标准模板库 STL。泛型程序设计简单地说就是使用模板的程序设计法。 将一些常用的数据结构(比如链表,数组,二叉树) 和算法(比如排序,查找)写成模板,以后则不论数据 结构里放的是什么对象,算法针对什么样的对象,则都 不必重新实现数据结构,重新编写算法。 标准模板库 (Standard Templ

2022-02-28 12:37:47 533

原创 c++模板

概述 模板用于把函数或类要处理的数据类型参数化,表现为参数的多态性。模板用于表达逻辑结构相同,且具体数据元素类型不同的数据对象的通用行为,从而使程序可以从逻辑结构上抽象,把被处理的对象类型作为参数传递。类模板类模板使用户可以为类声明一种模式,使得类中的某些数据成员、成员函数的参数和返回值能取任意数据类型。类模板用于实现类所需数据的类型参数化。类模板在表示数据结构(如数组、二叉树和图等)时显得特别重要,这些数据结构的表示和算法不受所包含的元素类型的影响。类模板的声明格式如下:temp

2022-02-26 14:06:21 841

原创 C++的继承和多态

继承与派生面向对象程序设计的三大特征是封装、继承和多态。其中继承体现的是一种持续发展的、开放的编程态度。继承和派生可以在不破坏原有类的封装特性的情况下获得原有类的数据和功能,并在此基础上增加新的数据和功能。基类是为解决以前的老问题而设计的,但在遇到新问题时其功能就有局限,这是在继承的基础上进行派生则能够在基类的基础上添加功能来解决新问题。因此通过继承和派生可提高代码的可重用性和持续性。继承与派生概念:保...

2022-01-30 01:24:49 1877

原创 c++面向对象程序设计

什么是对象?现实生活中的各种物品,水瓶,铅笔,书本,苹果,书包这些都是对象,对象可以是任何东西。而在程序设计中,对象实际上就是变量,在程序设计中的各种变量,不管是整型、实数型、字符型、布尔型都是对象。一个程序就是一大串的对象互相通过传递信息告诉彼此该怎么做。每一个对象都有他自己的内存,这个内存又是由其他对象组成。面向过程和面向对象c语言是面向过程的程序设计,而c++则在c语言的基础上增加了面向对象的概念。面向过程首先是分析问题,然后根据算法将解题步骤一步一步地用c语言的语句描述出来,这是一种以“

2022-01-22 23:30:53 4971

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除