使用高斯混合模型识别餐厅热点

使用 GMM 识别加拿大多伦多的直观餐厅集群(附 Python 代码)

聚类算法(例如 GMM)是一种有用的工具,可帮助识别数据中的模式。它们使我们能够识别数据集中的子组,从而提高你的理解或增强预测模型。在本文中,借助 GMM,我们将尝试使用位置数据识别多伦多的餐厅集群。目标是找到在地理上合理但在其他特征(例如餐厅评级)方面具有不同特征的集群。我们将讨论关键代码,你可以在GitHub1上找到完整的项目。

在这里插入图片描述

什么是 GMM

如上所述,GMM 是一种聚类算法。这意味着它可用于根据特征对数据集中的元素进行分组。例如,假设我们有一个客户收入和年龄的数据集。聚类算法可以识别 4 个组:老年高收入者、老年低收入者、年轻高收入者和年轻低收入者。这 4 个群体可能具有非常不同的特征/行为。我们不会详细介绍 GMM 如何创建这些聚类,因为有很多很好的资料来源23。重要的是为什么我们要使用 GMM 而不是其他聚类算法(例如 K-means)。

对于我们的问题,GMM 最重要的优势是它在聚类方差和协方差方面更加灵活。首先,更大的方差灵活性意味着 GMM 可以更好地识别方差不等的聚类。换句话说,当我们既有密集的聚类又有分散的聚类时,它将产生更好的结果。我们可以在下面的图 1 中看到这一点,其中我们将 K-means 和 GMM 应用于一些测试数据。这里每个点的颜色由相关算法分配的聚类决定。在这种情况下,GMM 聚类似乎更合适。

图1:不同方差的聚类算法比较

其次,协方差灵活性越高,我们就能识别出更细长/椭圆形的簇。相比之下,K 均值只能真正识别球形簇。我们可以在图 2 中看到这一点,GMM 簇再次更合适。当我们将 GMM 的这些属性应用于我们的餐厅数据集时,我们就会明白为什么它们如此重要。最终,它将使我们能够找到更有趣的簇。

图2:非球形聚类算法比较

数据集

为了训练 GMM,我们将使用 Yelp 开放数据集4餐馆的大量信息。我们对其进行了预处理,以便获得多伦多每家餐馆的名称、纬度和经度。我们还包括评论数量(review_count)和餐馆评级(星级),稍后将用于分析聚类。其他特征(例如餐馆的街区和类别)已被排除。我们使用下面的代码读取数据集,我们可以在表 1 中看到一个示例。

import pandas as pddata = pd.read_csv(data_path + "/yelp_data/toronto_restaurant.csv",usecols=['name','latitude','longitude','stars','review_count'])
print(len(data))
data.head()---
7148name	latitude	longitude	review_count	stars
0	Alize Catering	43.71140	-79.39934	12	3.0
1	Chula Taberna Mexicana	43.66926	-79.33590	39	3.5
2	Sunnyside Grill	43.78182	-79.49043	3	5.0
3	Bampot House of Tea & Board Games	43.66158	-79.40888	55	4.0
4	Thai Express	43.77488	-79.49462	5	3.0

在这里插入图片描述

在图 3 中,我们用经纬度标出了所有餐厅。每个点代表一家餐厅,总共有 7148 多家餐厅。餐厅的位置可以告诉我们一些信息。例如,某些位置的餐厅可能评级较高。因此,我们可能能够在试图预测餐厅评级等信息的模型中使用位置。但是,仅输入原始的经纬度数据可能不会给我们带来好的结果——尤其是在使用线性模型的情况下。这意味着我们必须对经纬度特征执行某种形式的特征工程。

在这里插入图片描述

在某些方面,考虑到我们有餐厅社区,这已经完成了。换句话说,餐厅已经根据其纬度和经度被分组为集群(即社区)。问题是多伦多有 71 个不同的社区,需要估计很多系数。你可能可以根据某些社区的特点将它们分组在一起,但这需要多伦多餐厅领域的专业知识。我们将尝试一种替代方法,即使用 GMM 对餐厅进行分组。

拟合 GMM

在下面的 Python 函数的第一部分中,我们训练 GMM。GMM 的一个问题是它们会收敛到局部最优点。为了避免这种情况,我们将“n_init”参数设置为 5。这将随机初始化和训练 5 个 GMM,最后,我们将最佳模型作为最终模型。我们使用此模型获得每家餐厅的标签/预测。然后,如图 3 所示,我们绘制餐厅,但这次我们根据 GMM 标签分配颜色。

import sklearn.mixture as sm
import matplotlib.pyplot as plt
%matplotlib inlinedef plot_gmm(n):"""Train a GMM and plot the resultsParameters----------n : intNumber of clusters"""#Fit gmm and get labelsx = data[['longitude','latitude']].valuesgmm = sm.GaussianMixture(n_components=n, random_state=11,n_init=5)labels = gmm.fit(x).predict(x)#assign a colour to each labelcolour = ['#f54242','#4287f5','#f59942','#f5f242','#69f542','#b342f5']c = [colour[l] for l in labels]#scatter plotplt.figure(figsize=(20, 12))plt.scatter(x=x[:, 0], y=x[:, 1], c=c, s=40, cmap='Set1', zorder=1)plt.title('Number of Clusters: {}'.format(n),size=25)plt.xlabel('Longitude',size=20)plt.ylabel('Latitude',size=20)plot_gmm(5)

你可能已经注意到,此函数采用一个参数 — 聚类数。这被视为 GMM 的超参数,我们必须选择它。如果我们决定使用过多的聚类,模型将过度拟合数据。这意味着我们将识别出没有意义的聚类或拆分更适合集中在一起的聚类。如果我们决定使用过少的聚类,模型可能会对数据产生欠拟合。这意味着我们可能会错过一些重要的聚类。问题是我们如何决定聚类的数量?

有几种不同的方法可以帮助确定适当的聚类数量。这些方法包括使用轮廓分数或模型 BIC 值^4。这些只是有用的指导方针,不一定能为你提供最佳的聚类数量。由于我们仅使用 2 个特征来训练我们的 GMM,因此我们可以轻松地可视化结果并了解聚类是否合适。例如,如图 5 所示,我们使用上面的 Python 函数绘制具有 5 个聚类的 GMM 的结果。

在这里插入图片描述

GMM 已识别出一些有趣的聚类。例如,蓝色聚类似乎非常密集,附近有许多餐馆。长红色聚类似乎是一条道路。在图 6 中,我们分别使用 4 个和 6 个聚类看到了类似的图。在这两种情况下,我们都看到 GMM 已识别出与图 5 中类似的聚类。所以,让我们继续使用 5 个聚类。我们可以进一步分析它们,以更好地了解它们是否合适。

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

分析集群

如果我们看一下多伦多的地图,我们可以更好地理解这些集群。我们使用下面的代码来做到这一点。首先,我们从具有 5 个集群的 GMM 中获取标签。然后我们创建一个以多伦多为中心的叶状图。最后,我们将每个点叠加在地图上。像以前一样,每个点的颜色由其标签决定。我们可以在图 7 中看到这个过程的结果。

import folium#Get gmm predictions
x = data[['longitude','latitude']].values
gmm = sm.GaussianMixture(n_components=5, random_state=11,n_init=5)
labels = gmm.fit(x).predict(x)#create folium map 
m = folium.Map(location=[43.77923, -79.41731999999998],zoom_start=12,tiles='Stamen Terrain'
)colour = ['#f54242','#4287f5','#f59942','#f5f242','#69f542','#b342f5']#add markers to map 
for i in range(len(x)):lon = x[i][0]lat = x[i][1]label = labels[i]#assign colour based on label c = colour[label]#add markerfolium.CircleMarker(location=[lat,lon],radius=2,color=c,fill_color=c).add_to(m) #display map
m

看一看地图,这些聚类开始变得更有意义了。蓝色和绿色聚类位于多伦多港周围人口更密集的城市地区。这些聚类大致被一条高速公路隔开,这似乎是划分餐厅群体的相当自然的方式。黄色和橙色聚类密度较低,它们由郊区的餐厅组成。长长的红色聚类特别有趣。几乎所有这些点都落在央街上。快速搜索显示,这实际上是多伦多最著名的街道。考虑到这一点,将这些餐厅归入自己的组是有意义的。

在这里插入图片描述

这些聚类并不完美。有一些不规则的红点可能适合成为蓝色聚类的一部分。同样,高速公路右侧的一些蓝点可能应该属于绿色聚类。在很大程度上,GMM 已经识别出在地理上有意义的聚类。我们可以预期它们具有不同的特征,但事实并非如此。

我们可以通过考虑餐厅的评论和评分来研究这些特征。在表 2 中,我们可以看到每个集群中餐厅的平均评论数量。我们看到蓝色集群中的评论数量往往更高。事实上,平均评论数量是黄色和橙色集群的两倍多。这可能是有道理的,因为我们可以预期密集地区的餐厅会有更多的顾客。

在这里插入图片描述

我们还可以看到平均评分和至少有 4 星评分的餐厅百分比(高评分百分比)。绿色集群中的餐厅平均评分最高,高评分餐厅比例最高。也许这是多伦多一个更高档的地区?同样在评分方面,两个郊区集群(黄色和橙色)往往相差很大。

这只是我们可以用来比较聚类的两个特征。我们可以一直分析下去。归根结底,聚类的适用性取决于你想用它们做什么。一般的想法是,也许经过一些微调后,你可以用它的聚类来标记每家餐厅,并将其用作分析或模型中的一个特征。你也可以使用这些聚类作为类似地理标签的起点。

参考


「AI秘籍」系列课程:

  • 人工智能应用数学基础
  • 人工智能Python基础
  • 人工智能基础核心知识
  • 人工智能BI核心知识
  • 人工智能CV核心知识

  1. 茶桁的公开文章代码库:https://github.com/hivandu/public_articles ↩︎

  2. Cory Maklin (2019), Mixture Models Clustering Algorithm Explained (2019), https://towardsdatascience.com/gaussian-mixture-models-d13a5e915c8e ↩︎

  3. Ribhu Nirek, Gaussian Mixture Models (2020), https://towardsdatascience.com/gaussian-mixture-models-gmm-6e95cbc38e6e ↩︎

  4. Yelp, Yelp open dataset (2019), https://www.yelp.com/dataset ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DDR3(一)

目录 1 SDRAM1.1 同步动态随机存储器1.2 位宽1.3 SDRAM结构1.4 SDRAM引脚图 2 SDRAM操作指令2.1 读写指令2.2 刷新和预充电2.3 配置模式寄存器2.4 读/写突发2.5 数据屏蔽 SDRAM是DDR3的基础,在学习DDR3之前,我们先来学习一下SDRAM的相关知识。 1 SDRAM …

同样的APP为何在Android 8以后网络感觉变卡?

前言 在无线网络技术不断发展的今天,Wi-Fi已经成为了我们日常生活中不可或缺的一部分。无论是家庭娱乐、办公还是在线游戏,Wi-Fi都在提供着便捷的互联网接入服务。然而,在安卓8.1后,为了进一步延长安卓设备的待机时间。原生安卓(A…

推荐三款常用接口测试工具!

接口测试是软件开发中至关重要的一环,通过对应用程序接口进行测试,可以验证其功能、性能和稳定性。随着互联网和移动应用的快速发展,接口测试变得越来越重要。为了提高测试效率和质量,开发人员和测试人员需要使用专业的接口测试工…

【SCAU操作系统】期末复习简答及计算题例题解析

目录 一、写出下列英文缩写词在计算机系统中的英文或中文全名。 二、进程状态/调度/周转问题 (1)进程状态 (2)进程状态转换 (3)进程调度 (4)最短进程优先调度算法 三、逻辑地…

鸿蒙开发设备管理:【@ohos.runningLock (Runninglock锁)】

Runninglock锁 该模块主要提供Runninglock锁相关操作的接口,包括创建、查询、持锁、释放锁等操作。 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import runningLock f…

经典资料分享:macOS设计指南(持续更新)

​MacOS设计指南是Mac应用设计必备的指导手册,学姐特提示完整指南文档给大家,原版中英文对照,实用方便查询。 因为文档内容太多,在后继的几个月会持续更新。本周更新内容为: 『MacOS设计指南-应用程序架构篇』 指南内容…

Vuex的基本使用

1.安装vuex npm i vuex3 2.引入 import Vuex from vuex 3.使用 Vue.use(Vuex) 4.在src下的目录创建store,新建index.js import store from ./store 5.编写index.js import Vue from vue import Vuex from vuex Vue.use(Vuex)//用于操作组件中的动作 const actions{a…

零知识学习之DPDK与RDMA(3)—— 认识DPDK(3)

接前一篇文章:零知识学习之DPDK与RDMA(2)—— 认识DPDK(2) 本文内容参考: 《Linux高性能网络详解 从DPDK、RDMA到XDP》 刘伟著 人民邮电出版社 https://blog.51cto.com/u_15301988/5181201 特此致谢&…

Shell Expect自动化交互(示例)

Shell Expect自动化交互 日常linux运维时,经常需要远程登录到服务器,登录过程中需要交互的过程,可能需要输入yes/no等信息,所以就用到expect来实现交互。 关键语法 ❶[#!/usr/bin/expect] 这一行告诉操…

昇思MindSpore学习笔记3-02热门LLM及其他AI应用--K近邻算法实现红酒聚类

摘要: 介绍了K近邻算法,记录了MindSporeAI框架使用部分wine数据集进行KNN实验的步聚和方法。包括环境准备、下载红酒数据集、加载数据和预处理、搭建模型、进行预测等。 一、KNN概念 1. K近邻算法K-Nearest-Neighbor(KNN) 用于分类和回归的非参数统计…

计算机网络部分知识点整理

停止等待协议的窗口尺寸为 1。 √以太网标准是IEEE802.3TCP/IP四层,OSI模型有7层,地址解析协议 ARP 在 OSI 参考七层协议属于数据链路层,在TCP/IP 协议属于网络层,ARP作用:将 IP 地址映射到第二层地址,交换…

Spring中使用FactoryBean配置注入Bean

spring通过FactoryBean配置可以将第三方框架整合到Spring中来,FactoryBean配置如下: 写一个用于注于的实体类,如User,并对这个类写一个实现FactoryBean的中间类(UserFactoryBean) User类 /** *Description: *author…

粒子扩展卡尔曼滤波|MATLAB代码

粒子滤波PF与扩展卡尔曼滤波EKF结合 下载链接:https://download.csdn.net/download/callmeup/89512392 粒子滤波 粒子滤波是一种用于估计状态变量的非线性滤波方法。它通过引入一组粒子来近似表示概率分布,从而利用蒙特卡洛方法进行状态估计。粒子滤波的主要思想是根据系统…

什么是带有 API 网关的代理?

带有 API 网关的代理服务显著提升了用户体验和性能。特别是对于那些使用需要频繁创建和轮换代理的工具的用户来说,使用 API 可以节省大量时间并提高效率。 了解 API API,即应用程序编程接口,是服务提供商和用户之间的连接网关。通过 API 连接…

昂科烧录器支持MindMotion灵动微电子的32位微控制器MM32L052NT

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表,其中MindMotion灵动微电子的32位微控制器MM32L052NT已经被昂科的通用烧录平台AP8000所支持。 MM32L052NT使用高性能的ARM Cortex-M0为内核的32位微控制器,最高工作频率…

Revit 专业实用的BIM模型设计软件下载安装,Revit 最新版下载安装

Revit,该软件是专门为建筑信息模型(BIM)量身打造的,不仅极大提升了建筑设计师的工作效率,更为他们创造了一个更加精确、高效的设计环境。 在Revit的助力下,建筑设计师们能够轻松地进行建筑建模&#xff0c…

Maven列出所有的依赖树

在 IntelliJ IDEA 中,你可以使用 Maven 插件来列出项目的依赖树。Maven 插件提供了一个名为dependency:tree的目标,可以帮助你获取项目的依赖树详细信息。 要列出项目的依赖树,可以执行以下步骤: 打开 IntelliJ IDEA,…

U盘非安全拔出后的格式化危机与数据拯救策略

在数字化时代,U盘作为便捷的数据携带工具,其重要性不言而喻。然而,许多用户在日常使用中往往忽视了安全退出的重要性,直接拔出U盘后再插入时可能会遭遇“需要格式化”的提示,这一状况不仅令人措手不及,更可…

备忘:PythonREPL中py_repl.run方法执行报错和修改方法

PythonREPL是python提供的 “Read–Eval–Print Loop”(读取-求值-打印-循环)的缩写,它是一种简单的、交互式的编程环境,我们之前在用AI生成代码后执行就使用这个方法,例如 def py_repl_tool(self, realcode: str):py…

linux下OpenSSL升级到1.1以上版本

要将CentOS 7上的OpenSSL升级到1.1以上版本,您需要遵循以下步骤。请注意,这些步骤可能需要一些系统管理经验,因为您将从源代码编译和安装OpenSSL。 1. 更新系统软件包 首先,确保您的系统软件包是最新的。使用以下命令更新所有软…