机器学习基础学习笔记
Table of Contents
1.基本概念
定义
从数据中寻找模式的问题有一个悠久并且成功的历史。16世纪,开普勒利用第谷多年积累的观测资料,仔细分析研究,发现了行星沿椭圆轨道运行,并且提出行星运动三定律。
模式识别或者说机器学习主要研究的内容是从数据中产生“模型”的算法,即“学习型算法”。我们把数据提供给它,它就能基于这些数据产生模型。
对于学习型算法有一个比较正式的定义: 假设用
P
来评估计算机程序在某类任务
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from tensorflow.examples.tutorials.mnist import input_data
%matplotlib inline
数据集
(1)训练集:
从数据中学得某个模型的过程称为“学习”或“训练”,这个过程通过执行某个学习算法来完成。训练过程中使用的数据称为“训练数据”,其中每一个样本称为“训练样本”,训练样本组成的集合称为“训练集”。
(2)测试集:
在训练阶段学习了模型后,使用该模型对实际任务中新的样本进行“测试”,被预测的样本称为“测试样本”,由测试样本组成的集合称为测试集。学得的模型适用于新样本的能力称为“泛化”能力,具有强泛化能力的模型能够很好地适用于整个样本空间。
手写字符体数据集MNIST,由0-9共十类图片数字组成,图片的大小为(28x28x1),其中训练集有55,000张图片,验证集有5,000张图片,测试集有10,000张图片。
mnist = input_data.read_data_sets("MNIST_data/", one_hot=False)
X_batch, y_batch = mnist.train.next_batch(10)
fig = plt.figure()
gs = gridspec.GridSpec(1, 10)
gs.update(wspace=0.05, hspace=0.05)
for i, sample in enumerate(X_batch):
ax = plt.subplot(gs[i])
plt.axis('off')
ax.set_xticklabels([])
ax.set_yticklabels([])
ax.set_aspect('equal')
plt.imshow(sample.reshape(28, 28), cmap='Greys_r')
print(y_batch)
[out]: [1 7 0 4 9 4 4 9 8 4]
2.监督学习和无监督学习
1)监督学习的训练数据中每一个输入数据都有一个目标值与其对应。
训练集为:
例如:分类和回归,下面是一个简单的分类样例
利用logistic分类器对iris数据进行分类。
模型: t=softmax(Wx+b)
其中softmax函数为: softmax(z)i=expzi∑j=1Cexpzj
鸢尾花数据集(IRIS)说明
IRIS数据集是一个小型的分类实验数据集,由Fisher在1936年整理。在IRIS中包含150个数据,分为3类: Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),以及Iris Virginica(维吉尼亚鸢尾),每类由50个数据组成,每个数据包含有4个属性:Sepal.Length(花萼长度)、Sepal.Width(花萼宽度)、Petal.Length(花瓣长度)、Petal.Width(花瓣宽度)。其中Iris Setosa(山鸢尾)与Iris Versicolour(杂色鸢尾)和Iris Virginica(维吉尼亚鸢尾)是线性可分的,而Iris Versicolour(杂色鸢尾)与Iris Virginica(维吉尼亚鸢尾)线性不可分。
对IRIS的分类是一个三分类问题,训练数据的目标值采用one-hot编码。
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from matplotlib.colors import ListedColormap
iris = datasets.load_iris()
sc = StandardScaler()
# 选择输入数据中的两维数据,为了便于可视化
X = iris.data[:, [2, 3]]
y = iris.target
# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
print("训练集个数: ", y_train.shape[0])
print("测试集个数: ", y_test.shape[0])
# 对数据做标准化
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
X_combined_std = np.vstack((X_train_std, X_test_std))
y_combined = np.hstack((y_train, y_test))
# 建立logistic模型,其中参数C为正则化系数的倒数,默认采用L2范数正则化,random_state用于设定随机seed
logstic_regression = LogisticRegression(C=1000.0, random_state=0)
logstic_regression.fit(X_train_std, y_train)
[out]: 训练集个数: 105, 测试集个数: 45
i) 依据训练结果绘制决策边界:
markers = ('s', 'x', 'o', '^', 'v')
colors = ('red', 'blue', 'green', 'gray', 'cyan')
cmap = ListedColormap(colors[:len(np.unique(y))])
x1_min, x1_max = X_combined_std[:, 0].min() - 1, X_combined_std[:, 0].max() + 1
x2_min, x2_max = X_combined_std[:, 1].min() - 1, X_combined_std[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.02), np.arange(x2_min, x2_max, 0.02))
Z = logstic_regression.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
Z = Z.reshape(xx1.shape)
plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
plt.xlim(xx1.min(), xx1.max())
plt.ylim(xx2.min(), xx2.max())
# 训练集数据的分类
for idx, cl in enumerate(np.unique(y_combined)):
plt.scatter(x=X_combined_std[y_combined == cl, 0], y=X_combined_std[y_combined == cl, 1],
alpha=0.8, c=cmap(idx),marker=markers[idx], label=cl)
plt.legend(loc='upper left')
ii) 测试数据的分类结果(Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),以及Iris Virginica(维吉尼亚鸢尾))
test_idx = range(105,150)
X_test, y_test = X_combined_std[test_idx, :], y_combined[test_idx]
plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
plt.xlim(xx1.min(), xx1.max())
plt.ylim(xx2.min(), xx2.max())
for idx, cl in enumerate(np.unique(y_test)):
plt.scatter(x=X_test[y_test == cl, 0], y=X_test[y_test == cl, 1],alpha=0.8, c=cmap(idx),marker=markers[idx], label=cl)
plt.legend(loc='upper left')
2)无监督学习的训练数据只有输入向量,没有对应的标签
训练集为: D={xn}Nn=1
聚类算法、密度估计以及数据可视化的一些算法属于无监督学习算法。
k-means算法(聚类算法):
k-means算法是经典的聚类算法,基本想法是:如果我们想把
N
个
更为正式化的定义为:
1)假设要将
2)对于每一个数据点
xn
引入一个对应的二值指示变量
rnk∈{0,1}
(其中
k=1,...,K
),表示数据点
xn
属于
K
个簇中的哪一个簇。如果
3)定义目标函数为:
J=∑n=1N∑k=1Krnk∥xn−uk∥22
表示每一个点到它对应的簇的中心 uk 的距离的平方和。目标是寻找值 {rnk} 和 {uk} 使得 J 被最小化。
算法过程:
输入:
聚类簇数: k
训练过程:
(1)初始化聚类中心
(2)重复直到收敛:
固定 uk ,调节参数 {rnk} ,最小化目标 J :
固定 rnk 对 uk 做优化,使得目标 J 最小:
uk=∑nrnkxn∑nrnk
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
np.random.seed(0)
n_samples = 1500
random_state = 1
X, y = make_blobs(n_samples=n_samples, random_state=random_state)
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1])
聚类后
plt.scatter(X[:, 0], X[:, 1], c=y_pred)