机器学习概述
内容要点
- 什么是优化问题 optimization problem
- 动态规划 dynamic programming (coding)
- 梯度下降 gradient descent (coding)
- 什么是机器学习 machine learning
- 特征、模型和预测 feature、model、predicate
- 什么是向量距离 vector distance (coding)
- k-means聚类 (coding)
- 什么是监督性学习,无监督性学习。
一、从动态规划到机器学习
优化问题示例: 题目说明: 切木材的问题,木材长度与售价关系。木材可以切割来出售,给定木材长度,如何获取最大的收入。
from collections import defaultdict
from functools import lru_cache
# loading data
prices = [1, 5, 8, 9, 10, 17, 17, 20, 24, 30, 33]
length_to_price = defaultdict(int)
for i, p in enumerate(prices): length_to_price[i+1] = p
def revenue(n, cache={}, solution={}):
if n in cache: return cache[n], solution[n]
candidates = [ (length_to_price[n], (n, 0)) ]
for s in range(1, n):
split = ( revenue(s, cache, solution)[0] + revenue(n - s, cache, solution)[0], (s, n - s))
candidates.append(split)
# candidates.append(revenue(s, cache) + revenue(n - s, cache))
optimal, optimal_split = max(candidates, key=lambda x: x[0])
cache[n] = optimal
solution[n] = optimal_split
return optimal, solution
SOLUTION = {}
@lru_cache(maxsize=2**10)
def revenue_func_cache(n):
candidates = [(length_to_price[n], (n, 0))]
for s in range(1, n):
split = (revenue(s) + revenue(n - s), (s, n - s))
candidates.append(split)
# candidates.append(revenue(s, cache) + revenue(n - s, cache))
optimal, optimal_split = max(candidates, key=lambda x: x[0])
global SOLUTION
SOLUTION[n] = optimal_split
return optimal
def parse_solution(n, solution):
left, right = solution[n]
if left == 0 or right == 0: return [left, right]
else:
return parse_solution(left, solution) + parse_solution(right, solution)
r, s = revenue(118)
print(s)
print(r)
print(parse_solution(118, s))
print(parse_solution(8, s))
1.1 动态规划的要点
- 识别子问题 sub-problems dividing
- 识别子问题中的重叠特点 over-lapping sub-problem
- 存储子问题的答案 cache sub-solutions
- 合并问题答案 combine solutions
- 解析答案 parse solutions
二、机器学习
当出现下面的情况时,动态规划难以胜任。
- 限制条件极其多(成千上万)
- 问题分解及其复杂(难以识别子问题)
- 子问题插解教多(时间复杂度太多)
数据采用向量来表示,输入用向量,如果输出向量,是一个数字,该问题是Regression回归问题; 是 0-1 二分类(Binary Classification)问题,是多个值 与概率相关,称为多分类(Multiclass Classification)问题。
机器学习,我们将实际问题变成函数输入,机器能够找到一些关键参数,甚至函数的结构都可以找到。
2.1 机器学习通用框架。
监督学习:训练的时候有结果
非监督学习:训练的时候没有结果y, 根据数据的规律来处理。
2.2 监督学习举例
- 梯度下降: 梯度就是分别对每个变量进行微分,在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向。
- 损失函数: 用梯度下降的方法求损失函数的最小值。
代码示例: 求最小值的问题的代码实现, 对loss 函数求最小值,初始位置(10, 0.35),求出w 使得loss 函数最小。梯度下降求最值。
- Loss 函数的意义: 误差,真实值与预估值之间的差距,使用平方来表示,跟绝对值相比,差距越大的数值越大。
- 代码含义说明: 随机初始化一个w和b, 根据模型wx+b 得到预估值, 预估值与真实值计算出Loss, 然后用梯度下降的方法更新 w b,直到loss 满足条件。 由于当前只有一个观测数据,所以只求解了w。
import random
from icecream import ic
def loss(x, w, b, ys):
return ((w * x + b) - ys) ** 2
# 更新谁计算谁的梯度
def gradient(x, w, b, y):
# 对Loss 函数对w求偏导(梯度)
return 2 * (w * x + b - y) * x
w, b = random.randint(-10, 10), random.randint(-10, 10)
ic(w, b)
# 初始位置
x, y = 10, 0.35
# 设置微小变化量的大小
lr = 1e-3
for i in range(200):
x = x + -1 * gradient(x, w, b, y) * lr
ic(x)
ic(loss(x, w, b, y))
2.3 非监督学习举例
实际的问题:淘宝国际上经常有境外人员从国外销售违禁违法物品,国家要求这些东西全部下架,但是这些人员会更换物品的名字。例如枪支:狗子,如何识别这些暗语。
近朱者赤,近墨者黑。
代码实践案例
1 为中国省会设置能源中心
2 新闻自动进行归类
使用k-means 对新闻进行文本聚类。