机器学习提升之EM算法、推荐系统、SVM、ARIMA模型

一、EM算法

(1) EM算法流程

  1. 初始化分布参数
  2. E-step:根据参数计算每个样本属于某种类型的概率(Q)
  3. M-step:根据Q,求出含有参数的似然函数的下界并最大化它,得到新的参数
  4. 不断地迭代下去
    在这里插入图片描述

(2)GMM(高斯混合模型)基于EM算法的API模型

  1. 数据可以看作是从数个Gaussian Distribution 中生成出来的
  2. GMM由K个Gaussian分布组成,每个Gaussian称为一个“Component”
  3. 类似k-means方法,求解方式跟EM一样
  4. 不断的迭代更新下去

GMM模块API:from sklearn.mixture import GaussianMixture

实例流程

import pandas as pd
from matplotlib import pylab as p
from sklearn.decomposition import PCA
from sklearn.mixture import GaussianMixture

# 获取数据
data = pd.read_csv("D:/ProgramData/机器学习/数据/fremont-bridge.csv",index_col='Date',parse_dates=True)
data['Total'] = data['West']+data['East']
pivoted = data.pivot_table('Total',index = data.index.time,columns = data.index.date)
X = pivoted.fillna(0).T.values
# 降维,将原24维降到2维
x2 = PCA(2).fit_transform(X)

# GMM聚类
gmm = GaussianMixture(2)  # 可能存在2种分布
gmm.fit(X)
# labels = gmm.predict_proba(X)  # 预测所得两种分布的概率
# print(labels)
# 预测所属分布类型
labels = gmm.predict(X)

# 分类后画图
p.scatter(x2[:,0],x2[:,1],c=labels,cmap='rainbow')
p.show()

# 将两种分布分开
fig,ax = p.subplots(1,2,figsize=(14,6))
pivoted.T[labels==0].T.plot(legend=False,alpha=0.1,ax=ax[0])
pivoted.T[labels==1].T.plot(legend=False,alpha=0.1,ax=ax[1])

ax[0].set_title('Purple')
ax[1].set_title('Red')
p.show()

在这里插入图片描述
在这里插入图片描述

对比k-means聚类与GMM聚类:

# 获取数据
X,y_true = make_blobs(n_samples=800,centers=4,random_state=11)
rng = np.random.RandomState(13)
X_stretched = np.dot(X,rng.randn(2,2))

K-means算法:

# K-means聚类
kMeans = KMeans(n_clusters=4,random_state=1)
# random_state=1表示每次随机数的初始值是一致的
kMeans.fit(X_stretched)
y_means = kMeans.predict(X_stretched)
p.scatter(X_stretched[:,0],X_stretched[:,1],c=y_means,s=50,cmap='viridis')
# c=y_means表示赋予标签值,按照不同标签给不同颜色区分
# center = kMeans.cluster_centers_
p.show()

在这里插入图片描述

# GMM聚类
gmm = GaussianMixture(n_components=4)
gmm.fit(X_stretched)
y_gmm = gmm.predict(X_stretched)
p.scatter(X_stretched[:,0],X_stretched[:,1],c=y_gmm,s=50,cmap='viridis')
p.show()

在这里插入图片描述
可得:

(1)k-means根据数据间的举例来分类预测

(2)基于EM算法的GMM模块是根据方差和期望值来分类预测

二、推荐系统

(1)皮尔逊相关系数
在这里插入图片描述

(2)协同过滤

  1. 基于用户的协同过滤

在这里插入图片描述
在这里插入图片描述
基础解决方案:
(1)相似度计算用皮尔逊相似度
(2)考虑共同打分物品的数目
(3)对打分进行归一化处理
(4)设置一个相似度阈值
2. 基于物品的协同过滤
在这里插入图片描述
基于物品的协同过滤优势:
a。计算性能高,通常用户数量远大于物品数量
b。可预先计算保留,物品并不善变

对比两种协同过滤
在这里插入图片描述

(3)隐语义模型

模型概念:

  1. 从数据出发,进行个性化推荐
  2. 用户与物品之间有着隐含的联系
  3. 隐含因子让计算机能够理解
  4. 将用户和物品通过中介隐含因子联系起来

隐语义模型正负样本选择:

  1. 对每个用户,要保证正负样本的平衡(数目相似)
  2. 选取那些很热门,而用户却没有行为的物品
  3. 对于用户-物品集,正样本取1,负样本取0

隐语义模型参数选择:

  1. 隐特性的个数F,通常F=100
  2. 学习速率alpha,别太大(0-1)
  3. 正则化参数lambda,别太大
  4. 负样本/正样本比例ratio

协同过滤与隐语义:
在这里插入图片描述

评估标准:精确率、召回率、覆盖率、多样性

推荐系统常用库:surprise

其中算法:
(1)交叉验证

from surprise import SVD
from surprise import Dataset
from surprise.model_selection import cross_validate

# 下载数据信息
data = Dataset.load_builtin('ml-100k')

algo = SVD()

# Run 5-fold cross-validation and print results
cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)

在这里插入图片描述
介绍surprise库:https://surprise.readthedocs.io/en/stable/getting_started.html

三、SVM算法

(1)支持向量机(Support Vector Machine)

要解决的问题:
什么样的决策边界才是最好的?
特征数据本身如果很难分,该怎么办?
计算复杂度怎么样?能不能实际应用?

决策边界:选出离雷区最远的
在这里插入图片描述
优化目标:
在这里插入图片描述
数据标签定义:
在这里插入图片描述
优化的目标:
在这里插入图片描述
目标函数:
在这里插入图片描述
在这里插入图片描述
拉格朗日乘子法:
在这里插入图片描述

(2)SVM求解

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
SVM求解实例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分类:线性可分、线性不可分

使用核函数kernel(线性不可分) 意义:

  1. 将向量的维度从低维映射到高维

在这里插入图片描述

  1. 降低运算复杂度降低运算复杂度

举例使用svm:

sklearn.svm.

在这里插入图片描述

from sklearn import svm

# 数据
x = [[2, 0], [1, 1], [2, 3]]
# 标签
y = [0, 0, 1]
# 线性可分的svm分类器,用线性的核函数
clf = svm.SVC(kernel='linear')
"""
参数:
C=1.0, kernel='rbf', degree=3, gamma='scale',
coef0=0.0, shrinking=True, probability=False,
tol=1e-3, cache_size=200, class_weight=None,
verbose=False, max_iter=-1, decision_function_shape='ovr',
break_ties=False,
random_state=None
"""
# 训练
clf.fit(x, y)
print(clf)

# 获得支持向量
print(clf.support_vectors_)

# 获得支持向量点在原数据中的下标
print(clf.support_)

# 获得每个类支持向量的个数
print(clf.n_support_)

# 预测
print(clf.predict([[0,1]]))

输出结果:

SVC(kernel='linear')
[[1. 1.]
 [2. 3.]]
[1 2]
[1 1]
[0]

四、时间序列ARIMA模型

(1)平稳性

在这里插入图片描述
其中严平稳和弱平稳:
在这里插入图片描述
(2)差分法(增强平稳性)
在这里插入图片描述
(3)自回归模型(AR)
在这里插入图片描述
自回归模型的限制:
在这里插入图片描述
(4)移动平均模型(MA)
在这里插入图片描述
在这里插入图片描述
(5)ARIMA模型
在这里插入图片描述
(6)自相关函数ACF

在这里插入图片描述
(7)偏自相关函数(PACF)
在这里插入图片描述
(8)ARIMA(p,d,q)阶数确定:
在这里插入图片描述
在这里插入图片描述
(9)ARIMA建模流程:

  1. 将序列平稳(差分法确定d)
  2. p和q阶数的确定:ACF和PACF
  3. ARIMA(p,d,q)

(10)模型残差检验
在这里插入图片描述
用 ARIMA 进行时间序列预测流程from statsmodels.tsa.arima_model import ARIMA

  1. 获取数据

  2. 我们对非平稳时间序列进行时间序列的差分,找出适合的差分次数d的值

fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(111)
diff1 = data.diff(1)
diff1.plot(ax=ax1)

在这里插入图片描述

  1. 接下来我们要找到ARIMA模型中合适的p和q值:
  2. 第一步:先检查平稳序列的自相关图和偏自相关图
  3. 第二步:下面分别得到acf 图和pacf 图
fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(data1,lags=40,ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(data1, lags=40,ax=ax2)

在这里插入图片描述

  1. 第三步:找出最佳模型ARMA
  2. 第四步:进行模型检验,绘制QQ图
resid = arima_mod1.resid
fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(resid.values.squeeze(),lags=40,ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(resid, lags=40,ax=ax2)
fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111)
fig = qqplot(resid, line='q',ax=ax, fit=True)

在这里插入图片描述

  1. 第五步:平稳模型预测,对未来十年进行预测
  2. 第六步:使用ARIMA模型进行预测

在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值