TowardsDataScience 博客中文翻译 2019(三百八十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

H-1B 签证分析-R 闪亮的情节视觉效果

原文:https://towardsdatascience.com/plotly-with-r-shiny-495f19f4aba3?source=collection_archive---------7-----------------------

国际学生在美国找工作指南

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Andrew Neel on Unsplash

大约一个月前,我在某一周安排了三次电话面试。由于我的美国签证身份,他们都以我的申请“没有进一步发展”而告终。其中一次对话持续了不到 60 秒,因为他们问的第一个问题是我现在或将来是否需要签证担保,仅此而已。采访到此结束。

是的,臭名昭著的 H-1B 签证,它让美国公司可以临时雇佣外国人才长达 6 年。雇主必须代表雇员向 USCIS 提出申请,USCIS 的批准使雇员有资格在美国工作。可以理解的是,由于频繁的法律变更和不确定性,雇主们正变得不愿意雇佣将来需要签证担保的人。

很多和我一样的留学生都因为这个原因觉得找工作很难。作为一名有抱负的数据科学家,我决定分析美国公民及移民服务局数据中心的公开数据。数据的详细描述可在这里获得。

我使用 R 中的*‘plotly’包来创建交互式图形,并最终使用‘R Shiny’*开发了一个 web 应用。本文末尾详细描述了如何使用该应用程序并以交互方式浏览这些数据。目的是让求职更有针对性,这个应用程序对所有和我处境相同的国际学生都有用。

注意:我想把这篇文章的重点放在描述性报告上,因此我省略了帖子中的一些代码。然而,所有这些都可以在 Github 上找到。本帖中的图表是静态的,但你可以在网络应用中与它们互动。

以下是我发现的一些见解:

1B 签证拒签率上升了吗?

是的,他们有。当我们在下图中查看批准和拒签的总数时,我们意识到,自 2015 年以来,签证批准数量在减少,而拒签数量在增加。在接下来的章节中,我们将更深入地研究批准和拒绝的数量,并从地理、行业、组织等不同角度进行分析。

## Code for plotly chart of total approvals and denialsrequire(tidyverse)
require(plotly)
output$plot1 <- renderPlotly({
 Data %>%
 group_by(Year) %>%
 summarize(Approvals = sum(Initial_Approvals), Denials = sum(Initial_Denials), C_Approvals = sum(Continuing_Approvals), C_Denials = sum(Continuing_Denials)) %>%
 plot_ly(x = ~Year, y = ~Approvals, type = “scatter”, mode = “lines”, color = I(‘dark green’), name = “Approvals”) %>%
 add_trace(x = ~Year, y = ~Denials, type = “scatter”, mode = “lines”, color = I(‘red’), name = “Denials”) %>%
 layout(title = “H-1B Visas by Year”,
 xaxis = list(title = “Year”),
 yaxis = list(title = “Count”))
 })

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Total Visa Approvals And Denials Since 2009

地理分析

作为国际学生,你最有可能在哪些城市/州找到职业机会?

我想考察一下这个国家哪些地区的签证批准率最高,这也意味着国际学生有更多的机会。此外,由于许多公司更喜欢“本地”候选人,我正在考虑是否应该搬到这些城市中的任何一个。所以,我调查了过去两年签证批准数量最多的州和城市;特别是最近两年,我们目睹了这一时期的急剧下降。您可以在应用程序中选择想要查看的年份,并进行更深入的分析。

加利福尼亚州是签证批准数量最多的州。这并不奇怪,因为加州是美国大陆最大的州之一,硅谷和几个主要科技中心城市经常招聘人才。以不到加州一半的支持率,纽约、新泽西和德克萨斯分别位居第二、第三和第四。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Top states with highest H-1B visa approvals in the last two years

就城市而言,我发现纽约市是过去两年中签证批准数量最多的热点城市。紧随纽约之后的分别是芝加哥、旧金山和波士顿。

# Plot of top cities for shiny serverrequire(plotly)
require(ggmap)#geo styling for plot
g <- list(
 scope = ‘usa’,
 showland = TRUE,
 landcolor = toRGB(‘light gray’),
 projection = list(type = ‘albers usa’),
 showlakes = TRUE,
 lakecolor = toRGB(‘white’)
 )

 output$cities <- renderPlotly({
 Data %>%
 filter(Year %in% input$Year) %>%
 group_by(City) %>%
 summarize(Approvals = sum(Initial_Approvals), Denials = sum(Initial_Denials),
 C_Approvals = sum(Continuing_Approvals), C_Denials = sum(Continuing_Denials)) %>%
 arrange(desc(Approvals)) %>%
 top_n(50, Approvals) %>%
 left_join(coords_cities, by=”City”) %>%
 plot_geo(lat = ~lat, lon = ~lon, color = ~Approvals, size=~(Approvals)) %>%
 add_markers(hovertext = ~(paste(“City:”, City, “\nNo. of Approvals:”, Approvals))) %>%
 layout(title = ‘Top cities with H-1B Visa approvals in the selected Years’, geo=g)
 })

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Top cities with highest H-1B approvals in the last two years

哪些行业受影响最大?

当我们在下图中查看拒签率时,我们注意到 2018 年签证拒签率全面上升。拒签率是以拒签占全部申请的百分比来计算的。

教育服务行业受影响最小,总体拒绝率最低。教育行业免除每年 85,000 份 H-1B 认证或许是一种解释。

高等教育机构、与高等教育机构相关或附属的非营利组织、非营利研究组织和政府研究组织不受 H-1B 年度配额的限制。

# Code for denial rate plot
 output$dept_denial <- renderPlotly({
 plot_ly(Dept_Data, x = ~Year, y=~Denial_Rate, color =~Dept_Name, type=’scatter’, mode = ‘line’) %>%
 layout(title = “H-1B Visas Denial Rate by Department”,
 xaxis = list(title = “Year”),
 yaxis = list(range = c(0,50), title = “% Denials”))
 })

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Denial Rates For The Departments

当考虑批准总数时,“专业和技术服务”行业占主导地位,占批准总数的 50%以上。虽然,自 2015 年以来,这个行业的批准已经下降,并稳步下降。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Number of approvals per department

瞄准哪些雇主?

这是最有趣的部分。平均而言,我个人在每份工作申请上花费大约 5-10 分钟。我不想在向一家雇主申请工作时,却听到他们告诉我,他们不考虑国际学生或“现在或将来需要担保”的申请人。

你可以在应用程序中查找任何雇主,以查看这些年来他们赞助了多少候选人的详细信息。对于分析部分,我决定寻找排名靠前的雇主,比如在过去两年中支持率最高的雇主。

#Code for employer wordcloudrequire(wordcloud2)
employer_wc <- Data %>%
 filter(Year > 2017) %>%
 group_by(Employer) %>%
 summarize(Approvals = sum(Initial_Approvals), Denials = sum(Initial_Denials), C_Approvals = sum(Continuing_Approvals), C_Denials = sum(Continuing_Denials)) %>%
 mutate(Denial_Rate = Denials/(Approvals+Denials)*100) %>% 
 select(Employer, Approvals) %>%
 arrange(desc(Approvals)) %>%
 top_n(15, Approvals)wordcloud2(employer_wc, size = .25, minRotation = 0, maxRotation = 0, color=rep_len(c(“blueviolet”,”blue”,”darkgreen”,”purple”,”deeppink”,”darkorchid”,”darkviolet”,”brown”,”darkred”), nrow(demoFreq) ), backgroundColor = “white”)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Top employers with H-1B approvals in the last two years

正如我们所见,所有的科技公司在签证审批方面都处于领先地位。在过去两年中,苹果公司以大约 1700 项批准位居榜首。德勤、英特尔、IBM、微软、脸书、谷歌和其他公司也是顶级竞争者。

这是我用我发现的一些见解完成的分析。我知道人们可以利用这些数据做更多的事情。如果你想在应用程序中看到任何变化,请在评论中提出建议或直接在 Github 上合作。

App 怎么用?

对使用这些数据并与之互动感到兴奋吗?您可以使用以下任一选项来完成此操作:

**1)使用 R 在本地运行:**如果您的系统上安装了 R 和 R studio/任何其他 IDE,请在 R 控制台中运行以下命令。该应用程序将直接从 GitHub repo 加载。首次加载应用程序可能需要一些时间。

runGitHub("Shiny_H1b","SurajMalpani")

2)虚拟主机:https://surajmalpani.shinyapps.io/Visas/

您可以通过访问上述地址来访问 web 应用程序。然而,我个人建议使用第一种方法(runGitHub ),因为 Shinyapps 不支持其中的一些图,因此我必须删除它们。

关于该应用程序的详细信息:

如您在以下视频中所见,共有 4 个选项卡。视频下面提到了他们的描述:

Demonstration video of the shiny web app

I)所有数据:该标签包含来自 USCIS 的所有数据。您可以查找感兴趣的任何或多个雇主、年份、州、城市。根据您的输入过滤数据后,您可以下载. csv 格式的过滤文件以供进一步分析。

**ii)批准与拒绝:**您可以查看自 2009 年以来的批准和拒绝总数。

**三)地域:**你可以看看批准人数最多的前 10 个州和前 50 个城市。您可以选择您希望查看的年份,这些图将针对所选年份进行更新。

**iv)部门:**您可以查看一段时间内每个部门的审批数量。此外,您可以查看这些部门的拒绝率。

请随时在评论区提问/给出建议,或者随时在我的网站LinkedIn 与我联系。

感谢您的阅读。希望这个分析和 web app 对你有帮助!

参考文献:

  1. Plotly 网站
  2. 闪亮的 RStudio
  3. Plotly-R
  4. 美国移民局

使用 Python 绘图和数据表示。使用 Coursera 问题的引导式演练

原文:https://towardsdatascience.com/plotting-and-data-representation-using-python-a-guided-example-using-a-coursera-question-602191003139?source=collection_archive---------6-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这篇文章基于 Coursera 课程的一个作业,“Python 中的应用绘图、图表和数据表示”。这是密歇根大学 Python 专业应用数据科学的第 2 部分。这是为了向您介绍我对其中一个作业的一个解决方案,这种解释方式对于 Python 经验有限的人来说更容易理解。请注意,如果你正在学习这门课程,你可以从我的解决方案中学习,但不要抄袭它对你最有利,因为从长远来看,这只会伤害你。此外,还有一个更好的解决方案,可以让你更好地理解作业的目的。

场景

假设您正在某个城市或地区的气象站测量温度。根据我的研究,尽管有限,这种天气经常被测量到十分之一度(不管什么原因)。你开始收集超过十年的数据,测量每日和每月的最高和最低温度,并将这些数据编辑成 excel 电子表格。

新的一年过去了,假设现在是 2015 年,你继续像往常一样测量温度。2015 年,你一直在观察全国各地创纪录的高点、低点和热浪。你开始想知道今年的气温与过去 10 年的气温相比如何。你想回答问题;如何将今年每个月的历史高点和低点与过去 10 年每个月的历史高点进行对比?

你决定呈现这些发现的最佳方式是通过可视化的折线图,该图将显示过去 10 年中每个月的创纪录高点和低点。为了回答您当前的问题,您还需要叠加一个散点图,显示 2015 年以来的创纪录高点和低点,这些高点和低点要么超过了过去 10 年创下的创纪录低点或高点。

代码

所以现在你有一个问题,你知道你需要发展什么来回答你的问题。你决定用 Python 写出代码。为了有助于你的可视化,你需要导入某些,这将帮助你执行许多复杂的动作,而无需编写冗长复杂的代码。

导入库并读取数据

import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#read data from a csv
df = pd.read_csv('data/C2A2_data/BinnedCsvs_d400/fb441e62df2d58994928907a91895ec62c2c42e6cd075c2700843b89.csv')

对于这种可视化,我们希望使用日期时间库来规定截止日期,以便我们可以将数据分成两个表;2005 年至 2014 年 12 月 31 日之间的温度测量值;ii .)在截止日期之后进行的测量。

Numpy 是数字 python 的缩写,它将允许我们在多维矩阵和数组上执行数学函数。

熊猫和图书馆将允许我们对将要与之互动的数据框架进行操作和计算。而 matplotlib 将用于绘制我们的图形。为了便于引用,我们使用别名 pd 和 plt(以及 numpy 的 np)与这些库进行交互。

然后,下一行代码使用 pandas 库中包含的 read_csv 模块从 csv 中读取我们想要的数据。这被自动保存为熊猫数据帧——我们将该数据帧命名为“df”。

此时,我喜欢使用 head 方法来读取数据帧的前 5 行。这有助于我理解数据帧有哪些列,并对数据的外观有更好的感觉

df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Output

现在我们知道数据帧有 4 列;ID、日期、元素和数据值。还有一个索引列,列出从零开始的行号。数据帧总共包含 165 085 行

您会注意到,测量结果分为 TMAX(最高温度)和 TMIN(最低温度)。ID 显示了站点识别代码,该代码大概显示了哪个站点进行了测量。

删除闰年数据

由于 2015 年不是闰年,我们希望删除所有闰年数据。如果闰年在 10 年内记录了高/低温,因为这可能会对高/低温测量记录产生影响。由于 2015 年将比闰年(2008 年和 2012 年)少一天,这不是一个准确的比较。

#converting date to date timestamp
df['Date'] = pd.DatetimeIndex(df['Date']).date
lis = ['2922008','2922012'] #list of 29 Febs appearing in each leap year
dates = [datetime.datetime.strptime(i, '%d%m%Y').date() for i in lis] #converting into list of datetime.date objects
df = df[~df['Date'].isin(dates)] #remove all 29 February dates

在这段代码中,我们使用 DatetimeIndex 模块转换整个日期列。这将日期列转换为时间戳对象。然后我们用。我们希望返回 datetime.date 对象的日期(“不带时区信息的时间戳的日期时间”)。

使用 datetime.date 库,我们将闰年日期列表转换为 datetime.date 对象。然后,我们只选择没有列为闰年日期的日期(在列表“lis”下),并从我们的数据框架中过滤出所有闰年日期。

日期、截止日期和将数据帧分成两个表格

接下来,因为我们已经确保了日期列中的所有日期都是相同的数据类型(例如,它们都是日期而不是字符串),所以我们希望根据测量是发生在截止日期之前还是之后,将数据划分到两个表中。

#creating a separate column for the month
df['Month'] = pd.DatetimeIndex(df['Date']).month
#we are colleting dates between 2005 - 2014, so want to remove any data from dates after 31 Dec 2014
#creating datetime.date format of cutoff date
a= '31122014'
#converting a string into datetime.date object
cutoff_date = datetime.datetime.strptime(a,'%d%m%Y').date()
#dataframe for values after 31 Dec 2014
df2 = df[df['Date'] <= cutoff_date]
#returning dates before cutoff date
df3 = df[df['Date'] > cutoff_date]

因为我们希望表格显示十年期间的月度高点,所以我们还希望创建一个月列。仅将日期列的月份作为整数列出。

对于截止日期,我们添加了一个整数形式的日期,并使用 datetime.date 模块将字符串转换为 datetime.date 对象(类似于我们的 date 列),格式为“日期/月/年”。

然后,我们继续创建 2 个新的数据帧;df2-包含截止日期之前或之时的所有测量值,df3-包含截止日期之后的所有测量值。

发现历史高点和低点

现在我们需要回答这个问题,我们如何按月找到 2005 年到 2014 年这十年间创纪录的高温和低温。

通过使用 head 方法查看我们的数据框架,我们已经知道有一列指定了测量值是否记录为最高温度的最小值。此外,由于我们已经创建了一个 month 列,我们知道它包含了记录测量的月份。为了帮助我们完成这个计算,我们将使用 groupby 。这是一个 pandas 模块,允许我们根据一个或多个标准将数据分组。这可以与聚合方法“aggregate”结合使用,该方法允许我们对数据进行聚合,例如返回最大值或最小值。结合 groupby 我们可以确定我们创建的按月分组的组之间的最大值和最小值。

df_min = df2[df2['Element'] =='TMIN'].groupby('Month').aggregate({'Data_Value':np.min})
df_max = df2[df2['Element'] == 'TMAX'].groupby('Month').aggregate({'Data_Value':np.max})

在这段代码中,我们创建了 2 个数据帧;df_min-在这里,我们过滤了分类为最低温度的测量值,按月分组,找到了十年期间每个月的最低温度,而 df_max-我们过滤了分类为最高温度的测量值,按月分组,找到了每个月的最高温度。

可视化过程

现在我们想开始利用 matplotlib 库来可视化我们的数据。

plt.plot(df_max, '-o',df_min,'-o')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

plt.show() output

我们首先将过去十年间的历史高点和低点绘制成一个线形图。这两个将自动以不同的颜色绘制。我们使用“-o”来标识该图表上绘制的每个数据值,这在我们的折线图上表示为一个圆圈。

为了可视化的目的,我们想在最高点和最低点之间的区域加阴影。我相信这将使数据看起来更容易,帮助你关注最高和最低温度以及十年期间记录温度的可变性。

x = df_max.index.values
plt.fill_between(x,df_min.values.flatten(),df_max.values.flatten(), color='grey',alpha='0.5')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

plt.show() output

我们使用 fill_between 模块来填充两条线之间的区域。对于 fill_between 函数,您需要有要填充的 x 坐标的长度以及来自 df_min 和 df_max 的坐标/值。

为了找到 x 坐标的长度,我们创建了一个包含 df_max 索引值的 x 变量。这将返回一个 numpy 数组,其中包含与一年中的月份相对应的数字 1-12。

因为 df_min 和 df_max 是数据帧,我们只需要 df_min 和 df_max 的数据帧(温度)中的值。然而,这将返回一个数组的数组,而我们需要一个一维数组来使用 fill_between 模块。然后我们选择数组展平成一维数组。颜色和 alpha 只允许我们指定填充之间的颜色和色调。

超级气势散点图

为了回答我们的中心问题,我们需要开始查看截止日期之后的记录。为了做到这一点,我们需要按月对数据进行分组,并在我们的折线图上寻找超过最低和最高记录温度的测量值。

#superimpose scatterplot
df3_max = df3[df3['Data_Value'] > df3['Month'].map(df_max['Data_Value'])]
df4_min = df3[df3['Data_Value'] < df3['Month'].map(df_min['Data_Value'])]
plt.scatter(df3_max.Month.tolist(),df3_max['Data_Value'],s=10,c='red') #values over max
plt.scatter(df4_min.Month.tolist(),df4_min['Data_Value'],s=10,c='black') #values under min

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

plt.show() output

为了将我所在月份的每个温度分组与每个月的最低和最高温度进行比较,我们使用映射函数遍历 df3 数据库,确定每列的月份,并将 Data_Value 列下列出的温度与 df_min 和 df_max 数据帧中该特定月份的值进行比较(取决于我们查看的是最低还是最高温度)。如果该值高于或低于十年期间记录的最高和最低温度,我们将该行添加到新的数据帧中;df3_max 和 df4_min。

现在我们想把我们的散点图叠加到我们的折线图上。对于散点图,我们需要指定 x 轴(月)和 y 轴(数据值)。我们还想指定代表每个值的圆圈的大小和颜色,以区别于折线图圆圈。

让图表更容易解读

如果你打算把这个图表展示给其他人,重要的是要确保这个图表易于理解,并显示你想要它显示的内容,而不误导你的观众。

图表的第一个问题是 x 轴在 2s 内增加,跳过奇数个月。

plt.xticks(list(df_max.index),['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sept','Oct','Nov','Dec']) #we want to show all the x values and rename according to the month

为了纠正这一点,我指定了 xticks,并将它们重命名为它们所代表的月份的缩写。

下一个问题是如何记录温度。我们希望以摄氏度显示温度,而不是十分之一度。

df_max['Data_Value'] = df_max['Data_Value']/10
df_min['Data_Value'] = df_min['Data_Value']/10
df4_min['Data_Value'] = df4_min['Data_Value']/10
df3_max['Data_Value'] = df3_max['Data_Value']/10

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

plt.show() output — I mistakenly left out April bur corrected this error

然后,我将所有温度值除以 10,将十分之一度转换为摄氏度。

最后一个问题是图表没有标注,而且图表的大小使我们很难知道记录的超过每月高温或低温的天数。

plt.title('Min and Max temperatures in Ann Arbor Michigan United States between 2005-2015', fontsize=20)
plt.xlabel('Years', fontsize=20)
plt.ylabel('Temperatures', fontsize=20)
fig = plt.gcf()
fig.set_size_inches(20,10)
plt.tick_params(labelsize=20)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

plt.show() output

然后,我开始放大图表,首先获取当前数字(gcf),将其保存为 fig,并以英寸为单位设置 fig 的大小。由于这只会放大数字,我需要同时放大 x 和 y 刻度参数以及 y 和 x 标签的字体大小。

从这张图表中,我们可以看出,2 月份大约有 6 天的最低温度低于 2005 年至 2014 年期间记录的最低温度,而 11 月和 12 月的另外两天的温度超过了 10 年来记录的最高温度。这种解释的意义很大程度上取决于你试图用这种想象回答的问题。

这不是表示该数据的唯一方式,因为您可以选择显示十年期间每天的最高记录温度,并使用它来确定 2015 年后超过先前设定的最高和最低记录的个别日期。如果这样做的话,可能会让你对 2015 年的气温记录有一个更清晰的了解(答案应该不会太不同)。

使用 Python 中的多个绘图库在地图上绘制商业位置

原文:https://towardsdatascience.com/plotting-business-locations-on-maps-using-multiple-plotting-libraries-in-python-45a00ea770af?source=collection_archive---------7-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Andrew Stutesman on Unsplash

我在浏览 Kaggle 时,发现了一个数据集,其中包括经度和纬度的位置。我没有在地图上绘制过地图,所以我决定使用这个数据集并探索各种可用的选项来处理它们。这是一个关于我所做的事情和我对这些库的推断的基本指南。

我们的目标是寻找一个非常容易使用的库,并且可以无缝地在地图上绘制。另一个目标是找到一个可以一次打印数据集中所有点(190,000+点)的库。

在这里,我探索了四个库,gmplotgeopandasplotlybokeh。我会在需要的时候导入这些库,而不是一开始就全部导入。完整代码可从 GitHub repo 获得:

[## kb22/Python 绘图地图

一个数据可视化项目,包括多种在地图上绘制位置的方法。-kb22/Python 绘图地图

github.com](https://github.com/kb22/Plot-Maps-in-Python)

我们开始吧!!

资料组

我从 Kaggle 中取出数据集,并将其保存在data文件夹中,命名为dataset.csv。它包括一个完整的地址,州,位置和更多的企业列表。我在不同的数组中提取了纬度、经度、州、unique_states 和名称。我还提取了最小和最大的纬度和经度值,这将有助于我放大世界地图上的特定区域,我们将在下面看到。

对于每个库,我将绘制前 1000 个位置,然后尝试绘制所有的点。

gmplot

gmplot是一个库,它通过创建一个可以在浏览器中加载的 html 文件来生成绘图。这是开始在地图上绘制数据的最简单快捷的方法之一。它在谷歌地图上绘制信息,因此看起来真的很好。

首先,我们创建一个GoogleMapPlotter,它采用描述地图中心的前两个值(在我们的例子中是美国),第三个参数是缩放级别。你可以在这里选择任何数字,但我发现 5 是适合这种情况。数据文件夹中会生成一个文件gmplot.html。让我们在浏览器中打开它。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

gmplot without API Key

哎呀!整个地图变暗,被文字For development purposes only覆盖。这是因为现在对谷歌地图 API 的访问是付费的,我们需要一个 API 密钥。为此,你必须在https://console.cloud.google.com上创建一个账户。默认情况下,你可以免费试用 12 个月,有足够的学分来完成这个项目和更多。转到 Google Maps Javascript API 并生成一个 API 密钥。让我们现在把它填上。

只需用 API 键替换文本<API-KEY>。让我们看看新的 HTML 文档是什么样子的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

gmplot with API key

现在,地图已正确生成。由于这是一个实际的谷歌地图,我们可以将左上角的设置改为卫星,放大并根据需要移动地图。接下来,让我们试着在地图上标出所有的位置。

我试图加载 HTML 页面,但它加载了几秒钟,过了一段时间后就没有反应了。我尝试了多次,但无法得到一个工作页面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unresponsive page

地质公园

GeoPandas是一个建立在熊猫数据结构上的库,并使用它们在地图上绘制空间数据。

图书馆期望所有的位置都被描述为点。因此,第一步是创建一个点数组,我将它们存储在data_points中。我发现这个库的惊人之处在于,它使得给每个位置添加颜色变得非常简单。如果你熟悉熊猫和 matplotlib,你会觉得很舒服。我在colormap创建了一个基于独特州的颜色列表,并用它来生成所有地点的颜色数组,只需一个循环。

首先,我们需要一张地图来标出这些点。图书馆提供了一些地图,我用过naturalearth_lowres。我简单地用浅灰色的背景和黑色的边界来绘制它。一旦我们准备好地图,我们就可以使用GeoDataFrame来绘制数据。这就像熊猫数据帧,所以我们首先传递数据集,限制为 1000,以便在开始时只绘制 1000 个位置。使用crs定义所需的坐标系,我们在geometry中定义数据。我关闭了轴,并根据纬度和经度值设置了 x-极限和 y-极限。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GeoPandas with 1000 locations

如你所见,每个位置都是蓝色的略微不同的变体。让我们也画出所有的点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GeoPandas will all points

瞧啊。GeoPandas 能够绘制出所有的点。然而,我在这里发现了两个主要的缺点,包括没有一个交互式地图,以及如何正确使用它的文档非常有限。

Plotly

Plotly是另一个绘制高度交互式图表的库,也允许用户与图表交互。但是,它需要用户名和 API 密钥才能工作。你必须在 https://plot.ly/feed/#/注册并获得一个 API 密匙。

你必须用你自己的价值观取代<USERNAME><API-KEY>

我们使用ScatterGeo来定义我们想要绘制的点,也可以在text参数中传递它们的名称。设置标记也很容易,可以修改其大小,不透明度,颜色等。layout用于定义图的标题、基色等。最后,Figure()方法创建了我们可以使用iplot绘制的图形。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Plotly plot for 1000 locations

我们能够用相同的颜色绘制 1000 个点,但是要用不同的颜色绘制它们,我们必须用不同的颜色绘制不同的ScatterGeo方法。让我们试着画出所有的点。

过了一段时间后生成了这个图,但是所有的位置都是可见的,尽管它非常滞后。甚至会出现一个警告,说对于绘制大量的点,我们应该使用其他方法。这很烦人,因为当我试图将它作为图像返回时,它需要库plotly-ocra,而库plotly-ocra不能与pip一起安装,只能与conda一起工作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Plotly map for all locations

散景

Bokeh是一个惊人的可视化库,它依赖于 Google Maps 的地图,因此,也需要我们上面使用的 API 键来工作。鉴于它使用谷歌地图,我非常怀疑它能否一次标绘所有的点。

我们将输出保存为bokeh.htmlGMapOptions帮助我们定义地图的中心,并根据需要进行缩放。然后我们用这些选项生成一个gmap,并传入 API 密钥。我们将数据定义为 ColumnDataSource,如上面的要点所示。然后,我们在图上将所有点标为circle,并用show显示出来。它加载 html,我们可以看到结果,这是一个交互式地图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Bokeh plot for 1000 points

所有位置都已正确绘制。让我们试着画出所有的点。

不出所料,该页面打开时显示了地图,但无法工作,也没有显示任何数据点。

结果

从上面的图中,我发现所有的库对于绘制数据点都非常有用,我的观察如下:

  1. 最简单的入门方法是从gmplot开始。它需要最少的代码来启动,并且能够产生良好的结果。
  2. GeoPandas中,根据状态用不同的颜色绘制点是最容易的。很容易画出所有的点,可能是因为这个图不是交互式的,是静态的。
  3. 最具互动性的是Plotly的剧情。他们能够绘制出包含所有点的图,但反应较慢,并提出了其他绘制方法。
  4. Bokeh能够用最少的代码生成非常好的谷歌地图。然而,它也没有画出所有的点。

希望你喜欢读这篇文章。这里还有一些你可能会喜欢的文章:

[## Python 虚拟环境变得简单

虚拟快速指南

towardsdatascience.com](/python-virtual-environments-made-easy-fe0c603fe601) [## 在 Kaggle 上使用 CNN 进行深度学习以识别疟疾细胞

医学领域的深度学习

towardsdatascience.com](/deep-learning-to-identify-malaria-cells-using-cnn-on-kaggle-b9a987f55ea5) [## 使用 Flask、Flask RESTPlus 和 Swagger UI 处理 API

Flask 和 Flask-RESTPlus 简介

towardsdatascience.com](/working-with-apis-using-flask-flask-restplus-and-swagger-ui-7cf447deda7f) [## 使用 React 和 Flask 创建一个完整的机器学习 web 应用程序

用 UI 和后端构建完整的 ML 应用程序

towardsdatascience.com](/create-a-complete-machine-learning-web-application-using-react-and-flask-859340bddb33)

请随时分享你的想法,想法和建议。我很乐意收到你的来信。

绘制离散和连续随机变量的概率

原文:https://towardsdatascience.com/plotting-probabilities-for-discrete-and-continuous-random-variables-353c5bb62336?source=collection_archive---------11-----------------------

通过用代码绘制概率来学习分布

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

理解统计学可以帮助我们看到随机数据中的模式。

让我们讨论两种主要类型的随机变量,以及如何为每一种绘制概率图。

什么是随机变量

investopedia 报道。

随机变量是一个值未知的变量,或者是一个为每个实验结果赋值的函数。

与我们对随机性的直觉相反,这个函数的可能值并不是同样可能的。

维基百科言简意赅。一个随机变量…

被非正式地描述为一个变量,其值取决于随机现象的结果。

随机变量依赖于使用随机性的函数,但不一定输出均匀的随机性。

重要提示:当我们谈论一个随机变量时,通常用 X 表示,它的最终值仍然未知。随机变量是“X”。不是 x 的输出不是random.random()的输出。只有 X,有可能的结果和相关的概率。

酷毙了。现在随机变量通常分为两类:

1)离散随机变量
2)连续随机变量

让我们从离散开始,因为它更符合我们人类看待世界的方式。

离散随机变量

维基百科

当 X 的图像(或范围)是可数的时,该随机变量被称为离散随机变量,并且其分布可以由概率质量函数来描述,该概率质量函数将概率分配给 X 的图像中的每个值。

如果随机变量只能取有限数量的值,那么它就是离散的。是 **PMF(概率质量函数)**给每个可能的值分配一个概率。请注意,离散随机变量有 PMF,而连续随机变量没有。

如果您事先不知道 PMF(我们通常不知道),您可以根据与您的随机变量来自相同分布的样本来估计它。

步骤:
1 .从总体中收集一个样本。计算每个值的频率
3。将频率转换成概率

对于一些任意数据,我们可以遵循这个逻辑,其中sample = [0,1,1,1,1,1,2,2,2,2]

def frequencies(values):
    frequencies = {}
    for v in values:
        if v in frequencies:
            frequencies[v] += 1
        else:
            frequencies[v] = 1
    return frequenciesdef probabilities(sample, freqs):
    probs = []
    for k,v in freqs.items():
        probs.append(round(v/len(sample),1))
    return probssample = [0,1,1,1,1,1,2,2,2,2]freqs = frequencies(sample)
probs = probabilities(sample, freqs)
x_axis = list(set(sample))plt.bar(x_axis, probs)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

PMF (left). Probability distribution (right).

继续我们上面的代码,PMF 计算如下。

dict(zip(x_axis, probs))
#=> {0: 0.1, 1: 0.5, 2: 0.4}

直觉上,所有可能性的概率总是加 1。

**经验法则:**假设一个随机变量是离散的,如果你能事先列出它可能的所有可能值。这不是定义,而是一个有用的启发。

许多分布是基于离散随机变量的。这些包括伯努利,二项式和泊松分布。

在我们深入研究连续随机变量之前,让我们再看几个离散随机变量的例子。

示例 1:抛硬币(离散)

抛硬币是离散的,因为结果只能是正面或反面。这符合伯努利分布,只有两种可能的结果,一次只能抛一次硬币。

让我们用 numpy 生成数据来对此建模。

import numpy as np
import matplotlib.pyplot as pltn = 1    # number of trials
p = 0.5  # probability of success
sample = np.random.binomial(n, p, 100)plt.hist(sample, bins=10)

并绘制出结果的频率。以及概率。

# using the functions we wrote above
freqs = frequencies(sample)
probs = probabilities(sample, freqs)
x_axis = list(set(sample))plt.bar(x_axis, probs)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请注意值落入的桶的离散数量。

例 2:一个人的四舍五入体重(精确到磅)(离散)

四舍五入的砝码(精确到磅)是不连续的,因为砝码可以落入间隔为 1 磅的不连续桶中。

未舍入的权重是连续的,因此我们将在讨论连续随机变量时再次回到这个例子。

Kaggle 下载数据集,并保存在与此笔记本相同的目录下。

import pandas as pddf = pd.read_csv('weight-height.csv')# convert values to integer to round them
df['Height'] = df['Height'].astype(int)
df['Weight'] = df['Weight'].astype(int)df.head(3)

我们将对数据进行采样(如上)并绘制图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在添加density=True将我们的图转换成概率。

plt.hist(weights, bins=20, density=True)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

再次注意离散的桶。现在让我们继续讨论连续随机变量。

连续随机变量

维基百科

如果像是不可数无穷的,那么 X 称为连续随机变量。

输出可以是一个范围内的无限个值。因此,虽然曲线下的组合概率等于 1,但不可能计算任何单个点的概率——它非常小。可以计算曲线下 x 值范围的概率,但我们不会在这里讨论。

连续随机变量有一个 PDF(概率密度函数),不是 PMF。与 PMF 不同,该函数定义了随分布变化的曲线,而不是列出每个可能输出的概率。

让我们回到我们的重量例子。这一次,权重没有四舍五入。

为什么重量是连续的?因为真正的体重不会整齐地落在 1 磅的区间内。一个人站在磅秤上可以重达 150 磅。但是如果我们放大到分子水平,它们实际上可能有 150.0000001 磅重。

步骤:
1 .在直方图上绘制样本数据
2。找出一个众所周知的样本服从的分布
3。计算从样本
4 生成分布所需的参数。生成 PDF 并绘制在直方图的顶部

让我们用上面的重量例子来做这件事。

如果您还没有从 Kaggle 下载数据集,并将其保存在与笔记本相同的目录中。

检查数据的形状。

import pandas as pd
df = pd.read_csv('weight-height.csv')
df.head(3)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将移除男性,让我们的生活更轻松。包括男性和女性将导致双峰分布(2 个峰而不是 1 个),这使我们的计算变得复杂。

df = df[df['Gender']=='Female']
df.head(3)

绘制剩余的重量数据。

weights = df['Weight'].tolist()
plt.hist(weights, bins=20)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这看起来像什么一般的分布?一个正态分布,呵呵。

计算均值和标准差,因为我们需要它们来生成正态分布。

from numpy import mean,stdmean = mean(weights)
std = std(weights)print(mean, std)
#=> 135.86009300746835 19.020565463416645

使用这些参数生成正态分布。

from scipy.stats import norm
distribution = norm(mean, std)

选择我们将绘制 PDF 的范围。

min_weight = min(weights)
max_weight = max(weights)
values = list(range(int(min_weight), int(max_weight)))

生成该范围的概率。

probabilities = [distribution.pdf(v) for v in values]

绘制我们的样本分布和我们生成的 PDF。

from matplotlib import pyplot
pyplot.hist(weights, bins=20, density=True) # , 
pyplot.plot(values, probabilities)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们有了。

我们有意选择了一个服从正态分布的样本来简化这个过程。但是最好了解不同的常见分布类型和生成它们所需的参数。

R 中基于位置的数据可视化

原文:https://towardsdatascience.com/plotting-spatial-data-in-r-a38a405a07f1?source=collection_archive---------7-----------------------

在旧金山城市地图上标出商业高度集中的街区

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Anastasia Petrova on Unsplash

我最近得到了一个处理空间数据的机会,想分享我对一个这样的数据集的分析。

这些数据包括旧金山湾区的各种注册企业,可以在这里找到。更新版本可以在这里找到。

空间数据属于与位置相关联的数据。通常用坐标参考系统(纬度和经度)来描述。

本练习的目标是找到旧金山商业高度集中的街区。你需要从谷歌的地理定位 API 获得一个密钥来使用他们的地图。我使用 R 中的 ggmap 包来绘制这些数据。然后,我将分析范围缩小到一个特定的高度集中的社区,看看企业是如何在该区域内分散的。

首先…快速扫描数据集

str(biz)head(biz, 25)summary(biz)

在这个练习中,我只关心邻居、地址、日期,最重要的是包含每个企业的纬度和经度数据的位置列。企业名称及其代码(由城市为注册企业分配)暂时没有考虑。

在进行了基本的数据清理活动(比如消除重复和空值)之后,我只提取了与旧金山有关的信息,并消除了与海湾地区相邻城市有关的记录。

识别仅与旧金山相关的数据

我有几种方法可以实现这个目标;基于 c 城市或 b 业务地点或邮政编码过滤数据集。我选择使用邮政编码逻辑,因为其他两个字段具有不一致的旧金山城市名称模式,很容易被遗漏。但是,我已经包含了过滤这些数据的所有三种方法的命令。

按邮编

sf_biz_zip <- biz %>% filter(grepl(pattern = "94016|94105|94110|94115|94119|94123|94127|94132|94139|94143|94147|94156|94161|94171|94102|94107|94108|94109|94111|94112|94114|94116|94117|94118|94120|94121|94122|94124|94125|94126|94129|94130|94131|94133|94134|94137|94140|94141|94142|94144|94145|94146|94151|94153|94154|94158|94159|94160|94162|94163|94164|94172|94177|94188", Business.Location))

按城市

sf_biz_city <- biz %>% filter((grepl(".*San Francisco.*|.*SAN    FRANCISCO.*|.*SF.*|.*S SAN FRAN.*|.*Sf.*|.*San+francisco.*|.*S+san+fran.*", City)))

通过业务。位置

sf_biz_loc <- biz %>% filter((grepl(".*San Francisco.*|.*SAN FRANCISCO.*|.*SF.*|.*S SAN FRAN.*|.*Sf.*|.*San+francisco.*|.*S+san+fran.*", Business.Location)))

转换日期对象

接下来,我想消除已经不复存在的企业。为此,我对每个地点使用了结束日期。然而,日期字段存储为转换为 posixct 的因子,这通常有助于进一步分析日期。

sf_biz_zip$Business.Start.Date <- as.POSIXct(sf_biz_zip$Business.Start.Date, format = "%m/%d/%Y")sf_biz_zip$Business.End.Date <- as.POSIXct(sf_biz_zip$Business.End.Date, format = "%m/%d/%Y")sf_biz_zip$Location.Start.Date <- as.POSIXct(sf_biz_zip$Location.Start.Date, format = "%m/%d/%Y")sf_biz_zip$Location.End.Date <- as.POSIXct(sf_biz_zip$Location.End.Date, format = "%m/%d/%Y")

过滤掉不活跃的业务

2018 年 12 月 1 日后查封存在的企业予以剔除。

sf_biz_active_zip <- sf_biz_zip %>% filter(is.na(Location.End.Date))sf_biz_active_zip <- sf_biz_zip %>% filter(Location.Start.Date < "2018-12-01")

从业务位置字段中剥离坐标

业务位置列包含地址和坐标信息。因此需要提取纬度和经度信息。

sf_biz_active_zip <- sf_biz_active_zip %>% separate(Business.Location, c("Address", "Location"), sep = "[(]")sf_biz_active_zip <- sf_biz_active_zip %>% filter(!(is.na(Location)))sf_biz_active_zip <- separate(data = sf_biz_active_zip, col = Location, into = c("Latitude", "Longitude"), sep = ",")

其他字符也需要清除。

sf_biz_active_zip$Longitude <- gsub(sf_biz_active_zip$Longitude, pattern = "[)]", replacement = "")

然后,我将纬度和经度变量从离散转换为连续,并将它们存储为数字变量,因为这有助于绘制/可视化数据,并避免错误。

sf_biz_active_zip$Latitude <- as.numeric(sf_biz_active_zip$Latitude)sf_biz_active_zip$Longitude <- as.numeric(sf_biz_active_zip$Longitude)

现在有趣的部分…

可视化数据

产生的数据集有 88,785 条记录,需要绘制在 Google 地图上。至少可以说,在地图上解释这么多的记录是一件非常困难的事情。尽管取样是一种方法,但我还是试图找出拥有最多企业的前 10 个街区,并在地图上画出一个这样的街区。

viz <- sf_biz_active_zip %>% group_by(Neighborhoods...Analysis.Boundaries) %>% tally() %>% arrange(desc(n))col.names(viz)[2] <- “Total_businesses”viz <- viz[1:10, ]

然后我创建了一个前 10 个街区的直方图。

fin_plot <- ggplot(viz, aes(x = Neighborhood, y = Total_Businesses)) + geom_bar(stat = "identity", fill = "#00bc6c")fin_plot <- fin_plot + geom_text(aes(label = Total_Businesses), vjust = -0.2) + theme(axis.text.x = element_text(angle = 45, size = 9, hjust = 1), plot.title = element_text(hjust = 0.5))fin_plot <- fin_plot + ggtitle("Top 10 neighborhoods by business count", size = 2)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们更详细地看看金融区/南海滩社区,因为它拥有最大数量的活跃企业。

注册谷歌地图密钥

我安装了“ggmap”、“digest”和“glue”包,然后向 Google API 注册以获得地理位置 API 密钥。

install.packages("ggmap","digest","glue")register_google(key = "<google maps key>")

谷歌提供地形、卫星、混合以及其他类型的地图。我选择使用地形图。简单的谷歌搜索就能给你旧金山的城市坐标。

sf <- c(lon = -122.3999, lat = 37.7846)map <- get_map(location = sf, zoom = 14, scale = 2)

通过调节变焦,你可以看得更清楚。下面两张图片的缩放比例不同

fin_map <- ggmap(map) + geom_point(aes(Longitude, Latitude), data = fin_dis) fin_map <- fin_map + ggtitle("Concentration of businesses in Fin. District and South Beach") + xlab("Longitude") + ylab("Latitude") + theme(plot.title = element_text(hjust = 0.5))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Zoom out view

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Zoom in view

更好的可视化

热图可能会使可视化更加直观。为了做到这一点,除了 x 和 y 坐标之外,我们还需要增加一种美感;z .这种美学是特定纬度的商业总数。-朗。组合。

fin_heatmap <- ggmap(map, extent = "device") + stat_summary_2d(data = u, aes(x = Longitude, y = Latitude, z = n), fun = mean, alpha = 0.6, bins = 30) + scale_fill_gradient(name = "Price", low = "green", high = "red")fin_heatmap <- fin_heatmap + ggtitle("Concentration of businesses in Fin. District and South Beach") + xlab("Longitude") + ylab("Latitude") + theme(plot.title = element_text(hjust = 0.5))")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

鲍威尔街地铁站、联合广场和恩巴卡德罗地铁站周围的区域有相对较多的商业,而南海滩和林肯山周围的区域人口稀少。

类似地,可以绘制其他单个社区的地图,以了解那里的商业分布。

这是一种非常直观的可视化空间数据的方式。我欢迎任何反馈和建设性的批评。

感谢您的阅读!

使用 t-SNE 绘制文本和图像向量

原文:https://towardsdatascience.com/plotting-text-and-image-vectors-using-t-sne-d0e43e55d89?source=collection_archive---------11-----------------------

如何在二维空间中绘制使用 Infersent 和 Resnet 创建的多维向量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Power to your eye - Happy Visualizing

用可视化创造奇迹

约翰·米特尔南正确地指出,“展示才是真正的娱乐”,如果你能以另一个人希望的方式展示你的数据,他将处于一种幸福的状态。想象一个所有数据的交流都可以可视化的世界,我的大脑和我的老板都会感谢我的这个姿态。维克拉姆·瓦什尼 阿尤什·古普塔。考虑到人脑对于图像内容的舒适性,并且考虑到通过人脑传输的 90%的信息是视觉的,我们已经尝试在 2-D 空间中绘制句子和图像向量,其中每个空间点代表一个句子,并且相似的句子向量将被放置在空间邻近处。

问题陈述:

绘制句子和图像向量,其中句子向量是使用 Infersent 或 Google 的通用句子编码器得出的,图像向量是在 Resnet 50 模型中提取的特征。

我们的句子只不过是产品名称、描述和规格的组合,而图像基本上就是产品图像。要了解产品在 Indiamart 中的含义,请阅读此处。

理解文本和图像向量

文本向量(单词向量或句子向量)是通过使用嵌入技术(如 word2vec、fasttext、Infersent、Google universal sent encoder 等)将文本数据转换为数字形式来创建的。你的向量的维度可能取决于你准备它的技术。例如,Infesent 为每个句子创建 4096 维的向量,而 GUSE(Google 通用句子编码器)为每个句子创建 512 维的向量。

图像向量是使用一些图像特征提取技术创建的图像的特征向量。在我们的例子中,对于每个图像,我们有 512 维的 Resnet 图像向量。

注意:在这篇文章中,我们不会详细讨论一个句子或单词的嵌入(它们将在另一篇博客中单独讨论),而是关注我们如何在散点图上描绘它们。

去多维化再回来

可视化文本和图像特征向量的分布式表示的困难在于它们是多维的(例如,一些向量是 512 维的,而一些是 4096 维的),这比人类可以看到和解释的通常的 2 维或 3 维矢量图高得多。

由于没有直接的方法将这些数据点投影到易于人类理解的图上,我们需要一些强大的方法将这些高维数据映射到 2 或 3 维空间。在这里,SNE 霸王龙为我们开了一个玩笑。

下图显示了如何将每个矢量转换为二维数组,以便于绘图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Multidimensional Vectors converted to a two-dimensional vector using t-SNE.

什么是 SNE 霸王龙?

t-SNE 代表 t 分布随机邻居嵌入。这是一种降维技术,最适合于高维数据集的可视化。t-SNE 是一种随机化算法,I;e .每次我们运行该算法时,它都会在相同的数据集上返回稍微不同的结果。为了控制这一点,我们用任意值设置一个随机状态。这里使用随机状态来播种算法的成本函数。

给思想上色——散点图

以下步骤将指导您在散点图上描绘您的矢量。

步骤 1: 导入必要的库:

**第二步:加载使用不同嵌入技术创建的向量:**在这一步中,我们已经加载了使用 GUSE、Infersent 或 Resnet(在图像向量的情况下)创建的大维向量,并使用 t-SNE 算法拟合到 2 d 空间中。

**步骤 3:创建一个用户定义的函数,在二维空间中绘制上述向量:**我们已经使用了 t-SNE、matplotlib 和 seaborn 的组合来创建散点图。

步骤 4:可视化并保存图形

基于上述句子向量的 K-Means 聚类的可视化

我们使用 K-Means 聚类对相似的句子向量进行分组。形成了 18 个这样的集群。下面的散点图显示了产品在每个集群中的分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可视化基于已有的句子向量的聚类。

在这里,句子向量是基于其现有的簇绘制的。每个产品(句子向量)属于某个聚类或类别,并且每个类别都有唯一的颜色。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

We can see how the products(sentences) from Earthmoving Bucket are spread across the plot suggesting their nearness to other related clusters.

**添加一个轴到你的二维空间:**我们可以简单地在轴上设置 x-limit(在我们的例子中从-60 到+ 60)和 y-limit(从-60 到+60)

解码情节

散点图中的每个点代表单个产品中的文本。文本语义相似的产品放在一起。每个点的颜色代表它所属的类别,即类别 0 中的所有句子用红色表示,类别 1 中的所有句子用橙色表示,依此类推。

图像向量的可视化

图中的每个点代表单个图像的特征。相似的图像落在紧密结合的空间中。使用 Resnet 将每个图像转换为特征向量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image Vectors plotted in a 2-D Space. On close observation, it is seen that similar images are occupying close spaces while different image vectors are scattered in the plot.

将东西投入使用

散点图对我们有多种应用——它告诉我们现有的图像或句子有多相似,以及当前的分类对于其中映射的产品是否合适。它还帮助我们对一组新的产品或图片进行分类。

在我的 Github 库上查看的完整 python 代码。

了解如何使用 Python 创建漂亮且有洞察力的图表——快速、漂亮且令人惊叹

原文:https://towardsdatascience.com/plotting-with-python-c2561b8c0f1f?source=collection_archive---------0-----------------------

PYTHON 指南的最终绘图

用 Python 可视化的综合代码指南,解释用 Pandas、Seaborn 和 Plotly 绘图。在那里我们想象,除了别的以外,金钱可以买到幸福。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2018: Regplot showing how Life Ladder (Happiness) is positively correlated with Log GDP per capita (Money)

在今天的文章中,我们将探讨用 Python 绘制数据的三种不同方式。我们将利用 2019 年世界幸福报告中的数据来完成这项工作。我用 Gapminder 和维基百科上的信息丰富了《世界幸福报告》的数据,以便探索新的关系和可视化。

《世界幸福报告》试图回答哪些因素影响着全世界的幸福。

在报告中,幸福被定义为对“坎特里尔阶梯问题”的回答,该问题要求受访者在 0 到 10 的范围内评估他们今天的生活,最糟糕的生活为 0,最好的生活为 10。

在整篇文章中,我将使用**Life Ladder**作为目标变量。每当我们谈论人生阶梯时,想想幸福。

文章的结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Nik MacMillan on Unsplash

这篇文章旨在作为一个代码指南和一个参考点,供您在需要查找特定类型的情节时参考。为了节省空间,我有时会将多个图表合并成一个图像。不过放心,你可以在这个回购或者对应的 Jupyter 笔记本里找到所有的底层代码。

目录

我用超链接连接了文章的不同部分,所以如果你不关心介绍,可以直接跳到绘图部分。我不做评判。

我的 Python 绘图史

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Krys Amon on Unsplash

我大概两年前开始比较认真的学习 Python。从那以后,几乎没有一个星期我不惊叹于 Python 本身的简单和易用性,或者生态系统中许多令人惊叹的开源库之一。我熟悉的命令、模式和概念越多,一切就越有意义。

Matplotlib

用 Python 绘图则正好相反。最初,我用 Matplotlib 创建的几乎每个图表看起来都像是 80 年代逃脱的犯罪。更糟糕的是,为了创造这些令人厌恶的东西,我通常要在 Stackoverflow 上花上几个小时。例如,研究一些具体的命令来改变 x 轴的倾斜度,或者做一些类似的傻事。别让我从多图表开始。结果看起来令人印象深刻,以编程方式创建这些图表是一种奇妙的感觉。例如,一次为不同的变量生成 50 个图表。然而,这是如此多的工作,需要你记住一大堆无用的命令。

海生的

了解到 Seaborn 是一种解脱。Seaborn 抽象掉了许多微调。毫无疑问,由此产生的图表的美感是一个巨大的飞跃。但是,它也是建立在 Matplotlib 之上的。通常,对于非标准调整,仍然有必要深入到类似于机器级 matplotlib 代码的地方。

散景

时间匆匆一瞥,我以为散景会成为我的 goto 解决方案。我在研究地理空间可视化的时候遇到了散景。然而,我很快意识到,Bokeh 虽然不同,但和 matplotlib 一样愚蠢地复杂。

Plotly

不久前,我确实尝试过 plot.ly (从现在开始称为 plotly)。同时,再次致力于地理空间数据的可视化。那时候,它似乎比前面提到的图书馆更荒谬。你需要一个帐户,必须通过你的笔记本登录,然后 plotly 会在网上渲染一切。然后,您可以下载生成的图表。我迅速丢弃 plotly。然而,最近,我偶然发现了一个关于 plotly express 和 plotly 4.0 的 Youtube 视频,其中最重要的是,他们摆脱了所有这些在线废话。我摆弄了一下,这篇文章就是它的成果。我想,迟到总比不到好。

Kepler.gl(地理空间数据荣誉奖)

虽然不是 Python 库,但 Kepler.gl 是一个强大的基于网络的地理空间数据可视化工具。您所需要的只是 CSV 文件,您可以使用 Python 轻松创建这些文件。试试看!

我当前的工作流程

最终,我决定使用 Pandas native plotting 进行快速检查,使用 Seaborn 制作我想在报告和演示中使用的图表(视觉效果很重要)。

分布的重要性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Jonny Caspari on Unsplash

我在圣地亚哥学习时教统计学(Stats 119)。统计 119 是统计学的入门课程。课程包括统计基础知识,如数据聚合(视觉和定量),几率和概率的概念,回归,抽样,以及最重要的分布。这一次,我对数量和现象的理解几乎完全转移到了基于分布(大部分时间是高斯分布)的表述上。

时至今日,我发现这两个量的意义相差如此之远令人惊讶,标准差可以让你抓住一个现象。仅仅知道这两个数字,就可以简单地得出一个特定结果的可能性有多大。人们马上就知道大部分结果会在哪里。它给你一个参考框架来快速区分轶事事件和具有统计意义的事件,而不必通过过于复杂的计算。

一般来说,当面对新数据时,我的第一步是试图可视化它的分布,以便很好地理解数据。

加载数据和包导入

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Kelli Tungay on Unsplash

让我们加载我们将在整篇文章中使用的数据。我对数据做了一些预处理。我在有意义的地方进行内插和外推。

**# Load the data**
data = pd.read_csv('[https://raw.githubusercontent.com/FBosler/AdvancedPlotting/master/combined_set.csv'](https://raw.githubusercontent.com/FBosler/AdvancedPlotting/master/combined_set.csv'))**# this assigns labels per year**
data['Mean Log GDP per capita']  = data.groupby('Year')['Log GDP per capita'].transform(
    pd.qcut,
    q=5,
    labels=(['Lowest','Low','Medium','High','Highest'])
)

数据集包含以下列的值:

  • **年份:**计量年份(从 2007 年到 2018 年)
  • **人生阶梯:**受访者根据坎特里尔阶梯,用 0 到 10 分(10 分最好)来衡量他们今天的生活价值
  • **对数人均国内生产总值:**人均国内生产总值按购买力平价(PPP)计算,按 2011 年不变国际美元进行调整,取自世界银行于 2018 年 11 月 14 日发布的《世界发展指标(WDI)》
  • **社会支持:**问题回答:“如果你遇到了麻烦,你有亲戚或朋友可以在你需要的时候帮你吗?”
  • **出生时的健康预期寿命:**出生时的预期寿命是根据世界卫生组织(世卫组织)全球卫生观察数据库的数据构建的,其中包含 2005 年、2010 年、2015 年和 2016 年的数据。
  • 做出生活选择的自由:对问题的回答:“你对选择如何生活的自由感到满意还是不满意?”
  • **慷慨:**对“在过去的一个月里,你有没有向慈善机构捐过钱?”与人均国内生产总值相比
  • **对腐败的看法:**对“腐败在政府中是否普遍存在?”以及“企业内部的腐败是否普遍?”
  • **积极影响:**包括前一天快乐、欢笑和享受的平均频率。
  • **负面影响:**包括前一天焦虑、悲伤和愤怒的平均频率。
  • **对国家政府的信心:**不言自明
  • 民主品质:一个国家有多民主
  • 交付质量:一个国家的政策交付情况如何
  • **Gapminder 预期寿命:**来自 Gapminder 的预期寿命
  • **Gapminder 人口:**一国人口

进口

import plotly
import pandas as pd
import numpy as np
import seaborn as sns
import plotly.express as pximport matplotlib%matplotlib inlineassert matplotlib.__version__ == "3.1.0","""
Please install matplotlib version 3.1.0 by running:
1) !pip uninstall matplotlib 
2) !pip install matplotlib==3.1.0
"""

快速:熊猫的基本绘图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Marvin Meyer on Unsplash

andas 有内置的绘图功能,可以在系列或数据帧上调用。我喜欢这些绘图功能的原因是它们简洁,使用了相当智能的默认设置,并且能够快速给出正在发生的事情的想法。

要创建一个图,在数据上调用.plot(kind=<TYPE OF PLOT>),如下所示:

np.exp(data[data['Year']==2018]['Log GDP per capita']).plot(
    **kind='hist'**
)

运行上面的命令将产生下面的图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2018: Histogram of the number of countries per GDP per Capita bucket. Not surprisingly, most countries are poor!

在绘制熊猫图时,我使用了五个主要参数:

  • **kind** : 熊猫已经知道你要创造什么样的剧情,以下选项可用hist, bar, barh, scatter, area, kde, line, box, hexbin, pie
  • **figsize** : 允许覆盖 6 英寸宽、4 英寸高的默认输出尺寸。figsize期望一个元组(例如,我经常使用的figsize=(12,8))
  • **title** : 给图表添加标题。大多数时候,我用这个来澄清图表中显示的任何内容,这样当我回到图表中时,我可以很快确定发生了什么。title需要一个字符串。
  • **bins** : 允许覆盖直方图的框宽度。bins需要一个列表或类似列表的值序列(例如,bins=np.arange(2,8,0.25))
  • **xlim/ylim** : 允许覆盖轴的最大值和最小值的默认值。xlimylim都需要一个元组(例如xlim=(0,5))

让我们快速浏览不同类型的可用图。

垂直条形图

data[
    data['Year'] == 2018
].set_index('Country name')['Life Ladder'].nlargest(15).plot(
    kind='bar',
    figsize=(12,8)
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2018: List of 15 happiest countries is led by Finnland

水平条形图

np.exp(data[
    data['Year'] == 2018
].groupby('Continent')['Log GDP per capita']\
       .mean()).sort_values().plot(
    kind='barh',
    figsize=(12,8)
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Average GDP per capita by continent in 2011 USD Dollars clearly led by Australia and New Zealand

箱形图

data['Life Ladder'].plot(
    kind='box',
    figsize=(12,8)
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Box plot of the distribution of Life Ladder shows that the median is somewhere around 5.5 ranging from values below 3 to up 8.

散点图

data[['Healthy life expectancy at birth','Gapminder Life Expectancy']].plot(
    kind='scatter',
    x='Healthy life expectancy at birth',
    y='Gapminder Life Expectancy',
    figsize=(12,8)
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Scatter plot of the World Happiness Report life expectation against the Gapminder life expectation shows a high correlation between the two (to be expected)

赫克宾图表

data[data['Year'] == 2018].plot(
    kind='hexbin',
    x='Healthy life expectancy at birth',
    y='Generosity',
    C='Life Ladder',
    gridsize=20,
    figsize=(12,8),
    cmap="Blues", # defaults to greenish
    sharex=False # required to get rid of a bug
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2018: Hexbin plot, plotting life expectancy against generosity. The color of bins indicates the average of life ladder in the respective bin.

圆形分格统计图表

data[data['Year'] == 2018].groupby(
    ['Continent']
)['Gapminder Population'].sum().plot(
    kind='pie',
    figsize=(12,8),
    cmap="Blues_r", # defaults to orangish
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2018: Pie chart showing the total population by continent

堆积面积图

data.groupby(
    ['Year','Continent']
)['Gapminder Population'].sum().unstack().plot(
    kind='area',
    figsize=(12,8),
    cmap="Blues", # defaults to orangish
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Population numbers accross the globe are on the rise.

折线图

data[
    data['Country name'] == 'Germany'
].set_index('Year')['Life Ladder'].plot(
    kind='line',
    figsize=(12,8)
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Line chart depicting the development of happiness in Germany.

关于用熊猫绘图的结论

用熊猫绘图很方便。它很容易访问,而且速度很快。情节相当丑陋。偏离缺省值几乎是不可能的,这没关系,因为我们有其他工具来制作更美观的图表。继续前往锡伯恩。

漂亮:与 Seaborn 的高级绘图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Pavel Nekoranec on Unsplash

eaborn 利用绘图默认值。要确保您的结果与我的匹配,请运行以下命令。

sns.reset_defaults()
sns.set(
    rc={'figure.figsize':(7,5)}, 
    style="white" # nicer layout
)

绘制单变量分布

如前所述,我是发行版的忠实粉丝。直方图和核密度分布都是可视化特定变量关键特征的有效方法。让我们看看如何在一个图表中生成单个变量的分布或多个变量的分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Left chart: Histogram and kernel density estimation of “Life Ladder” for Asian countries in 2018; Right chart: Kernel density estimation of “Life Ladder” for five buckets of GDP per Capita — Money can buy happiness

绘制二元分布

每当我想直观地探索两个或多个变量之间的关系时,通常会归结为某种形式的散点图和对分布的评估。概念上相似的图有三种变化。在这些图中,中心图(散点图、双变量 KDE 图和 hexbin 图)有助于理解两个变量之间的联合频率分布。此外,在中心图的右上方边界,描绘了相应变量的边际单变量分布(作为 KDE 或直方图)。

sns.jointplot(
    x='Log GDP per capita',
    y='Life Ladder',
    data=data,
    **kind='scatter' # or 'kde' or 'hex'**
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Seaborn jointplot with scatter, bivariate kde, and hexbin in the center graph and marginal distributions left and on top of the center graph.

散点图

散点图是一种可视化两个变量的联合密度分布的方法。我们可以通过添加色调在混合中添加第三个变量,通过添加大小参数添加第四个变量。

sns.scatterplot(
    x='Log GDP per capita',
    y='Life Ladder',
    data=data[data['Year'] == 2018],    
    hue='Continent',size='Gapminder Population'
)**# both, hue and size are optional**
sns.despine() **# prettier layout**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Log GDP per capita against Life Ladder, colors based on the continent and size on population

小提琴情节

小提琴图是箱线图和核密度估计的组合。它的作用类似于一个方框图。它显示了定量数据在分类变量中的分布,以便对这些分布进行比较。

sns.set(
    rc={'figure.figsize':(18,6)}, 
    style="white"
)sns.violinplot(
    x='Continent',
    y='Life Ladder',
    hue='Mean Log GDP per capita',
    data=data
)sns.despine()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Violin plot where we plot continents against Life Ladder, we use the Mean Log GDP per capita to group the data. It looks like a higher GDP per capita makes for higher happiness

配对图

Seaborn pair 图在一个大网格中绘制两变量散点图的所有组合。我通常觉得这有点信息超载,但它有助于发现模式。

sns.set(
    style="white", 
    palette="muted", 
    color_codes=True
)sns.pairplot(
    data[data.Year == 2018][[
        'Life Ladder','Log GDP per capita', 
        'Social support','Healthy life expectancy at birth', 
        'Freedom to make life choices','Generosity', 
        'Perceptions of corruption', 'Positive affect',
        'Negative affect','Confidence in national government',
        'Mean Log GDP per capita'
    ]].dropna(), 
    hue='Mean Log GDP per capita'
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Seaborn scatterplot grid where all selected variables a scattered against every other variable in the lower and upper part of the grid, the diagonal contains a kde plot.

小平面网格

对我来说,Seaborn 的 FacetGrid 是使用 Seaborn 的最有说服力的理由之一,因为它使创建多情节变得轻而易举。在 pair 图中,我们已经看到了一个 FacetGrid 的例子。FacetGrid 允许创建多个由变量分割的图表。例如,行可以是一个变量(人均 GDP 类别),列可以是另一个变量(大陆)。

它确实需要比我个人喜欢的多一点的定制(例如,使用 matplotlib),但它仍然是令人信服的。

面网格—线状图

g = sns.FacetGrid(
    data.groupby(['Mean Log GDP per capita','Year','Continent'])['Life Ladder'].mean().reset_index(),
    row='Mean Log GDP per capita',
    col='Continent',
    margin_titles=True
)
g = (g.map(plt.plot, 'Year','Life Ladder'))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Life Ladder on the Y-axis, Year on the X-axis. The grid’s columns are the continent, and the grid’s rows are the different levels of Mean Log GDP per capita. Overall things seem to be getting better for the countries with a Low Mean Log GDP per Capita in North America and the countries with a Medium or High Mean Log GDP per Capita in Europe

FacetGrid —直方图

g = sns.FacetGrid(data, col="Continent", col_wrap=3,height=4)
g = (g.map(plt.hist, "Life Ladder",bins=np.arange(2,9,0.5)))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

FacetGrid with a histogram of LifeLadder by continent

FacetGrid —带注释的 KDE 图

还可以向网格中的每个图表添加特定于方面的符号。在下面的示例中,我们添加了平均值和标准偏差,并在平均值处画了一条垂直线(代码如下)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Life Ladder kernel density estimation based on the continent, annotated with a mean and standard deviation

Draw a vertical mean line and annotation

FacetGrid —热图图

我最喜欢的绘图类型之一是热点图 FacetGrid,即网格中每个方面的热点图。这种类型的绘图对于在一个单独的绘图中可视化四个维度和一个指标非常有用。代码有点麻烦,但可以根据您的需要快速调整。值得注意的是,这种图表需要相对大量的数据或适当的分段,因为它不能很好地处理缺失值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Facet heatmap, visualizing on the outer rows a year range, outer columns the GDP per Capita, on the inner rows the level of perceived corruption and the inner columns the continents. We see that happiness increases towards the top right (i.e., high GDP per Capita and low perceived corruption). The effect of time is not definite, and some continents (Europe and North America) seem to be happier than others (Africa).

heatmap_facetgrid.py

牛逼:用 plotly 创造牛逼的互动情节

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Chris Leipelt on Unsplash

终于,再也没有 Matplotlib 了!Plotly 有三个重要特征:

  • 悬停:当悬停在图表上时,会弹出注释
  • **交互性:**无需任何额外的设置,图表可以是交互式的(即穿越时间的旅程)
  • 漂亮的地理空间图表: Plotly 已经内置了一些基本的制图功能,但是另外,人们可以使用 mapbox 集成来制作令人惊叹的图表。

散点图

我们通过运行fig = x.<PLOT TYPE>(PARAMS)fig.show()来调用 plotly plots,如下所示:

fig = px.scatter(
    data_frame=data[data['Year'] == 2018], 
    x="Log GDP per capita", 
    y="Life Ladder", 
    size="Gapminder Population", 
    color="Continent",
    hover_name="Country name",
    size_max=60
)
fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Plotly scatter plot, plotting Log GDP per capita against Life Ladder, where color indicates continent and size of the marker the population

散点图——漫步时光

fig = px.scatter(
    data_frame=data, 
    x="Log GDP per capita", 
    y="Life Ladder", 
    animation_frame="Year", 
    animation_group="Country name",
    size="Gapminder Population", 
    color="Continent", 
    hover_name="Country name", 
    facet_col="Continent",
    size_max=45,
    category_orders={'Year':list(range(2007,2019))}     
)fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Visualization of how the plotted data changes over the years

平行类别——可视化类别的有趣方式

def q_bin_in_3(col):
    return pd.qcut(
        col,
        q=3,
        labels=['Low','Medium','High']
    )_ = data.copy()
_['Social support'] = _.groupby('Year')['Social support'].transform(q_bin_in_3)_['Life Expectancy'] = _.groupby('Year')['Healthy life expectancy at birth'].transform(q_bin_in_3)_['Generosity'] = _.groupby('Year')['Generosity'].transform(q_bin_in_3)_['Perceptions of corruption'] = _.groupby('Year')['Perceptions of corruption'].transform(q_bin_in_3)_ = _.groupby(['Social support','Life Expectancy','Generosity','Perceptions of corruption'])['Life Ladder'].mean().reset_index()fig = px.parallel_categories(_, color="Life Ladder", color_continuous_scale=px.colors.sequential.Inferno)
fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Seems like not all countries with high life expectations are happy!

条形图—交互式过滤器的一个示例

fig = px.bar(
    data, 
    x="Continent", 
    y="Gapminder Population", 
    color="Mean Log GDP per capita", 
    barmode="stack", 
    facet_col="Year",
    category_orders={"Year": range(2007,2019)},
    hover_name='Country name',
    hover_data=[
        "Mean Log GDP per capita",
        "Gapminder Population",
        "Life Ladder"
    ]
)
fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Filtering a bar chart is easy. Not surprisingly, South Korea is among the wealthy countries in Asia.

Choropleth 图——幸福如何随时间变化

fig = px.choropleth(
    data, 
    locations="ISO3", 
    color="Life Ladder", 
    hover_name="Country name", 
    animation_frame="Year")fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Map visualization of how happiness evolves over the years. Syria and Afghanistan are at the very end of the Life Ladder range (unsurprisingly)

总结和结束语

今天到此为止。在本文中,您学习了如何成为一名真正的 Python 可视化忍者。你学会了如何更有效地进行快速探索,以及如何在该死的董事会开会时制作更漂亮的图表。您学习了如何创建交互式 plotly 图表,这在绘制地理空间数据时尤其有用。

如果你发现了一些奇妙的新的可视化效果,想要给出反馈,或者只是简单地聊聊天,请在 LinkedIn 上联系我。

如果你喜欢你所读的,看看我在 Medium 上写的其他文章。

用 5 个简单的步骤制作武器探测器

原文:https://towardsdatascience.com/plug-and-play-object-detection-code-in-5-simple-steps-f1975804373e?source=collection_archive---------11-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source

目标检测

在自定义数据集上使用 mask-RCNN 进行目标检测

对象检测是编码库中的一个有用工具。

它构成了许多奇妙工业应用的基础。其中一些是自动驾驶汽车、医学成像和人脸检测。

在我上一篇关于物体检测的文章中,我谈到了物体检测模型是如何发展的。

但是如果我们不能实现它,理论有什么用呢?

这篇文章是关于在我们定制的武器数据集上实现并获得一个物体探测器。

我们今天要特别解决的问题是使用 Mask-RCNN 的实例分割。

实例分割

我们可以为图像中的每个物体创建 蒙版 吗?具体来说就是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解决这个问题最常见的方法是使用 Mask-RCNN。Mask-RCNN 的架构如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source

基本上,它包括:

  • 像 resnet50/resnet101 这样的主干网络
  • 区域提案网络
  • ROI-对齐层
  • 两个输出图层-一个用于预测掩膜,一个用于预测类和边界框。

还有很多事情要做。如果你想了解更多的理论,请阅读我的上一篇文章。

[## 为数据科学家揭秘对象检测和实例分割

简单解释!!!我试过了

towardsdatascience.com](/a-hitchhikers-guide-to-object-detection-and-instance-segmentation-ac0146fe8e11)

这篇文章主要是关于代码

1.为实例分段创建自定义数据集

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Our Dataset

我们将要研究的用例是一个武器探测器。武器探测器是一种可以与街头摄像机和闭路电视一起使用来打击犯罪的东西。所以它非常漂亮。

因此,我开始从开放图像数据集下载 40 张枪和剑的图像,并使用 VIA 工具对它们进行注释。现在在 VIA 中设置注释项目是非常重要的,所以我将尝试一步一步地解释它。

1.通过设置

VIA 是一个注释工具,使用它你可以注释图像的边界框和遮罩。我发现它是最好的注释工具之一,因为它是在线的,可以在浏览器中运行。

要使用它,打开http://www.robots.ox.ac.uk/~vgg/software/via/via.html

您将看到如下页面:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来我们要做的是在 region_attributes 中添加不同的类名。在这里,我根据我们的用例添加了“枪”和“剑”,因为这是我想要注释的两个不同的目标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.注释图像

我把所有的文件都放在了文件夹data里。下一步是添加我们想要注释的文件。我们可以使用 VIA 工具中的“添加文件”按钮在data文件夹中添加文件。并在选择折线工具后开始标注标签,如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Click, Click, Enter, Escape, Select

3.下载注释文件

点击 VIA 工具顶部菜单上的save project

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过更改项目名称字段,将文件另存为via_region_data.json。这将把注释保存为 COCO 格式。

4.设置数据目录结构

我们将需要首先设置数据目录,以便我们可以进行对象检测。在下面的代码中,我创建了一个我们将要使用的模型所需要的目录结构。

运行上述代码后,我们将获得以下文件夹结构中的数据:

- procdata
     - train
         - img1.jpg
         - img2.jpg
         - via_region_data.json
     - val
         - img3.jpg
         - img4.jpg
         - via_region_data.json

2.设置编码环境

我们将使用来自[matterport/Mask_RCNN](https://github.com/matterport/Mask_RCNN) GitHub 库的代码。您可以从克隆存储库和安装所需的库开始。

git clone [https://github.com/matterport/Mask_RCNN](https://github.com/matterport/Mask_RCNN)
cd Mask_RCNN
pip install -r requirements.txt

一旦我们完成了依赖项的安装和 repo 的克隆,我们就可以开始实现我们的项目了。

我们在Mask_RCNN文件夹中复制了一份samples/balloon目录,并创建了一个***samples/guns_and_swords*** 目录,我们将在这里继续我们的工作:

cp -r samples/balloon ***samples/guns_and_swords***

设置代码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Yes. We are doing AI

我们从重命名开始,将***samples/guns_and_swords*** 目录中的 balloon.py 改为 ***gns*.py**balloon.py文件现在只训练一个目标。我已经扩展到使用多个目标。在这个文件中,我们更改了:

  1. balloonconfiggnsConfig
  2. BalloonDatasetgnsDataset:我们在这里修改了一些代码,以便从我们的注释数据中获取目标名称,并给出多个目标。
  3. 以及train功能的一些变化

此处仅显示更改后的gnsConfig以让您有所了解。你可以在这里看一下整个[gns.py](https://github.com/MLWhiz/data_science_blogs/blob/master/object_detection/guns_and_swords/gns.py)代码。

3.可视化图像和遮罩

一旦我们完成了对gns.py文件的修改,我们就可以可视化我们的遮罩和图像了。简单按照这个[Visualize Dataset.ipynb](https://github.com/MLWhiz/data_science_blogs/blob/master/object_detection/guns_and_swords/1.%20Visualize%20Dataset.ipynb) 笔记本就可以了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.用迁移学习训练 MaskRCNN 模型

为了训练 maskRCNN 模型,在 Guns and Swords 数据集上,我们需要在命令行上运行以下命令之一,这取决于我们是否要用 COCO 权重或 imagenet 权重初始化我们的模型:

# Train a new model starting from pre-trained COCO weights
 python3 gns.py train — dataset=/path/to/dataset — weights=coco# Resume training a model that you had trained earlier
 python3 gns.py train — dataset=/path/to/dataset — weights=last# Train a new model starting from ImageNet weights
 python3 gns.py train — dataset=/path/to/dataset — weights=imagenet

weights=last的命令将从最后一个纪元恢复训练。重量将保存在Mask_RCNN文件夹的logs目录中。

这就是我们最后一个纪元后的损失。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Tensorboard 可视化损失

你可以利用 tensorboard 来可视化你的网络是如何运行的。只需运行:

tensorboard --logdir ~/objectDetection/Mask_RCNN/logs/gns20191010T1234

你可以在

[https://localhost:6006](https://localhost:6006)

这是我们面具损失的样子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到,验证损失表现得相当突然。这是意料之中的,因为我们在验证集中只保留了 20 张图像。

5.新图像预测

预测一个新的图像也很容易。使用我们训练过的模型,按照[prediction.ipynb](https://github.com/MLWhiz/data_science_blogs/blob/master/object_detection/guns_and_swords/2.%20predict.ipynb)笔记本来看一个最小的例子。下面是代码的主要部分。

这是验证集中一些图像的结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

丰富

结果看起来不是很有希望,还有很多需要改进的地方,但这是意料之中的,因为训练数据非常少(60 张图像)。人们可以尝试做以下事情来提高这种武器探测器的模型性能。

  1. 由于时间限制,我们只对 60 幅图像进行了训练。当我们使用迁移学习时,数据仍然太少——注释更多的数据。
  2. 训练更多的时代和更长的时间。看看验证损失和培训损失是什么样子的。
  3. 更改Mask_RCNN目录下mrcnn/config 文件中的超参数。关于这些超参数意味着什么的信息,看看我以前的帖子。你可以看看主要的几个:
# if you want to provide different weights to different losses
LOSS_WEIGHTS ={'rpn_class_loss': 1.0, 'rpn_bbox_loss': 1.0, 'mrcnn_class_loss': 1.0, 'mrcnn_bbox_loss': 1.0, 'mrcnn_mask_loss': 1.0}# Length of square anchor side in pixels
RPN_ANCHOR_SCALES = (32, 64, 128, 256, 512)# Ratios of anchors at each cell (width/height)
# A value of 1 represents a square anchor, and 0.5 is a wide anchor
RPN_ANCHOR_RATIOS = [0.5, 1, 2]

结论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Christopher Gower on Unsplash

在这篇文章中,我谈到了如何使用 Mask-RCNN 为自定义数据集实现实例分割。

我试图使编码部分尽可能简单,并希望你发现代码有用。在本文的下一部分,我将使用 web 应用程序部署这个模型。敬请关注。

你可以在 Github 下载带注释的武器数据和代码。

如果你想了解更多关于各种 物体检测技术,运动估计,视频中的物体跟踪等 。,我想推荐这个关于计算机视觉深度学习的很棒的课程

谢谢你的阅读。将来我也会写更多初学者友好的帖子。在 媒体 关注我,或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

此外,一个小小的免责声明——在这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。

Google BigQuery 中的加号代码(开放位置代码)和脚本

原文:https://towardsdatascience.com/plus-codes-open-location-code-and-scripting-in-google-bigquery-30b7278f3495?source=collection_archive---------15-----------------------

我们不是已经有街道地址了吗?

几周前,我参加了 2019 年谷歌的 Geo For Good 峰会。这是一次令人惊叹的经历,对于我见过的人、每个人正在做的工作以及会议本身,我说不出有多好。

当我参加会议时,我会随机选择至少一个我不熟悉的主题。我们都花了太多的时间专注于巩固我们的专业领域,有时会错过很多其他重要的话题。这就是我拓展业务的方式。

我选择了“带加号代码的数字寻址”,这是最让我难忘的一次会议。

那么什么是加代码?它是由开放位置代码地理编码系统生成的代码的名称。这个代码给你一个四位数的区号(只有在 25 公里内没有最近的城镇时才需要),和一个六位数的本地代码(注意,即使它们是字母数字,在加号代码中术语称每个字符为一个“数字”)。在最后两位数字之前有一个“+”符号,它实际上并不传达任何数据,只是为了更容易记住(很像电话号码中的破折号和空格)。十位数格式看起来像“8FVC9G8F+6W”(这是谷歌在苏黎世的办公室所在地)。如果包括城镇名称,还可以使用最后六位数字,因此这将是“9G8F+6W 苏黎世,瑞士”如果你在谷歌地图中输入任何一种格式,它会带你去那里。

谷歌地图多年来一直在搜索结果中包含加号代码。如果你曾经在地图上看到一个随机的字符串,并想知道那是什么,那么,这就是它。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

It’s been hiding there the whole time!

如果你想全面了解 Plus Codes(它的动机、优点、缺点等等。),强烈推荐在线阅读开放位置代码定义

简而言之,它实际上是将整个地球转换成一个 20 度乘 20 度的网格。第一对数字定位该网格中的单元格。从那里开始,每一个后续对都表示该单元格内网格中的一个位置,直到到达最后一对。可以把它想象成地图上不同级别的缩放。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Needs more zoom!

真正酷的事情是,一个十位数的代码(或一个六位数的城市名称代码)提供足够的精度来识别一个 14x14 米的正方形。考虑到使用它需要记住的信息是如此之少,这已经很不错了。

我想在我位于纽约的谷歌办公室尝试一下。地址是纽约州纽约市第八大道 111 号,邮编 10011。该坐标的加号代码是纽约 PXRX+86。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

PXRX+86 New York points to 16th St. and 8th Ave… I think.

完整代码是 87G7PXRX+86。我们提到的前两位数字给出了网格的最高级别。那看起来像什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Here’s 87. That’s a big grid.

如果我们看看这个网格,我们可以看到额外的 G7 加入了这个网格。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

87G7. Enhance.

你添加的数字对越多,你能得到的细节就越多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

87G7PX. Enhance

最终,你可以钻到我们快乐的小角落。你可以在地图下方的红框中看到这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

87G7PXRX+86, in red. Enhance.

如果你想加入 Plus Code fun,可以在 Plus Codes 网站上找到这个地图工具

你可以看到这些代码可以变得多么精确。这比普通的街道地址要准确得多,也更有意义。大多数时候,街道地址甚至不会带你去你想去的地方。例如,如果你想联系约翰霍普金斯大学,街道地址是 3400 N Charles Street,Baltimore,MD 21218 。尽管查尔斯街北 3400 号实际上并不在查尔斯街北,但校园的其他部分都有相同的街道地址,不管它是哪栋建筑。

Plus 代码可以提供足够的精度来指引某人到建筑物的确切位置。让我们回头看看更早的 Google NYC 的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

So… where am I supposed to go?

这栋楼的地址有些问题。第一,它没有告诉你确切的方向。这座大楼有三个访客入口。一个在第 16 街和第 9 大道的建筑西北侧,一个在第 16 街和第 8 大道的东北侧,一个在第 15 街和第 8 大道的东南侧。

但是在你用访客入口玩“三号门后面是什么”之前,你需要确保你有正确的地址。原来这栋楼有两个有效的街道地址。第八大道 111 号和第九大道 76 号。

有了加号代码,我们可以得到粒度。NW 入口为 PXRW+R7 ,NE 入口为 PXRX+C8 ,SE 入口为 PXRX+75

你可能认为这都是微不足道的。你可以很容易地给一个朋友一个街道地址,然后说“去东北入口”,这很容易找到。然而,在世界上的许多地方,地址精确度的相同问题有非常真实的后果。

在大多数工业化国家,物理地址——当然还有电子地址——是日常生活的一部分。就像道路、自来水和卫生服务一样,物理地址通常被视为理所当然。然而,在发展中国家,实际地址往往只存在于大城市中心。在这些国家,许多街道没有名字,房产也没有编号。因此,公共服务和企业很难或不可能接触到它们的目标客户……在大多数工业化国家,物理地址被认为是理所当然的。但是对于数十亿人来说,地址实际上并不存在。(面向世界——万国邮政联盟)

在峰会的 Plus Codes 会议上,我们听取了纳瓦霍部落成员分享他们在犹他州/新墨西哥州/亚利桑那州地区面临的挑战,以及 Plus Codes 如何帮助解决这些挑战。

在像这样的区域,你会得到很多远离街道地址所在道路的位置,你会得到几英里不正确的地址,并且通常会有很多定位问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The officially listed address, and where the building actually is. When it’s this far off, it creates a lot of issues.

这是另一个例子,有人讲述了他们将包裹运送到这个地区的经历。

大约在 2005 年,我想在网上购买一台新的笔记本电脑,并试图让联邦快递将包裹送到我在 AZ dil kon 的 hogan,因为我住的地方距离主要公路(纳瓦霍 15 号公路)大约 0.5 英里。我提交给联邦快递的地址如下:

名称
迪尔康分会办公室以北 1 英里
灰色屋顶的蓝色霍根
亚利桑那州温斯洛,邮编 86047

在命令的进一步指示部分,我写了如下内容:从分会办公室向北,经过警察局和一座大教堂。经过教堂建筑,你会穿过一个大水池。这条路有点弯曲,但一直向北走。你会看到一片大树。朝那些树走。他们应该是这个地区唯一的一片树林。我的霍根会在那些树附近,蓝色的霍根有灰色的屋顶。我也留下了我的手机号码,以防有什么问题。

我通过联邦快递网站跟踪递送过程,并确保在递送当天我可以通过电话联系到。我暗暗希望我的指示足以让送货员找到我的霍根,把包裹送出去。然而,下午 4 点左右,我接到了联邦快递送货员的电话。他迷路了。他曾试图按照指示走,但最终却来到了一所没有人的房子里。在请他描述了这个地区之后,我断定他走得还不够远。事实上,他还在去我家的半路上,在大教堂附近,还没有去洗澡。所以当他在打电话和开车的时候,我把他带到了我的家,当他描述他所看到的时候,我给了他一个接一个的方向。

最终他到了我家,但这次经历并不理想。(司机不知道什么是霍根。)

从我在韩国长大的经历中,听到这样的事情让我产生了共鸣。直到 2000 年中期,我们还没有传统意义上的建筑地址。有明确的区域和街区,但建筑物没有街道号码。指路的时候,你只需要知道东西在哪里。告诉别人类似“从地铁站的第六个出口出去,在全家超市后左转进入小巷,继续走,它就在 LG 手机店上面的第二层”这样的话很常见。街道地址通常不会被使用,现在也不会。

首尔相当发达,所以对我的影响可能是见朋友晚了一点。然而在其他领域,这是一个严重的问题。

Finding addresses in rural Utah and Arizona.

Finding addresses in Kolkata, India.

没有明确的位置不仅会影响包裹的递送,还会影响急救人员的效率、获得出生证明、投票等等。这种情况发生在纳瓦霍部落、加尔各答,无疑还有世界上无数其他地区。加码可以帮助,影响的机会是有意义的。

BigQuery 脚本和过程

我喜欢 BigQuery 的原因有很多。在使用了许多不同的遗留数据技术之后,BigQuery 是最容易维护的,并且最擅长立即让我对数据做一些很酷的事情,而不是坐在这里探索基础设施,想知道为什么无论是什么都不能与无论是什么都不能工作。

话虽如此,没有任何事物和任何人是完美的。BigQuery 缺少一些我正在寻找的东西。脚本和存储过程曾经是一个很好的例子。

不久前,这些功能公开发布

这让我非常非常开心。

Plus 代码和 BigQuery 脚本。

Open Location Code 有一个不同语言的开源代码库,可以生成和读取 Plus 代码。当 BigQuery 脚本发布时,我认为创建编码 Plus 代码的东西可能是引入这个新特性的一个好方法。它允许轻松地批量编码坐标,BigQuery 在大规模处理中带来了许多好处。

让我们看看编码逻辑。根据规范,这是一个非常简单的编码程序:

总结:在纬度上加 90,在经度上加 180,强制它们进入正范围。使用上面的符号将纬度和经度编码为基数 20,每个数字五位,即位值为 0.000125。从纬度开始,交错数字。

下面提供了一种从最低有效位到最高有效位对值进行编码的算法:

1 —在纬度上加 90 度,在经度上加 180 度,两者都乘以 8000,将整数部分分别作为纬度和经度
2 —用具有经度模数 20 的整数部分的符号作为现有代码的前缀
3—用具有纬度模数 20 的整数部分的符号作为现有代码的前缀
4 —将经度和纬度除以 20
5 —从步骤 2 开始重复四次以上。

看起来像是一个简单的循环,我们可以在脚本中完成。

让我们使用来自不同谷歌办公室的经度和纬度来看看它是如何工作的。办公地点来自六大洲的多个国家,因此我们可以对两个半球进行现场测试。这些位置将作为脚本中的输入表。

# Create array of encoding values.
DECLARE OLC_DIGITS_ ARRAY<STRING> DEFAULT ['2','3','4','5','6',
  '7','8','9','C','F','G','H','J','M','P','Q','R','V','W','X'];# Control variable.
DECLARE loopControl INT64 DEFAULT 0;# Create example source data.
CREATE OR REPLACE TEMP TABLE
  pc_data (
    latitude float64,
    longitude float64,
    expectedCode STRING);INSERT
  pc_data (
    latitude,
    longitude,
    expectedCode)
VALUES
  (40.740737, -74.002047,'87G7PXRX+75'),
  (37.500172, 127.036404,'8Q99G22P+3H'),
  (35.660797, 139.729442,'8Q7XMP6H+8Q'),
  (-23.586436, -46.681907,'588MC879+C6'),
  (12.993711, 77.660769,'7J4VXMV6+F8'),
  (-26.073533, 28.032052,'5G5CW2GJ+HR'),
  (-33.864971, 151.195854,'4RRH45PW+28'),
  (59.333260, 18.054152,'9FFW83M3+8M');# STEP 1 - Normalize coordinates.
CREATE temp table olc_table AS (
  SELECT
    *,
    FLOOR((latitude + 90) * 8000) AS workingLatitude,
    FLOOR((longitude + 180) * 8000) AS workingLongitude,
    '' AS plusCode
  FROM
    pc_data);
SELECT
  *
FROM
  olc_table;

# STEP 2 - Loop through the encoding loops.
SET
  loopControl = 0;
WHILE
  loopControl < 5 DO CREATE OR REPLACE TEMP TABLE olc_table AS(
  SELECT
    * EXCEPT (
      workingLatitude,
      workingLongitude,
      plusCode),
    workingLongitude / 20 AS workingLongitude,
    workingLatitude / 20 AS workingLatitude,
    CONCAT(
      OLC_DIGITS_[
        OFFSET(MOD(CAST(FLOOR(workingLatitude) AS INT64), 20))], 
      OLC_DIGITS_[
        OFFSET(MOD(CAST(FLOOR(workingLongitude) AS INT64), 20))],
      plusCode) AS plusCode
  FROM
    olc_table );
SET
  loopControl = loopControl + 1;
SELECT
  *
FROM
  olc_table;
END WHILE;# STEP 3 - Add the Plus!
CREATE OR REPLACE temp table olc_table AS(
  SELECT
    * EXCEPT (plusCode,
      workingLongitude,
      workingLatitude),
    CONCAT( SUBSTR(plusCode, 0, 8), '+', SUBSTR(plusCode, -2)) AS plusCode
  FROM
    olc_table );# Look at the results!
SELECT
  *
FROM
  olc_table;

当我们运行它时,通常显示结果数据的底部面板看起来像这样。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A script’s output.

这是新的输出信息,显示了 BigQuery 运行。这对于调试很方便,因为您可以看到中间数据进入每个执行的语句。如果您在最后一步单击“查看结果”按钮,您将找到脚本结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Much success!

我希望代码易于阅读(请留下带问题的评论),但只是对我们在这里做的一些事情做一些注释。

  • 在步骤 2 的循环中,我们创建和/或替换一个临时表。这是与脚本一起发布的新特性,我们将使用它来对整个列执行操作。
  • 在脚本中,我们手动创建一个临时表作为源表。如果您想在另一个有坐标数据的表上运行这个,您可以去掉那个特定的部分,让创建的olc_table指向您的源表。
  • 如果您想将输出写到另一个表,只需在最后一个SELECT语句的末尾加上一个CREATE TABLE [dataset.table] AS,就可以了。

从这里你可以把这个脚本放到一个存储过程中,并把它合并到其他工作流中!

现在,您可以快速浏览 BigQuery 脚本和编码坐标,并批量添加代码!

要了解更多关于 Plus Codes 的信息,请务必查看公开发布的 2019 年 Geo for Good Summit Plus Codes 会议的幻灯片内容。这是纳瓦霍部落的人们出席的会议。另外,请查看议程页面,了解幻灯片内容以及任何适用的培训材料发布到的所有其他会议!谷歌地球上有很棒的东西,地球引擎就在那里!

此外,请务必查看为解决未解决的问题所做的工作,这些工作有助于让世界更容易了解这些位置。

基于深度学习的胸片肺炎检测

原文:https://towardsdatascience.com/pneumonia-detection-from-chest-radiograph-cxr-d02c2fc11609?source=collection_archive---------23-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

肺炎占全球 5 岁以下儿童死亡总数的 15%以上。2015 年,有 92 万名 5 岁以下儿童死于该疾病。虽然肺炎很常见,但准确诊断却很困难。它需要由训练有素的专家审查胸片(CXR ),并通过临床病史、生命体征和实验室检查进行确认。

胸片基础知识

在拍摄图像的过程中, X 射线穿过身体,到达另一侧的探测器。具有稀疏物质的组织,如充满空气的肺,不吸收 X 射线,在图像中显示为黑色。骨骼等致密组织吸收 X 射线,在图像中显示为白色。简而言之

*黑色=空气

*白色=骨头

*灰色=组织或液体

按照惯例,主体的左侧在屏幕的右侧。还可以看到右上角的小 L。我们在正常图像中看到的肺部是黑色的,但它们有不同的投影——主要是胸腔骨骼、主气道、血管和心脏。

胸部 x 光照片示例如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

肺炎通常表现为 CXR 上一个或多个区域的肺部阴影增加。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然而,在 CXR 上肺炎的诊断是复杂的,因为肺部有许多其他情况,如液体超载(肺水肿)、出血、容量损失(肺不张或虚脱)、肺癌、或放疗后或手术后的变化。在肺外,胸膜腔内的液体(胸腔积液)在 CXR 上也表现为阴影增加。如果可以的话,比较患者在不同时间点的 CXRs 以及与临床症状和病史的相关性有助于做出诊断。

此外,临床医生每次轮班都要阅读大量图像。疲劳或分心的临床医生可能会错过图像中的重要细节。在这里,自动图像分析工具可以提供帮助。例如,人们可以使用机器学习来自动进行潜在肺炎病例的初步检测(成像筛查),以便优先考虑和加快他们的审查。因此,我们决定开发一种从胸片中检测肺炎的模型。

资料组

我们使用了来自 kaggle 的 RSNA 肺炎检测挑战的数据集。这是一个带有注释的胸部 x 光数据集,它显示了肺部的哪一部分有肺炎的症状。

安装机器学习工具

我们将使用 Intelec AI 训练一个检测肺炎的模型。你可以从这里免费下载并安装。

数据准备

我们从 kaggle 下载了训练图像(stage_2_train_images.zip)和注释(stage_2_train_labels.csv) 。注释文件如下所示:

import pandas as pdann = pd.read_csv('stage_2_train_labels.csv')
ann.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图中的第一行对应于编号为“0004 CFA b-14fd-4e 49–80ba-63 a80 b 6 bddd 6”的患者。此行的“目标”列为 0。意味着这个病人没有肺炎。另一方面,最后一排的患者患有肺炎,因为相应的胸片上的区域(xmin = 264,ymin = 152,宽度= 213,高度= 379)具有不透明。

我们决定用 SSD 物体探测器。Intelec AI 要求注释文件包含 image_name、xmin、ymin、xmax、ymax 和 class_name 列。因此,我们将数据转换成这种格式:

ann['image_name'] = ann.patientId + '.dcm'
ann = ann.rename(columns = {'x': 'xmin', 'y': 'ymin'})
ann['xmax'] = ann.xmin + ann.width
ann['ymax'] = ann.ymin + ann.heightann['class_name'] = np.NaN
ann['class_name'][pd.notna(ann.xmin)] = 'pneumania'
ann = ann[['image_name', 'xmin', 'ymin', 'xmax', 'ymax', 'class_name']]ann.head(10)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图中的前 4 幅图像(第 0-3 行)没有肺炎注释。另一方面,图像“00436515–870 c-4b 36-a041-de 91049 b 9 ab 4 . DCM”有两个注释(第 4 行和第 5 行)。我们将其保存在“annotations.csv”文件中。

然后,我们创建一个“images”文件夹,并从 stage_2_train_images.zip 中提取所有图像。所有提供的图像都是 DICOM 格式。dcm)。

import os
images = os.listdir('images')
images[:5]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,我们的数据集看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后我们创建了一个训练来训练我们的 SSD 对象检测器。事情是这样简单明了的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们开始训练,它跑了一天。当它不能再提高训练精度时,它就自动停止训练。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点击训练总结显示地图得分 0.2725 。我们部署它是为了检查它的性能。使用新的胸部 x 光照片测试展开的模型给出了以下结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

预测看起来不错。但是它有多好,我们真的不能说,因为我们的团队中没有任何临床医生。

改进建议

从图像中检测肺炎仍然是一项需要使用深度学习来解决的困难任务。我们获得的地图分数 0.2725 很低。对于大多数对象检测任务,它通常高于 0.5。问题是,对象检测器擅长检测具有预定义形状和外观的对象。另一方面,肺部阴影没有精确的形状。这使得这个问题变得如此困难。我们将对如何进一步提高精度给出一些想法。

招数一:检测前分类

我们观察到,我们的算法有很高的假阳性率,即它在图像中检测到肺炎,而它不应该检测到肺炎。因此,如果我们将给定的胸片分类为“有无肺炎”,并且仅在它有肺炎的情况下用目标检测器检测肺炎症状,这将大大提高检测准确性。

招数二:先检测肺部

另一个问题是,在胸片中,不透明度(“白色像素”)也存在于肺的外部。但是我们总是检测肺部阴影,因为我们知道肺炎与肺部问题有关。我们可以让我们的对象检测器从训练数据中学习这一点,或者我们可以帮助它单独检测肺部,并在下一步检测肺部的肺炎。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参考

Intel EC AI:https://www . Intel EC . AI

RSNA 肺炎检测挑战:https://www . ka ggle . com/c/rsna-Pneumonia-Detection-Challenge/

什么是肺部阴影?https://www.kaggle.com/zahaviguy/what-are-lung-opacities

诗意神经网络

原文:https://towardsdatascience.com/poetic-neural-networks-487616512?source=collection_archive---------9-----------------------

教神经网络如何写阿拉伯诗歌

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: artfire.com

如果明天诗歌消失了,股票市场不会崩盘,桥梁不会倒塌,电脑仍会运转。

然而,诗歌具有独特的价值,因为它表达了我们内心无法量化或测量的东西。在这篇文章中,我们将尝试使用神经网络生成诗歌,但有一个额外的警告:它将使用阿拉伯语

总之,这篇文章跨越了以下几点:

  • 我们如何创建自定义数据集
  • 如何预处理数据
  • RNN 的超参数调谐
  • 阿拉伯语诗歌输出(和英语翻译)

请随意跳过技术部分,直接跳到输出。底部有一个 GitHub 库的链接。

来自大马士革的诗人

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Nizar Qabbani (source: Edarabia.com)

尼扎尔·卡巴尼是一位叙利亚诗人,他以探索爱情、民族主义、色情和宗教的诗歌而闻名。此外,他是一位多产的作家,这意味着他的工作为我们的神经网络提供了潜在的大量数据。

以下是他作品的样本:

你是谁
像匕首一样闯入我生命的女人
温和如兔眼
柔软如梅皮
纯洁如茉莉花串
天真如儿童围兜
贪婪如言语?

作为第一步,我们需要创建一个包含大部分(如果不是全部)他已知作品的文本语料库。幸运的是,我们可以找到专门保存 Qabbani 作品的网站。

使用像 BeautifulSoup、这样的软件包,人们可以收集数据并创建一个包含我们能找到的所有可用作品的语料库。收集了所有的诗歌,数据量略低于 1MB,约为 100 万个字符,约有 32,000 个独特的单词。有关需要多少数据的更多信息,请参考下面参考资料中的 Andrej Karpathy 帖子。

尽管看起来像是大量的文本,但实际上,它被认为是一个非常小的数据集,这可能会限制我们的目的。

论阿拉伯语的特殊性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: Whyseen on pinterest.com

与拉丁字符不同,阿拉伯语是从右向左读的。此外,没有大写或小写字符之类的东西。此外,元音和辅音的概念不同于英语。

关于这种语言和其他语言与英语的不同还有更多方面。已经有了用英语以外的语言创作诗歌的成功例子,比如中文(见底部的参考文献)。

准备数据

这一步包括创建一个返回两个字典的查找表:

  • 整数到 vocab
  • vocab 到整数

接下来,我们使用空格作为分隔符将脚本分割成一个单词数组。然而,像句点和感叹号这样的标点符号可以为同一个单词创建多个 id。比如“拜拜”“拜拜!”会生成两个不同的单词 id。

我们实现了一个函数来返回一个字典,该字典将用于标记像“!”这样的符号变成“||感叹号| |”,我们的列表看起来像:

  • 句号(。)
  • 逗号(,)
  • 返回(\n)
  • 回车符(\r)

该字典将用于标记符号并在其周围添加分隔符(空格)。这将每个符号作为自己的单词分开,使神经网络更容易预测下一个单词。

超参数和调整

一般来说,我们可以用更大的隐藏和n_layer维度得到更好的结果,但是更大的模型需要更长的训练时间。下面是要调整的参数列表:

  • sequence_length :序列的长度。
  • batch_size :批量大小。
  • 次数:训练的次数。
  • learning _ rate:Adam 优化器的学习速率。
  • vocab_size :我们词汇表中惟一记号的数量。
  • 输出尺寸:输出所需的尺寸。
  • 嵌入 _ 尺寸:嵌入尺寸;小于 vocab_size。
  • hidden_dim :我们 RNN 隐藏的维度。
  • n _ layers:RNN 的层数/单元数。

模仿诗人

参数设置好了,模型训练好了,我们可以进入有趣的部分了:生成诗歌!

要做到这一点,我们必须定义prime_word,它是开始的单词。在下面的小节中,我们将展示一些结果。

أنا (我/我):

أنا كهذا الماء ؟.
وظلت شيخ حارتنا..
وتشاهد أسماكٌ وبحار.
وتشاهد فهم أنفسنا
الخائفون من الخشب
ويضاجعون تطرف يعنيها.
تنقرض الأمة من الأصل ذكورا..
تهاجر أسماكٌ وبحار..
وعدت..
بإلغاء

粗略翻译:

我像这水吗?我成了我们街区的酋长…你会看到鱼和海洋。
你看《了解我们自己》
害怕木头
他们带着极端主义睡觉。这个民族是从男性起源开始灭绝的。鱼和海洋会迁徙…我答应了…
取消

“يا”

يا قطتي الخليفة
وباركنا في جبيني
خليفةٌ في خاصرة التعذيب الأوسط

هل سأقرأ حـيٍ ، ينسـى القط؟ 
والزنبق الأسود ، والشذا ومستواه
فقصها..
وبقينا نسأل أنفسنا
وفي غرف الإنعاش ،
وألوان للعشاء
قطعاً في

粗略翻译:

我的继任者阿猫
保佑我们在我的额头上
一个哈里发在中间一边折磨

我会活着读书吗,猫会忘记吗?
黑色百合,香味和它的等级
所以切吧…
我们不停地问自己
在恢复室里,晚餐的
和颜色
绝对在

《نحن》(我们)

نحن عشته
لا تحسبي أن أحبك في البيادر
في أخبار التاريخ,.
تنقرض الأمة يعنيها.
تنقرض الأمة من عارٍ فيها– الحداد..
عيونها على ذراعيها..
ومذيع الدولة في أجساد الأميره ؟

يا رب أيـن ملتفٌ نسبي

粗略翻译:

我们经历了它
不要以为我爱你在历史新闻的花园里

这个民族灭绝了。这个国家因为它的耻辱——哀悼而灭绝了…
她的眼睛在她的胳膊上…
公主的尸体和国家广播电台?

主啊,相对的缠绕在哪里?

“امرأة”(女人)

امرأة كلها...
يا كل عامٍ في الطبيعة..
ومذيع الدولة في جرحنا
نتفاءل جميله..
ووجدنا جسداً مغتصباً..
ومذيع الدولة ؟؟ 
من هؤلاء هؤلاء الهدبـا
من هؤلاء سقيت أعماقي وإرهاقي برأس أدبي؟

粗略翻译:

一个完整的女人……
哦,大自然中的每一年…
国家广播公司是在伤害我们
美好的乐观主义…我们发现了一具被强奸的尸体。
还有国家广播公司??
这些都是纤毛
这些被水浇得很深、筋疲力尽却顶着文艺脑袋的人是谁?

结论

我们可以看到,我们对诗歌的尝试不如原作者那样连贯,当然也不如原作者那样雄辩。在某些方面,写作是滑稽的,打破了所有的语法和逻辑规则。

我们的缺点的一个可能的原因可能是训练数据不足,因为理想情况下,我们需要至少 3MB 价值的文本。此外,可能需要考虑语言本身的独特方面。然而,请记住,RNN 人不得不从头开始学习最难的语言之一。

我希望您喜欢阅读这篇文章,并对文本生成的可能性有所了解。我也希望非英语母语的深度学习社区成员能够在他们自己的母语社区中预见潜在的有益应用。

[## NadimKawwa/poeticnurealnetworks

此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…

github.com](https://github.com/NadimKawwa/PoeticNeuralNetworks)

参考

[## شعر نزار قباني

نزار قباني دبلوماسي و شاعر عربي. ولد في دمشق (سوريا) عام 1923 من عائلة دمشقية عريقة هي أسرة قباني ، حصل على البكالوريا…

www.nizariat.com](https://www.nizariat.com/) [## 递归神经网络的不合理有效性

递归神经网络(rnn)有一些神奇的东西。我仍然记得当我训练我的第一个循环…

karpathy.github.io](http://karpathy.github.io/2015/05/21/rnn-effectiveness/) [## 1 MB 中有多少个字符?txt 文件?

问这个问题已经有了答案:我正在开发一个 Android 应用程序,它使用意图字符串,从一个…

stackoverflow.com](https://stackoverflow.com/questions/48698786/how-many-character-in-1-mb-txt-file) [## 用 RNN 编解码器生成中国古典诗歌

我们把中国古典诗词诗句的生成看作是一个序列到序列的学习问题,并建立了一个新颖的…

arxiv.org](https://arxiv.org/abs/1604.01537)

与 Python 的点双列相关

原文:https://towardsdatascience.com/point-biserial-correlation-with-python-f7cd591bd3b1?source=collection_archive---------4-----------------------

线性回归是确定数据文件的两个或多个连续特征之间相关性的经典技术。当然,只有当特征具有几乎线性的关系时,这才是理想的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Linear Regression from Towards Data Science article by Lorraine Li.

但是,如果我们需要确定二分数据(即二进制数据)和连续数据之间的相关性,该怎么办呢?那不能得到我们上面看到的直线。这就是双列杂交对我们有帮助的地方。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Providence Doucet on Unsplash

点双列相关及其计算方法。

点双列相关系数与线性回归中使用的皮尔逊相关系数相同(从-1 到 1 测量)。唯一的区别是我们比较的是二分数据和连续数据,而不是连续数据和连续数据。从这一点开始,让我们假设我们的二分数据由两组(组 0 和组 1)的项目组成,连续数据为“y”。该系数通过以下公式计算:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Modified Point Biserial Correlation Formula from Wikipedia.

其中:

M0 =第 0 组数据的平均值。

M1 =第 1 组数据的平均值。

Sy =连续数据的标准偏差。

n0 =组 0 中的项目数。

n1 =组 1 中的项目数。

n =两组中的项目总数(也称为数据集中的总行数)。

应用点双列相关

PBC 经常用于分析多项选择测试问题,以确定它们是否是充分的问题。成为一个充分的问题意味着回答这个问题的人群(比如一类学生)不会觉得这个问题太容易(接近 1)或者太混乱(接近 0 或者负相关)。

ZipGrade ,一个从你的手机上扫描多项选择答题卡的应用程序,为我们扫描的测试数据提供了方便的 CSV 文件。我将从我给学生的代数测验中抽取一个。下面是我给学生的多项选择测验的部分数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Multiple-Choice Quiz data with the scores (Percent Correct) and points earned from the question in each question column.

“正确率”是学生获得的分数。每个“Q#”栏是学生回答正确(2 分)或错误(0 分)的分数。该数据集还表明,二分法数据不一定需要严格采用 0 或 1 格式,因为您会为机器学习模型编码数据。因为公式只关心每组中的项目数,所以它们是如何标记的并不重要。

SciPy 方便的有一个叫做pointbiserialr的点双列相关函数。我们将把这个函数应用于第一个问题“Q1”。

这给了我们以下结果:

PointbiserialrResult(correlation=0.555989931309585, pvalue=1.5230357095184431e-06)

这导致了约 0.56 的相关性和相关的 p 值,以说明相关性是否具有统计学显著性。

对于我们的情况,这种相关性意味着这个测试问题对于我的学生来说是一个公平的问题。如果相关性接近 1,那就意味着这个问题太简单了,也许不需要包括在内。更接近于 0 或负值的相关性将表明问题可能做得不好或对学生不公平。这个主题的扩展可以在以后的文章中讨论。

从头开始点双列相关

正如我们在我写的关于超几何分布的文章中所做的,我想借此机会展示我们如何用 Python 从头开始创建这个公式。

这个版本将二分数据列、连续数据列和相关数据框的名称作为参数。为了重新创建我们的例子,我们将调用函数为pbc_scratch(‘Q1’, ‘Percent Correct’, data)。我不认为这是创建函数的最佳方式,所以我欢迎任何有更好实现的人在下面的评论中分享。

额外资源

感谢阅读!我希望这篇教程对你有所帮助。如果你想要一个视频版本来巩固你对点双列相关的理解,你可以看看下面的视频。它有一个更一般的例子和另一个选择题的例子,以及进一步的解释意义。

你可以在 LinkedinTwitter 上关注或联系我。我对 Twitter 上的 DM 持开放态度。如果你喜欢这篇文章,可以看看下面我写的关于超几何分布的类似文章:

[## 用 Python 解释超几何分布

数学课上的概率问题,你需要的概率要么给你,要么相对容易…

towardsdatascience.com](/hypergeometric-distribution-explained-with-python-2c80bc613bf4)

如果你喜欢阅读 Medium,并愿意进一步支持我,你可以使用我的推荐链接注册 Medium 会员。这样做可以用你的会费的一部分在经济上支持我,我将不胜感激。

直到下一次,

约翰·德杰苏斯

点云数据:简单方法

原文:https://towardsdatascience.com/point-cloud-data-simple-approach-f3855fdc08f5?source=collection_archive---------6-----------------------

电力线探测的激光雷达数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

介绍

近年来,激光雷达探测器的发展取得了巨大的进步,产生了大量的原始数据。激光雷达现在更加精确,分辨率甚至比 10 年前高得多。空基激光雷达已经成为接收环境信息的有效方法。然而,您获得的数据实际上只是稀疏点的集合,这些点可能提供一些不错的可视化效果,但在涉及到更实际的目的时,需要进行大量的处理。不幸的是,截至目前,计算机视觉的进展大多涉及结构化的二维数据(照片、视频)。当前的方法不能推广到多维稀疏数据,如我们在基本的激光雷达数据预处理后接收的点云。该领域正在进行广泛的研究。我们

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

应该特别提到 PCL——一个伟大的国际社区开发的库的嫁接,为各种应用提供 2D 和 3D 数据的工具。不幸的是,目前要将这个库应用于感兴趣的解决方案并不容易。这通常意味着你必须深入图书馆。这对于需要高可伸缩性的生产级产品来说是有意义的。但是对于 PoC 开发来说,成本可能太高。因此,我决定使用一种简单的方法和非常标准的 Python 库来尝试对点云数据做些什么(可以从 Python 中使用 PCL,但仅限于此,因为只有很小的子集可以无缝集成)。

实验数据

作为一个例子,让我们使用基于航空的激光雷达生成的数据来检测电力线。电力线通常在点云可视化中清晰可见。然而,映射属于电力线的点需要大量的手动工作。另一方面,简单的几何考虑可以为我们提供大大简化甚至自动化这种处理的方法。

图上的电力线实际上是形成某种几何图形的点的集合。为了简化进一步的分类,我决定检查我们如何从这些点形成集群。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用于实验的软件

我将使用 NumPy、Sklearn、Laspy 和 SciPy 库来形成集群,并使用 matplotlib 来实现可视化。

import laspyimport scipyimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.cluster import DBSCANfrom sklearn import metricsfrom sklearn import preprocessingfrom mpl_toolkits.mplot3d import Axes3Dfrom matplotlib import path

Laspy 非常适合在 Python 中处理点云数据。我们从 las 文件中读取点云数据,并检查实际数据集的形状。

# Open a file in read mode:inFile = laspy.file.File(“./LAS/simple.las”)# Grab a numpy dataset of our clustering dimensions:dataset = np.vstack([inFile.x, inFile.y, inFile.z]).transpose()dataset.shape

(5942479, 3) —我们的点云由 5942479 个点组成。如果你想了解细节,这是不够的。但是如果你试图把这个数据帧转换成一个三维的 NumPy 数组,这个数字就太大了,就像在这个例子中,我们会得到一个巨大的 5942479 = 2.09*10 的⁰数组。它将使用大量的 RAM 来存储非常稀疏的数据。显而易见的是使用 NumPy 稀疏数组。但事实上,稀疏阵列对 2D 很有效,但对 3D 数据无效。矩阵操作函数与稀疏 3D 矩阵不完全兼容。由于内存需求,我们必须坚持使用 DataFrame 而不是 NumPy 数组。

消除范围外的点

我们需要找到一种方法来消除那些不是电力线的点。出于安全原因并为了确保其最佳性能,电力线被放置在离地面很高的地方。但对于崎岖的地形,我们必须考虑到,由于地面倾斜,一些地面点在图像的不同部分可能高于电力线。为了避免这种情况,让我们把点云分成小的垂直部分。

%%timedef frange(start, stop, step): i = start while i < stop: yield i i += step#ground points grid filtern = 100 #grid stepdataset_Z_filtered = dataset[[0]]zfiltered = (dataset[:, 2].max() — dataset[:, 2].min())/10 #setting height filtered from groundprint(‘zfiltered =’, zfiltered)xstep = (dataset[:, 0].max() — dataset[:, 0].min())/nystep = (dataset[:, 1].max() — dataset[:, 1].min())/nfor x in frange (dataset[:, 0].min(), dataset[:, 0].max(), xstep): for y in frange (dataset[:, 1].min(), dataset[:, 1].max(), ystep): datasetfiltered = dataset[(dataset[:,0] > x)
                             &(dataset[:, 0] < x+xstep)
                             &(dataset[:, 1] > y)
                             &(dataset[:, 1] < y+ystep)] if datasetfiltered.shape[0] > 0: datasetfiltered = datasetfiltered[datasetfiltered[:, 2]
                        >(datasetfiltered[:, 2].min()+ zfiltered)] if datasetfiltered.shape[0] > 0: dataset_Z_filtered = np.concatenate((dataset_Z_filtered,
                                             datasetfiltered))print(‘dataset_Z_filtered shape’, dataset_Z_filtered.shape)

在这种简单方法的帮助下,即使使用中等的计算能力,我们也可以立即大大减少云中的点数。在我们的例子中,这是在 3 分钟内将点数减少了一个数量级——对于几行代码来说还不错,因为我们没有为任何优化付出真正的努力。

dataset_Z_filtered shape (169862, 3)CPU times: user 3min 16s, sys: 7.14 ms, total: 3min 16sWall time: 3min 16s

现在我们将使用一个更小的过滤数据集。

探索我们的数据

让我们来探索我们的数据:

print(“Examining Point Format: “)pointformat = inFile.point_formatfor spec in inFile.point_format:print(spec.name)Examining Point Format:XYZintensityflag_byteraw_classificationscan_angle_rankuser_datapt_src_idgps_time

在我的实验中,我尝试使用数据的 4D 表示(X,Y,Z 和强度),但结果并没有在 3D (X,Y,Z)上有所改善,所以让我们坚持使用后一个数据子集。

print(‘Z range =’, dataset[:, 2].max() — dataset[:, 2].min())print(‘Z max =’, dataset[:, 2].max(), ‘Z min =’, dataset[:, 2].min())print(‘Y range =’, dataset[:, 1].max() — dataset[:, 1].min())print(‘Y max =’, dataset[:, 1].max(), ‘Y min =’, dataset[:, 1].min())print(‘X range =’, dataset[:, 0].max() — dataset[:, 0].min())print(‘X max =’, dataset[:, 0].max(), ‘X min =’, dataset[:, 0].min())Z range = 149.81Z max = 181.78999908447264 Z min = 31.979999084472652Y range = 622.9700000002049Y max = 2576396.509974365 Y min = 2575773.539974365X range = 556.4400000000605X max = 711882.7199987792 X min = 711326.2799987792

数据标准化

如您所见,这些值在不同的范围内。为了获得更好的结果,我们应该对数据集进行规范化。

dataset = preprocessing.normalize(dataset)

对几何上接近的点进行聚类

现在我们准备处理我们的数据。我们的电力线实际上是点的空间群集,因此尝试群集算法是很自然的。经过短暂的调查,我发现 Sklearn 库提供的 DBSCAN 开箱即用效果最好。

clustering = DBSCAN(eps=2, min_samples=5, leaf_size=30).fit(dataset)

现在让我们来看看我们的结果。

core_samples_mask = np.zeros_like(clustering.labels_, dtype=bool)core_samples_mask[clustering.core_sample_indices_] = Truelabels = clustering.labels_# Number of clusters in labels, ignoring noise if present.n_clusters_ = len(set(labels)) — (1 if -1 in labels else 0)n_noise_ = list(labels).count(-1)print(‘Estimated number of clusters: %d’ % n_clusters_)print(‘Estimated number of noise points: %d’ % n_noise_)Estimated number of clusters: 501Estimated number of noise points: 1065

形象化

我们的大部分点被分成了几组。让我们看看它在实践中是什么样子的:

# Black removed and is used for noise instead.fig = plt.figure(figsize=[100, 50])ax = fig.add_subplot(111, projection=’3d’)unique_labels = set(labels)colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]for k, col in zip(unique_labels, colors): if k == -1: # Black used for noise. col = [0, 0, 0, 1] class_member_mask = (labels == k) xyz = dataset[class_member_mask & core_samples_mask] ax.scatter(xyz[:, 0], xyz[:, 1], xyz[:, 2], c=col, marker=”.”)plt.title(‘Estimated number of cluster: %d’ % n_clusters_)plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在很清楚,简单的几何考虑和相当标准的聚类方法帮助我们使用适度的计算资源来简化点分类。

如果需要,每个点簇可以单独分类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果

我们的实验表明,几何考虑和标准 Python 库的结合可以显著减少为进一步使用而对原始点云数据进行分类所需的工作。

感谢

我要感谢我的同事们安迪·博西米科拉·科兹连科沃洛季米尔·森德茨基的讨论、合作和有益的建议,以及整个 MindCraft.ai 团队的持续支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值