机器学习|基础
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([[1, 1, 1], [1, 1, 1]])
# 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([[ True, False, False],
[False, True, False],
[False, False, 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([1, 2, 3])
# 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([[1, 2],
[3, 4],
[5, 6]])
这一节的作业主要是设计一个线性分类器的评价程序:
# 导入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)