小白初涉,先试试水。涉及Python,C语言基础,机器学习等

新人小白初涉博客,不足之处,还望点出

1.小白简介

1.1自我介绍

我现在是山建理学院的一名大一新生,专业:信息与计算科学,计算机和数学四六分,(嘿嘿,不太喜欢数学,所以大部分时间用在了计算机上)。毕竟是大一嘛,接触的东西还是太少了,虽然进了专业的实验室,但对很多东西接触的还是很少,希望能在接下来的几年里能认识并体验到计算机的奥秘。

1.2目的

2020年,这个疫情带来了好多好多麻烦。作为大一的学生,暗自庆幸早考了一年。没有毕业生的焦虑,似乎同时也没了学习的动力。所以来写写博客,以提醒监督自己,同时增长下自己的写作能力。

1.3方向

实验室主攻人工智能(虽然就两个学长会),又加上自己也喜欢编程,喜欢搞些新东西,因此我也学习人工智能方向(现在在学Python)。专业有所趋向数学,数学建模也是一个学习方向(MATLAB)。

1.4目标

最直接的:考研。争取在大学里多参加些竞赛,( 数学建模,国创啥的必须参加),即使得不了奖,也要积累些经验嘛。

1.5现状

主要在学Python,两三个月了,学的有点乱,机器学习主要是跟着书打代码,没有做过自己的。而且一会学爬虫,一会还学着做些小东西,(感觉也还可以,换换脑子哈哈)。学校刚开C语言,编程语言都差不多,但比起来,C语言就是麻烦。大二学校还要开Java,数据结构啥的,把自己的业余学习全扑到Python上,其他也不会落下。

1.7.flag

毕竟自己才大一,不懂得有很多,要学的东西也还很多很多,但我毕竟年轻嘛,哈哈,对编程有绝对的兴趣,也有朝气有决心。刚看了小鹿的一个博客,里面有个如何十年学好编程,(十年还不一定学好,哈哈,太难了),所以我也不急功近利,稳扎稳打中尽快提升自己,能做更多项目就好。以后至少一周一篇博客吧,不求多少人看,只想督促下自己,同时记录下自己的学习路线。

1.8. 博客内容

大一新生,刚接触编程,内容肯定不会多好,也会很杂乱,可能一会机器学习,一会爬虫,一会又C语言了,主要目的就是像做笔记似的,记录下自己的学习。还望多多指教下我这个小白(同时也能提高下你们嘛 哈哈)。

2.机器学习训练模型

2.1.如果你的训练集有超过百万个特征,你会选择什么线性回归训练算法?

答:如果训练集有数百万个特征,你可以使用随机梯度下降或者是小批量梯度下降,如果内存允许,甚至可以使用批量梯度下降。但是 由于计算复杂度随着特征数量的增加而快速提升(比二次方还高), 因此不能使用标准方程的方法。几种梯度下降方法计较

2.2.如果你的训练集里特征的数值大小迥异,什么算法可能会受到影响?受影响程度如何?你应该怎么做?

答:如果训练集的特征数值具有非常迥异的尺寸比例,成本函数将呈现为细长的碗状,这导致梯度下降算法将耗费很长时间来收敛。要解决这个问题,需要在训练模型之前先对数据进行缩放。值得注意的是,使用标准方程法,不经过特征缩放也能正常工作。

2.3.训练逻辑回归模型时,梯度下降是否会困于局部最小值?

答:训练逻辑回归模型时,梯度下降不会陷入局部最小值,因为它 的成本函数是凸函数(如果在曲线上任意两点之间画一条连接线,该线永远不会穿过曲
线。)

2.4.假设运行时间足够长,所有的梯度下降算法是不是最终会产生相同的模型?

答:如果优化问题是凸的(例如线性回归或者逻辑回归),并且学习率也不是太高,那么所有梯度下降算法都可以接近全局最优,最终生成的模型都非常相似。但是,除非逐渐降低学习率,否则随机梯度 下降和小批量梯度下降都不会真正收敛。相反,它们会不断在全局最优的附近波动。也就是说,即使运行时间非常长,这些梯度下降算法产生的模型仍然会有轻微不同。

2.5.假设你使用的是批量梯度下降,并且每一轮训练都绘制出其验证误差,如果发现验证误差持续上升,可能发生了什么?你如何解决这个问题?

答:如果验证误差开始每轮上升,那么可能性之一是学习率太高, 算法开始发散所致。如果训练误差也开始上升,那么很显然你需要降 低学习率了。但是,如果训练误差没有上升,那么模型很可能过度拟 合训练集,应该立刻停止练。

2.6.当验证误差开始上升时,立刻停止小批量梯度下降算法训练是否为一个好主意?

答:无论是随机梯度下降还是小批量梯度下降,由于它们的随机 性,使得它们都不能保证在每一次的训练迭代中都取得进展。所以, 如果在验证误差刚开始上升时就停止训练,很有可能会在达到最优之 前过早停止训练。更好的方法是定时保存模型,当较长一段时间都没 有改善时(意味着可能不会再超过最好的记录了),可以恢复到保存 的最优模型。

2.7.哪种梯度下降算法(所有我们讨论过的)能最快到达最优解的附近?哪种会收敛?如何使其他算法同样收敛?

答:随机梯度下降的训练迭代最快,因为它一次只考虑一个训练实例,所以通常来说,它会最快到达全局最优的附近(或者是批量非常小的小批量梯降)。但是,只有批量梯度下降才会经过足够长时间的训练后真正收敛。对于随机梯度下降和小批量梯度下降来说,除非逐渐调低学习率,否则将一直围绕最小值上上下下。

2.8.假设你使用的是多项式回归,绘制出学习曲线,你发现训练误差和验证误差之间存在很大的差距。发生了什么?哪三种方法可以解决这个问题?

答:如果验证误差远高于训练误差,可能是因为模型过度拟合训练集。解决这个问题的方法之一是对多项式降阶:自由度越低的模型,过度拟合的可能性越低。另一个方法是对模型进行正则化——例如,在成本函数中增加2(岭回归)或1(Lasso回归)惩罚,同样可以降低模型的自由度。最后,你还可以尝试扩大训练集。

2.9.假设你使用的是岭回归,你注意到训练误差和验证误差几乎相等,并且非常高。你认为模型是高方差还是高偏差?你应该提高还是降低正则化超参数?

答:如果训练误差和验证误差相近,并且都非常高,则模型很可能对训练集拟合不足。这意味着偏差较高,应该尝试降低正则化超参数。

2.10.你为何要使用:岭回归而不是线性回归?Lasso回归而不是岭回归?弹性网络而不是Lasso回归?

答:有正则化的模型通常比没有正则化的模型表现得更好,所以应该优先选择岭回归而不是普通的线性回归。如果训练误差和验证误差相近,并且都非高,则模型很可能对训练集拟合不足。这意味着偏差较高,应该尝试降低正则化超参数。
Lasso回归使用1惩罚函数,往往倾向于将不重要的特征权重降至零。这将生成一个除了最重要的权重之外,其他所有权重都为零的稀疏模型。这是自动执行特征选择的一种方法,如果你觉得只有少数几个特征是真正重要的,这不失为一个非常好的选择,但是当您不确定的时候,应该更青睐岭回归模型。
·弹性网络比Lasso更受欢迎,因为某些情况下Lasso可能产生异常
表现(例如当多个特征强相关,或者特征数量比训练实例多时)。并
且,弹性网络会添加一个额外的超参数来对模型进行调整。如果你想
使用Lasso,只需要将弹性网络的l1_ratio设置为接近1即可。

2.11.如果你想将图片分类为户外/室内以及白天/黑夜。你应该实现

两个逻辑回归分类器还是一个Softmax回归分类器?**
答:要将图片分类为户外/室内和白天/夜间,你应该训练两个逻辑
回归分类器,因为这些类别之间并不是排他的(存在四种组合)

3 杂乱的基础知识

3.1 np.c_ np.r_

**1.np.c_

>>>np.c_[np.ones([2,2]),([1,2],[3,4])]
array([[1., 1., 1., 2.],
       [1., 1., 3., 4.]])
>>>np.c_[np.array([1,2,3]), np.array([4,5,6])]
array([[1, 4],
       [2, 5],
       [3, 6]])
>>>np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])]
array([[1, 2, 3,0,0, 4, 5, 6]]

2.np.r_


>>> np.r_[1:4:4j, [0]*3, 5, 6]
array([1., 2., 3., 4., 0., 0., 0., 5., 6.])
>>> np.r_[np.array([1,2,3]), 0, 0, np.array([4,5,6])]
array([1, 2, 3,0,0, 4, 5, 6])
>>> a = np.array([[0, 1, 2], [3, 4, 5]])
>>> b=np.array([[1,1,1],[2,2,2]])
>>> np.r_['0', a, b]
array([[0, 1, 2],
       [3, 4, 5]
       [1, 1, 1],
       [2, 2, 2]])
>>> a = np.array([[0, 1, 2], [3, 4, 5]])
>>> b=np.array([[1,1,1],[2,2,2]])
>>> np.r_['1', a, b]
 array([[0, 1, 2, 1, 1, 1],
       [3, 4, 5, 2, 2, 2]])

3.2 np.random

1.np.random.rand()
rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1

>>np.random.rand(4,2)

array([[ 0.02173903,  0.44376568],
       [ 0.25309942,  0.85259262],
       [ 0.56465709,  0.95135013],
       [ 0.14145746,  0.55389458]])

2.np.random.randn()
randn函数返回一个或一组样本,具有标准正态分布。

>>np.random.randn(2,4)

array([[ 0.27795239, -2.57882503,  0.3817649 ,  1.42367345],
       [-1.16724625, -0.22408299,  0.63006614, -0.41714538]])

3.np.random.randint()
返回随机整数

>>np.random.randint(-5,5,size=(2,2))

array([[ 2, -1],
       [ 2,  0]])

4.np.random.seed
np.random.seed()的作用:使得随机数据可预测。
当我们设置相同的seed,每次生成的随机数相同。如果不设置seed,则每次会生成不同的随机数

	import numpy as np
	i=0
	a=[]
	b=[]
	while i<6:
	    np.random.seed(1)
	    a.append(np.random.randint(1,10))
	    i+=1
	print(a)

[6, 6, 6, 6, 6, 6]
	np.random.seed(1)
	for j in range(10):
	    b.append(np.random.randint(1,10))
	print(b)

[6, 9, 6, 1, 1, 2, 8, 7, 3, 5]

5.random.shuffle(x)
现场修改序列,改变自身内容。(类似洗牌,打乱顺序)

>>B = np.arange(9).reshape((3, 3))
		array([[0, 1, 2],
               [3, 4, 5],
               [6, 7, 8]])
               
>>>np.random.shuffle(B)
>array([[6, 7, 8],
                [0, 1, 2],
                [3, 4, 5]])

6.numpy.random.permutation ( x )
返回一个随机排列


>>>np.random.permutation(10)
array([7, 9, 5, 0, 3, 6, 1, 4, 8, 2])
 
>>>np.random.permutation([1, 4, 9, 12, 15])
array([ 1,  9, 15, 12,  4])

>>>A = np.arange(9).reshape((3, 3))
 array([[0, 1, 2],
      [3, 4, 5],
      [6, 7, 8]])
 
>>>np.random.permutation(A)
 array([[0, 1, 2],
        [6, 7, 8],
        [3, 4, 5]])

7.numpy.random.RandomState()
指定种子值是为了使同样的条件下每次产生的随机数一样,避免程序调试时由随机数不同而引起的问题。


>>>np.random.RandomState(2018).randn(2,3)  #RandomState()固定随机值 使其可还原 rand(2,3)两行三列的数组
array([[-0.2767676 ,  0.581851  ,  2.14839926],
       [-1.279487  ,  0.50227689,  0.8560293 ]])

8.np.random.permutation(x)
洗牌

>>>np.random.permutation(np.arange(10))#洗牌
array([0, 5, 1, 3, 7, 8, 6, 9, 2, 4])

3.3C语言函数(变量)

1.局部变量
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。
关于局部变量的作用域还要说明以下几点:
1)主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。
2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。如在前例中,形参和实参的变量名都为n,是完全允许的。
4)在复合语句中也可定义变量,其作用域只在复合语句范围内。

2.全局变量
全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
3.根据长方体的长宽高求它的体积以及三个面的面积

#include <stdio.h>
int s1, s2, s3;  //面积
int vs(int a, int b, int c){
    int v;  //体积
    v = a * b * c;
    s1 = a * b;
    s2 = b * c;
    s3 = a * c;
    return v;
}
int main(){
    int v, length, width, height;
    printf("Input length, width and height: ");
    scanf("%d %d %d", &length, &width, &height);
    v = vs(length, width, height);
    printf("v=%d, s1=%d, s2=%d, s3=%d\n", v, s1, s2, s3);
    return 0;
}

利用下列公式编程计算三角形面积

提示:
(1)三角形边长a,b,c由键盘输入;
(2)若输入的a,b,c能构成三角形,则计算面积并输出(结果保留两位小数);
(3)若输入的a,b,c不能构成三角形,则重新输入一组a,b,c,转(2)。
要求:【样例输出1】Please input a,b,c:1,2,3
a=1,b=2,c=3 is not triangle.
Please input a,b,c again:1,1,1
area=0.43

#include<stdio.h>
#include<math.h>
//float a, b, c, s, ar, area; //递归调用,全局局部都可
int inp() {
	float a, b, c, s, ar, area;
	printf("Please input a,b,c:\n");
	scanf("%f%f%f", &a, &b, &c);
	s = (a + b + c) / 2, ar = (s - a) * (s - b) * (s - c), area = sqrt(s * ar);
	if (a < c + b && b < c + a && c < a + b) {
		printf("area=%.2f\n", area);
	}
	else {
		printf("a=%.0f,b=%.0f,c=%.0f is not triangle.\n", a, b, c);
		float are = inp();
	}
	return  area;
}
int main() {
	 inp();
}
发布了1 篇原创文章 · 获赞 4 · 访问量 54

猜你喜欢

转载自blog.csdn.net/weixin_45755332/article/details/105355481