adydio
文章27
标签8
分类1
线性回归与梯度下降

线性回归与梯度下降

线性回归与梯度下降

Linear regression

  • The model function for linear regression, which is a function that maps from x to y is represented as .

  • To train a linear regression model, you want to find the best parameters that fit your dataset.

    • To compare how one choice of is better or worse than another choice, you can evaluate it with a cost function
      • is a function of . That is, the value of the cost depends on the value of .
    • The choice of that fits your data the best is the one that has the smallest cost .
  • To find the values that gets the smallest possible cost , you can use a method called gradient descent.

    • With each step of gradient descent, your parameters come closer to the optimal values that will achieve the lowest cost .
  • The trained linear regression model can then take the input feature and output a prediction .

Gradient Descent

Gradient descent involves repeated steps to adjust the value of your parameter to gradually get a smaller and smaller cost .

  • At each step of gradient descent, it will be helpful for you to monitor your progress by computing the cost as gets updated.
  • In this section, you will implement a function to calculate so that you can check the progress of your gradient descent implementation.
Cost function

As you may recall from the lecture, for one variable, the cost function for linear regression is defined as

  • is the model's prediction through the mapping, as opposed to , which is the actual value from the dataset.
  • is the number of training examples in the dataset.
Model prediction
  • For linear regression with one variable, the prediction of the model for an example is represented as .

This is the equation for a line, with an intercept and a slope .

Algorithm

The gradient descent algorithm is:

where, parameters are both updated simultaniously and where
* m is the number of training examples in the dataset.

  • is the model's prediction, while , is the target value.
about

about

About Me

今年19岁,是学生。时常emo找不着方向但也在努力爬行的人。

文章归档

文章归档

C语言计算器

C语言计算器

基于栈的计算器(C语言)

作者:Dongzhuo Chen

#include<stdio.h>
#include<stdlib.h> 
#include<assert.h>

#define MAXSIZE 100

char valid_op[] = "+-*/";//定义合法的运算符数组,方便调用相应运算功能
char opStack[MAXSIZE];//定义运算符栈,用于存放暂时不用的运算符 
int opTop = -1;
double numStack[MAXSIZE];//定义数栈,用于存放暂时不用的数 
int numTop = -1;

void push_op(char op);
char pop_op();
void push_num(double num);
double pop_num();

int read();//定义读入函数 
double num_temp;//暂时存放读到的数字 
char op_temp;//暂时存放独到的运算符 
int is_num, is_op;

//定义函数指针,调用相应运算功能
double add(double x, double y);
double sub(double x, double y);
double mul(double x, double y);
double divid(double x, double y);
double (*func[])(double x, double y) = {add, sub, mul, divid};

//定义优先级函数,用于判断左侧运算符与右侧运算符优先级 
int prio_l(char op); 
int prio_r(char op); 

//定义储存表达式的数组 
char s[MAXSIZE];
//定义pt变量,用于指示目前表达式读取进度 
int pt = 0;
double num1, num2;
char op0;

int main()
{
    int i, op_loc;
    printf("请输入一个表达式(目前仅支持正数的加减乘除,可以使用括号),以#开头,并以#结束:\n");
    scanf("%s", s);
    read();
    push_op(op_temp);//读到第一个“#”,并将其存入运算符栈 
    read();
    while(true)
    {
        if(is_num == 1)//如果读到的是数字,将其存入数栈 
        {
            push_num(num_temp);
        }
        if(is_op == 1)//如果读到的是运算符,判断其与运算符栈顶符号的优先级 
        {
            if(prio_l(opStack[opTop]) < prio_r(op_temp))//若读到的运算符优先级较高,将其存入运算符栈 
            {
                push_op(op_temp);
            }
            else if(prio_l(opStack[opTop]) == prio_r(op_temp))//若读到的运算符优先级相等,说明左右括号相遇,去括号 
            {
                pop_op();
            }
            else if(prio_l(opStack[opTop]) > prio_r(op_temp))//若读到的运算符优先级较低,则先进行运算符栈顶的运算符运算 
            {
                num2 = pop_num();
                num1 = pop_num();
                op0 = pop_op();
                for(i = 0; i < 4; i ++)
                {
                    if(op0 == valid_op[i])
                    {
                        op_loc = i;
                        break;
                    }
                }
                num_temp = (*func[op_loc])(num1,num2);
                push_num(num_temp);//将得到的结果存入数栈中 
                pt --;  
            }
        }
        if(is_num==0 && op_temp=='#' && opStack[opTop]=='#')//两个#相遇时标志着运算结束 
        {
            break;
        } 
        read();//读取下一个字符 
    }
    printf("这个表达式的结果是%f\n", numStack[numTop]);
    system("pause");
    return 0; 
}

int read()
{
    if(s[pt] >= '0' && s[pt] <= '9')//如果读到的是数字 ,把读到的数字字符转换成对应的数值 
    {
        is_num = 1;
        is_op = 0;
        double a = 0;
        int t = 10;
        while(s[pt] >= '0' && s[pt] <= '9')//处理小数点以前的位数
        {
            a = 10 * a + s[pt] - '0';
            pt ++;
        }
        if(s[pt] == '.')
        {
            pt ++;
        }
        while(s[pt] >= '0' && s[pt] <= '9')//处理小数点以后的位数 
        {
        a = a + (s[pt] - '0')*1.0/t;
        pt ++;
        t *= 10;
        }
        num_temp = a;
        return 0;       
    }
    else//如果读到的是运算符 
    {
        is_op = 1;
        is_num = 0;
        op_temp = s[pt];
        pt ++;
        return 0;
    }
}
void push_op(char op)
{
    if(opTop == MAXSIZE-1)
    {
        printf("operator stack is full!\n");
        assert(0);
    }
    else
    {   
        opTop ++;
        opStack[opTop]=op;  
    }
}

char pop_op()
{
    char op;
    if(opTop == -1)
    {
        printf("operator stack is empty!\n");
        assert(0);
    }
    else
    {   
        op = opStack[opTop];
        opTop --;
    }
    return op;
}

void push_num(double num)
{
    if(numTop == MAXSIZE)
    {
        printf("number stack is full!\n");
        assert(0);
    }
    else
    {
        numTop ++;
        numStack[numTop]=num;
    }
}

double pop_num()
{
    double num;
    if(numTop == -1)
    {
        printf("number stack is empty!\n");
        assert(0);
    }
    else
    {
        num = numStack[numTop];
        numTop --;
    }
    return num;
} 

int prio_l(char op)
{
    int prio;
    switch(op)
    {
        case'+':
        case'-':
            prio = 4;
            break;
        case'#':
            prio = 0;
            break;
        case'*':
        case'/':
            prio = 6;
            break;
        case'(':
            prio = 2;
            break;
        case')':
            prio = 7;
            break;
    }
    return prio;
}
int prio_r(char op)
{
    int prio;
    switch(op)
    {
        case'+':
        case'-':
            prio = 3;
            break;
        case'#':
            prio = 0;
            break;
        case'*':
        case'/':
            prio = 5;
            break;
        case'(':
            prio = 7;
            break;
        case')':
            prio = 2;
            break;
    }
    return prio;
}

double add(double x, double y)
{
    double ret = 0;
    ret = x + y;
    return ret;
}

double sub(double x, double y)
{
    double ret = 0;
    ret= x - y;
    return ret;
 } 
 
double mul(double x, double y)
{
    double ret = 0;
    ret = x * y;
    return ret;
}

double divid(double x, double y)
{
    double ret = 0;
    ret= x / y; 
    return ret; 
}
introduction

introduction

关于blog.adydio.top

欢迎来到adydio的个人博客网站!

建站的初衷是激发我持续学习的动力。撰写博客就好像总结自己的所得,我也好在写的过程中看看自己这一天到底学到了一些什么,一定程度上可以防止虚无度日吧。还有一个目的就是把这里当做树洞,记录自己的一些情绪变化,可以当一个乐子哈。

下面开始写一些正经一点的站点介绍。

站点的搭建(非教程)

建立个人博客我参考了b站的视频,及其对应博文。在主题的选取上借用了tangyuxianhexo-theme-tangyuxian主题,我觉得非常棒!在此感谢上述作者和up主,我作为前端小白能凭兴趣搭建好这个网站离不开这些视频和博文的帮助。

建立站点前前后后花了我快两天的时间,遇到了不少bug,好在之前有过写flask的一点点经验,这次哪怕没学过相关知识,照葫芦画瓢也能把网站打理的比较像样。框架用的是hexo,并且利用netlify进行了托管部署,再在阿里云上买了个三年期限的域名,大概就是这么个流程。中途用别的主题因为种种原因换了一个又一个,也失败过几次,最终用这个主题完成了部署。

站点功能

发布markdown格式的博客,支持LaTeX语法
标签、分类系统
归档日志
搜索博文功能
显示天气与时钟
支持电脑端、手机端的运行
聊天系统

点击右下角旋转的卡通图案即可给我发送消息!我将会在微信里收到提醒。

评论系统

无需登录,当然了你可以在评论区上方的表格里留下你的信息。

待修复的一些事项

右下角回到顶部按钮只适用于Chrome浏览器
...持续更新中
Hello World

Hello World

你好,世界!

欢迎来到adydio space

scale=0.3
运动会日寄

运动会日寄

原标题:运动会日寄

运动会结束了,幸运的是我得以笑着离开。(2023/10/27)

前言

--23/11/09 2:48--

很早就开始平静地审视自己,回顾自己过去的困境,复盘自己的经验。我很在意那些最关键的、改变我的时刻在哪里,是什么让我执着地爬行,又是什么让我痛苦不堪。同时吸引我的是,我对于自己而言也是有大量神秘色彩的。我在初中的时候做过一个比方:如果我是100%,那么我的家长顶多了解自己的10%,同学们按关系深浅,对我的了解大概就是5%~30%,而我对自己的了解充其量也就50%而已。为什么这么说,因为我直到现在都无法解释自己的一些行为。诸如,为何与特定的人交往,又为何会不自觉远离特定的人?我说不出什么令我喜欢,也很难讲具体什么让我反感了。到了大学,自我认知缺陷的弊端再一次凸显。在种种选择面前的迷失,让我在社交、学习等等场合表现不尽人意。因此,这个博客网站诞生了,在自我迷失、学业压力、疫情折磨的多重打压下,我终于冷静下来;我尝试让自己回到过去,寻找最初的起点,直面自己最原始的欲望。

略有遗憾的是,直到二零年家庭的巨变余波渐散,我方才史无前例地开始考虑一些不那么平凡的问题。换言之,在这之前,我大脑对于方法论、认知论、人生观诸如此类的认知近乎为零。在此之前,我无非是在学业之上充当“乖宝宝”,该咋学咋学就是了,其余的精力就用在玩和情感上了。巨变之后,我开始“看开”了,不过多纠结一些琐碎的事情,将人的存在放在了更高的视角来看待,心境开阔了很多。我深刻意识到身体健康的重要性,在毕业之前就开始常规的跑步锻炼,甚至将运动在上大学后变为一种优势并且持续发展,这是初中肥胖的我不敢想象的场景。此外,我感受到了重大灾难给一个家庭带来的前所未有的凝聚力,整个家庭从疫情爆发到现在空前团结和睦,让我感触颇深。我对于黑天鹅事件的防范意识变强,换言之,我意识到人生是一场长期以来的均值回归:不在意一时的小波动,稳步提升最重要;而且要防范诸如新冠疫情、身体变故的突然出现,这些就好比回归样本点的异常值,往往会毁掉一切;一时小的成败得失不值得沾沾自喜,心境平和、身体健康或许是最值得感激的。我还发觉金钱对于一个家庭稳定的重要性,pandemic众生相惨不忍睹,这个时候适者生存!原本平静向好的人生旅途可能毁于一旦。家庭巨变和疫情给我带来的影响是巨大的,甚至是带有阴影的,以至于大学在深夜回忆起来,心中的滋味难以言说。刚刚结束不久的运动会自己参加了首个个人单项,算是对过去的自己一个交代吧。

我来到了大学。大一上学期懵懵懂懂,混过去了;吃了成绩单的苦头后我努力了一整个学期,伴随着焦虑和生理不适我终究累垮了。于是到了大二,我进入了彻底的迷茫。我开始失去一切动力,怀疑和咒骂身边的一切。我抱怨高度内卷和压抑的环境,发誓我要离开这里。我挖苦自己小镇做题家的身份——我这种人,熬过了高中也要在大学苦逼内卷不配得到快乐。接着,我开始思索为什么我得不到快乐,为什么躺不平也卷不动。这或许是我对三观重构的开始,从这时起我才开始考察这个社会、考察形形色色的人。我很在意:他们的动机是什么,他们在追求些什么,而我呢?我真正想要什么?于是,我开始回忆。每晚我彻夜难眠,回忆着小时候曾让我发自内心感到快乐的片段,我感慨这种快乐越来越少了。我看到原来自信阳光的自己,为什么到了大学心灵成了一座孤岛?我窥见了自己敏感、脆弱、内向、善良而有时因恐惧而变得极端而邪恶的内心。我拾起了两年之前青涩的情感回忆,眼里望着天花板,望着广袤的宇宙,望着虚无。我不知道我可曾死心塌地喜欢过一个确切的人;但是,我那之后确实再也没有心动过了。想到这里,心里的眼泪止不住流;床上的我半裸着身子,伴随着模糊的视线,耳机里放着低保真的音乐,麻醉在混乱的思绪里。时不时地,我会想起我的妈妈。病痛降临到一个善良的医生、一位伟大的母亲身上,上天的心不会痛吗?破败不堪的我,社交低能的我,情感麻木的我,不谙世事的我,没有情趣的我。我仿佛离她的期待非常非常远。我感到自责,又总是回忆起让我心碎和麻痹的一百天——终于一行眼泪划过我的脸颊,我知道我不止一点伤心了

(写和队友出去的那个晚上。。。)

...(前言未完待续)

这一篇博文,将会是自己对过去的全面复盘以及对未来的(甚至是纲领性的)要求或展望。内容以回忆和总结为主。对于不同话题会有对应的展开。我也会写下当下的困惑。板块篇幅过长便缩减为一超链接,另起一文发布。文字拙劣,不指望(也许暂且不希望)得到任何形式的关注,权当自己与自己的对话记录,寄录于此。

内容提要

  • 运动会日寄(长篇回忆录)
  • 黑暗一百天:我到底在想什么?(回忆录)
  • (标题未确定)自我审视类,我是谁?
  • 辩证法(话题)
  • 逻辑(话题)
  • 从零开始的哲学探索(连载)
  • 从零开始的政治探索(连载)
  • 一直在回避的情感(话题)
  • 我说的话到底可不可靠?浅说自己的话语分级(话题)
  • 浅谈意识形态(话题)
  • 锐评备选栏目(连载)
  • 轻重之辩论(话题)

(未完待续)