ML笔记-Introduction

机器学习基础学习笔记

Table of Contents

1.基本概念

定义

从数据中寻找模式的问题有一个悠久并且成功的历史。16世纪,开普勒利用第谷多年积累的观测资料,仔细分析研究,发现了行星沿椭圆轨道运行,并且提出行星运动三定律。

模式识别或者说机器学习主要研究的内容是从数据中产生“模型”的算法,即“学习型算法”。我们把数据提供给它,它就能基于这些数据产生模型。

对于学习型算法有一个比较正式的定义: 假设用 P 来评估计算机程序在某类任务T上的性能,若一个程序通过利用经验 E T中任务上获得了性能的改善,则我们说关于 T P,该程序对 E 进行了学习。

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)监督学习的训练数据中每一个输入数据都有一个目标值与其对应。

训练集为: D={xn,tn}Nn=1

例如:分类和回归,下面是一个简单的分类样例

利用logistic分类器对iris数据进行分类。

模型: t=softmax(Wx+b)

其中softmax函数为: softmax(z)i=expzij=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 D维数据点 x 分为 K 个簇,直觉上我们会希望同一簇数据的数据点到该簇中心点的距离比其他簇数据点到该簇数据中心点的距离小。

更为正式化的定义为:

1)假设要将N D 维数据点x分为 K 个簇,首先对第k个簇引入该簇的中心向量 uk (其中 k=1,...,K )。

2)对于每一个数据点 xn 引入一个对应的二值指示变量 rnk{0,1} (其中 k=1,...,K ),表示数据点 xn 属于 K 个簇中的哪一个簇。如果xn属于簇 k rnk=1,并且对于 jk rnj=0

3)定义目标函数为:

J=n=1Nk=1Krnkxnuk22

表示每一个点到它对应的簇的中心 uk 的距离的平方和。目标是寻找值 {rnk} {uk} 使得 J 被最小化。

算法过程:

输入: D={x1,x2,...,xN}

聚类簇数: k

训练过程:

(1)初始化聚类中心uk

(2)重复直到收敛:

固定 uk ,调节参数 {rnk} ,最小化目标 J

rnk={10ifk=argminj=xnuj22otherwise.

固定 rnk uk 做优化,使得目标 J 最小:

uk=nrnkxnnrnk

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)

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值