博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初识推荐系统
阅读量:5789 次
发布时间:2019-06-18

本文共 2557 字,大约阅读时间需要 8 分钟。

本文摘录了大量 机器学习算法原理与编程实践_郑捷著_电子工业出版社 的原文。

源码:

推荐系统是一种信息过滤系统,用于预测用户对物品的「评分」或「偏好」。

精彩推荐:

存在问题(背景)

  • 关键词的信息量不足,基于关键词的检索在很多情况下不能精准和深刻地反映用户的潜在需求;
  • 通用的搜索引擎只有而且必须对用户提供尽量丰富而无差别的信息,这样才能应对不同种类的需求,以及需求的变换。

因此,如何平衡搜索的广度与深度(精准程度)是推荐系统所要解决的主要问题。

推荐系统着眼于需求二字:

  • 需求的定位;
  • 需求的个性化;
  • 需求的模糊性衍生。

推荐系统的应用

  • 把包销售:经常一起购买的产品;
  • 协同过滤:购买了此产品的顾客同时也购买的产品;(除了促销之外,也可以帮助用户定位购买需求)
  • 用户的商品评论列表。

推荐系统通过研究用户的兴趣偏好,由智能算法进行个性化的计算,发现用户的潜在兴趣点,从而引导用户发现需求。

推荐系统的架构

img_bbd4e5d881b178c0429992aad3a288b0.png

捕获.PNG-233.8kB

捕获1.PNG-512.6kB

前两种方法较为简单,应用也不广泛。

协同过滤(Collaborative Filtering,CF)

推荐模型:

  • 基于用户的推荐技术:找到具有相似品味的人所喜欢的物品——User CF;
  • 基于物品的推荐技术:从一个人喜欢的物品中找出相似的物品——Item CF。

数据预处理

img_8310efd2fd3769d6567ff4aa1191991b.png

预处理策略:

  • 减噪
  • 归一化
  • 聚类(缩减计算量)

使用 Scikit-Learn 的 KMeans 聚类

img_93c2efc1137156e2dc956e9952a3342b.png

KMeans 的基本原理

给定要划分的数目 \(k\)

  • 首先创建一个初始划分,随机选择 \(k\) 个对象,每个对象初始地代表了一个聚类中心。对于其他对象,根据其与各个聚类中心的距离,将它们赋给最近的簇。
  • 然后采用一种迭代的重定位技术,尝试通过对象在划分的簇之间移动来改进划分,直到聚类中心不发生变化为止。
    • 重定位技术:就是当有新的对象加入到簇中或已有对象离开簇时,重新计算聚类的平均值(作为聚类中心),然后对对象进行重新分配。
import os import pandas as pdimport syssys.path.append('E:/xinlib')import chaosroot = 'D:/MLBook' + '/chapter04/testdata'os.listdir(root)
['4k2_far.txt', 'figure_0.png', 'figure_1.png', 'figure_2.png', 'figure_3.png', 'testSet.txt']

File2Table 的使用参考:

T = chaos.File2Table(root)for p in T.to_pandas('\t'):    break
p.head()
0 1 2
0 1 2.7266 3.0102
1 1 3.1304 2.4673
2 1 3.0492 2.525
3 1 3.226 3.1649
4 1 2.7223 2.5713

参考特征列的数据类型转换方法。

p.dtypes
0    object1    object2    objectdtype: object
p[[1, 2]] = p[[1, 2]].astype(float)p[[0]] = p[[0]].astype(int)p.dtypes
0      int321    float642    float64dtype: object
from sklearn.cluster import KMeansfrom pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题%pylab inline
Populating the interactive namespace from numpy and matplotlib
k = len(set(p[0]))M = p[[1, 2]]kmeans = KMeans(init='k-means++', n_clusters=k)kmeans.fit(M)
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,    n_clusters=4, n_init=10, n_jobs=1, precompute_distances='auto',    random_state=None, tol=0.0001, verbose=0)
ax = p.plot.scatter(x=1, y=0, color='DarkRed', label='feture1')# 将之下这个 data 画在上一个 ax 上面p.plot.scatter(x=2, y=0, color='LightGreen', label='feture2', ax=ax)plt.show()

output_9_0.png-8.5kB

cluster_centers = pd.DataFrame(kmeans.cluster_centers_, columns=['cluster_centers_1', 'cluster_centers_2'])cluster_centers
cluster_centers_1 cluster_centers_2
0 3.022117 6.007702
1 8.081695 7.975067
2 2.958321 2.985985
3 6.994380 5.054563
ax = p.plot.scatter(x=1, y=2, color='DarkBlue', label='数据', s=20)cluster_centers.plot.scatter(x='cluster_centers_1', y='cluster_centers_2', color='LightGreen', label='聚类中心', ax=ax, s=70)plt.show()

output_11_0.png-18.3kB

探寻有趣之事!

转载地址:http://edqyx.baihongyu.com/

你可能感兴趣的文章
miniUI mini-monthpicker ie8兼容性问题
查看>>
读书笔记《自控力》
查看>>
基于神念TGAM的脑波小车(1)
查看>>
ceph集群搭建Jewel版本
查看>>
HttpClient 解释
查看>>
111111
查看>>
在Button上面显示图片,去掉Button的默认样式
查看>>
区域生长算法
查看>>
(转)json+flexgrid+jbox组合运用页面刷新<jsp>
查看>>
hive学习2(Navicat连接hive)
查看>>
getResourceAsStream的3种路径配置
查看>>
switch语句小练习
查看>>
组合逻辑电路
查看>>
POP-一个点击带有放大还原的动画效果
查看>>
9款极具创意的HTML5/CSS3进度条动画
查看>>
uboot在s3c2440上的移植(1)
查看>>
个人阅读作业2
查看>>
UE4材质是什么样的机制
查看>>
使用QTP录制自带Flight小实例
查看>>
JProfiler学习笔记
查看>>