机器学习|基础

Posted 奇葩星人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习|基础相关的知识,希望对你有一定的参考价值。

基础

这些笔记来自对MIT的6.036课程的学习。由于微信公众平台的诸多限制,这也会在个人博客中更新以及更正。静态博客可以“点击原文”查看。这门课中关于“机器学习”的导论部分我们暂且略去。首先介绍了什么是分类、以及误差。

分类

简而言之,分类就是将一个实数集合映射到一个二元集合: 。我们常常用h(hypothesis)来表示分类器,而现实生活中的变量x不一定是实数,因此做一些调整,分类的过程大概就是这样的,这里的x作为一个向量:

对于误差,有训练误差和测试误差,分别对于训练集和测试集。训练集是这样的:

那么训练误差则是:

测试误差则是:

线性分类器

线性分类器很简单,它把超平面割成两半,一半为+,一半为-:

其中 也均为向量。

而我们的“学习算法”就是要得到一个分类器h。课程介绍了一个十分简单且粗暴的算法——随机。随机选取 ,分别计算训练误差,选取最小的。而测试误差则用来评价“学习算法”。这里用这个“蠢”算法作为引子。

练习分为两个部分。一部分是关于超平面的复习,超平面有关的内容一般是线性代数的内容。练习中着重提了两点,一是超平面的单位法向量为 ,一是原点到超平面的距离(有符号)为 。另一部分是有关numpy的介绍:

import numpy as np
import math
# sets A to be a 2 \times 3 numpy array
A = np.array([[111], [111]])
# transpose
def tp(A):
    return A.T
# Let A be a 4\times 2 numpy array, B be a 4\times 3 array, and C be a 4\times 1 array.
# Mind the shape of the results of the following expressions.
C * C
np.dot(np.transpose(C), C)
D = np.array([1,2,3])
A[:,1]
A[:,1:2]
# row vector
def rv(value_list):
    return np.array([value_list])
# column vector
def cv(value_list):
    return rv(value_list).T
# length
def length(col_v):
    temp = np.dot(col_v.T,col_v)
    return math.sqrt(temp[0,0])
# normalize
def normalize(col_v):
    return col_v / length(col_v)
# return the final column
def index_final_col(A):
    return A[:,-1:]

此外在这一节的作业中也涉及了一些numpy的用法:

# np.sum with axis
np.sum(np.array([[1,1,1],[2,2,2]]), axis=1)
np.sum(np.array([[1,1,1],[2,2,2]]), axis=0)
# Comparing matrices of different dimensions
>>> A = np.array([[1,1,1],[2,2,2],[3,3,3]])
>>> B = np.array([[1,2,3]])
>>> A==B # The operation copies B three times row-wise
array([[ TrueFalseFalse],
       [False,  TrueFalse],
       [FalseFalse,  True]])
>>> A = np.array([[1,1,1],[2,2,2],[3,3,3]])
>>> B = np.array([[1,0,0],[2,2,0],[3,3,3]])
>>> np.sum(A==B, axis=1)
array([123])
# np.sign
np.sign(np.array([-3,0,5]))
# np.argmax
np.argmax(np.array([[1,2,3],[4,5,6]]))
# np.reshape
>>> A = np.array([[1,2,3],[4,5,6]])
>>> A.reshape((3,2)) # C-like index ordering
array([[12],
       [34],
       [56]])

这一节的作业主要是设计一个线性分类器的评价程序:

# 导入numpy
import numpy as np
# 计算点x(也可以是几个点)到th与th0定义的超平面的距离
def signed_dist(x, th, th0):
    return ((th.T@x) + th0) / length(th)
# 计算点x位于超平面的哪边,即分类
def positive(x, th, th0):
    return np.sign(np.dot(np.transpose(th), x) + th0)
# 分类的结果与labels进行比较并求和,得出得分
def score(data, labels, th, th0):
    return np.sum(positive(data, th, th0) == labels)
# 多个分类器下的score函数
def score_mat(data, labels, ths, th0s):
    pos = np.sign(np.dot(np.transpose(ths), data) + np.transpose(th0s))
    return np.sum(pos == labels, axis = 1, keepdims = True)
# 找到表现最好的分类器
def best_separator(data, labels, ths, th0s):
    best_index = np.argmax(score_mat(data, labels, ths, th0s))
    return cv(ths[:,best_index]), th0s[:,best_index:best_index+1]

以上是关于机器学习|基础的主要内容,如果未能解决你的问题,请参考以下文章

[vscode]--HTML代码片段(基础版,reactvuejquery)

《Python机器学习基础教程》中英文PDF及代码+原版+高清+穆勒+张亮

《机器学习实战》-机器学习基础

201555332盛照宗—网络对抗实验1—逆向与bof基础

机器学习—朴素贝叶斯

《Python机器学习及实践》----监督学习经典模型