前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R-kknn包-类别插值可视化绘制

R-kknn包-类别插值可视化绘制

作者头像
DataCharm
发布2021-02-22 11:43:50
1.3K0
发布2021-02-22 11:43:50
举报

前面的推文我们介绍了使用scikit-learn结合分类散点数据,构建机器学习分类模型并将模型结果可视化展示,具体链接如下:机器学习和可视化还能一起这样用?Python教你全搞定。今天这篇推文,我们就使用R语言的kknn包进行类别插值可视化绘制,主要知识点如下:

  • R-kknn包简介及应用
  • kknn 模型结果可视化绘制
  • 更加完美的sf 裁剪方法

R-kknn包简介及应用

R-kknn包简介

R-kknn包主要是是用于加权K近邻分类、回归和聚类模型的应用(kknn is a R package for Weighted k-Nearest Neighbors Classification, Regression and Clustering),其官网为:http://klausvigo.github.io/kknn/。很多小伙伴向我反映说:“虽然R的包比较丰富,但在具体的介绍文档描述上还有所欠缺,即看完文档甚至连基本的输入输出都不太清楚”,关于这一点,可以认为是R学习的一个陡峭性,不像Python可以快速上手,这就需要你熟悉了解其基本语法和函数,这里建议新手小白可以买一本书籍进行参考,在有一定基础的同时就直接看英文博客或者官网(讲真的,国内的教程真的是千篇一律,没有新意,当然,小编的公号除外哈)。好了,不扯了,我们继续~~

kknn包的官网描述的就较少,还好有具体的例子可以供参考,这里我们不再赘述,大家可以自行阅读,我们直接给出我们的示例过程。

R-kknn包应用散点数据可视化

在之前,我们需要提供散点数据(用于模型样本) 和地图数据(c插值的范围),散点数据预览如下:

地图数据选择的是四川省的geojson文件,代码读取如下:

代码语言:javascript
复制
sichuang <- "四川省.json"
sichuang <- sf::read_sf(sichuang)
head(sichuang)

地图数据

这里我们先看下散点的分布情况,可视化代码如下:

代码语言:javascript
复制
#导入主题包
library(sf)
library(tidyverse)
library(ggspatial)
library(RColorBrewer)
library(ggtext)
library(hrbrthemes)

#自定义颜色
#my_colormap <- colorRampPalette(rev(brewer.pal(11,'Spectral')))(32)
point2 <- ggplot() + 
  geom_sf(data = sichuang,fill="NA",size=.4,colour="gray60") + 
  geom_point(data = point,aes(x = lon,y = lat,color=factor(label))) +
  scale_color_brewer(palette = "Dark2",name="Label",
                     labels=c("class1","class2","class3","class4","class5")) +
  annotation_scale(location = "bl") +
      # spatial-aware automagic north arrow
       annotation_north_arrow(location = "tr", which_north = "false",
                             style = north_arrow_fancy_orienteering) +
  labs(x="",y="",
       title = "Map Charts in R Exercise 03-2: <span style='color:#D20F26'>Categorical Interpolation</span>",
       subtitle = "processed map charts with <span style='color:#1A73E8'>geom_point()</span>",
       caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +
  theme_ipsum(base_family = "Roboto Condensed") +
  theme(
        plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                             size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
        plot.caption = element_markdown(face = 'bold',size = 12),
  )
point2

可视化结果如下:

R-kknn包应用

在应用kknn进行模型构建之前,我们需要构造出测试数据,即根据地图文件的经纬度范围进行插值得到,再用基于散点数据构建好的kknn模型,预测出插值数据的类别,进行做到类别插值。具体步骤如下:

  1. 构建插值数据使用sf包的st_bbox() 方法即可计算出地图文件的经纬度范围:
代码语言:javascript
复制
st_bbox(sichuang)
# xmin      ymin      xmax      ymax 
#97.35010  26.04586 108.54649  34.31245 

接下来,使用sf包的st_make_grid() 构建网格数据:

代码语言:javascript
复制
width_in_pixels <- 600
dx <- ((st_bbox(sichuang)["xmax"] - st_bbox(sichuang)["xmin"]) / width_in_pixels)
dy <- dx
height_in_pixels <- floor((st_bbox(sichuang)["ymax"] - st_bbox(sichuang)["ymin"]) / dy)

grid2 <- sf::st_make_grid(sichuang,cellsize = dx,
                         n = c(width_in_pixels, height_in_pixels),
                         what = "centers"
                         )

注意: 这里我们不是直接插入600x600的一个网格,而是,先再行上计算插入600个,再计算每个网格格点的大小,再根据格点大小在列上计算网格个数。

最后,我们使用data.frame()基础方法构建DF数据格式:

代码语言:javascript
复制
result2 = data.frame(lon = st_coordinates(grid2)[,1],
                     lat = st_coordinates(grid2)[,2],
                     label = as.factor(NA))
head(result2)

注意:由于类别是因子(factor)类型,不是数值类型,所以使用as.factor() 进行转换。

  1. kknn::kknn()计算 在计算之前,我们要将之前散点数据的label列转换成因子(factor)类型:
代码语言:javascript
复制
point$label <- as.factor(point$label)

接下来,我们调用kknn::kknn()方法进行计算:

代码语言:javascript
复制
label_kknn <- kknn::kknn(label ~ ., 
                        train = point, 
                        test = result2, 
                        kernel = "gaussian", 
                        k = 100)

由于结果打印出来较多,我们直接将结果转换成DF类型:

代码语言:javascript
复制
#将结果转换成df
result_label  <- result2 %>% 
    mutate(label = fitted(label_kknn),
           prob = apply(label_kknn$prob, 1, function(x) max(x)))
    
head(result_label)

注意:由于结果输出的prob列(即每一个类别(5类)的可能性,最终输出结果为最大的那一个),我们使用了自定义函数:function(x) max(x) 将prob结果最大的一个求出。结果预览如下:

R-kknn结果可是绘制

在绘制地图可视化之前,最好将要绘制的结果转换成sf对象,便于可视化绘制(转换投影等操作均可进行),转换代码如下:

代码语言:javascript
复制
result_labela_raster <- st_as_sf(result_label, coords = c("lon", "lat"),crs = 4326,remove = F)

接下里,我们就将结果进行可视化绘制:「网格数据可视化:」

代码语言:javascript
复制
library(sf)
library(tidyverse)
library(ggspatial)
library(RColorBrewer)
library(ggtext)
library(hrbrthemes)

#自定义颜色
knn_result2_grid <- ggplot() + 
  # add raster geom for the knn result
  geom_sf(data = sichuang,fill="NA",size=.8,colour="gray60",alpha=.7)+
  geom_raster(data = result_labela_raster,aes(x =lon,y = lat,fill=label,alpha=prob)) + 
  #geom_sf(data = sichuang,fill="NA",size=.8,colour="gray60",alpha=.7)+
  scale_fill_brewer(palette = "Dark2",name="Label",
                   labels=c("class1","class2","class3","class4","class5")) +
  annotation_scale(location = "bl") +
      # spatial-aware automagic north arrow
       annotation_north_arrow(location = "tr", which_north = "false",
                             style = north_arrow_fancy_orienteering) +
   # remove propability legend
  scale_alpha_continuous(guide = F) +
  labs(x="",y="",
       title = "Map Charts in R Exercise 03-2: <span style='color:#D20F26'>Categorical Interpolation</span>",
       subtitle = "processed map charts with <span style='color:#1A73E8'>geom_raster()</span>",
       caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +
  theme_ipsum(base_family = "Roboto Condensed") +
  theme(
        plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                             size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
        plot.caption = element_markdown(face = 'bold',size = 12),
  )

可视化结果如下:

在之前的推文中,我们也说过会提出一个较好的裁剪方法,这里我们将给出参考方法,如下:

代码语言:javascript
复制
result_labela_raster_clip = result_labela_raster[sichuang,]

直接使用[地图数据,],这里需要在指出的是:result_labela_raster和sichuang文件均为sf类型数据。 这样就可裁剪出较满意的结果,而可视化的绘制也只是的更改为以下即可:

代码语言:javascript
复制
geom_raster(data = result_labela_raster_clip,aes(x =lon,y = lat,fill=label,alpha=prob))

最终我们绘制的可视化结果如下:

总结

本篇推文我们使用了R-kknn包计算了分类模型结果即结果的可视化绘制,此外,还提出了一个较方便的裁剪方法,目的也是让大家更好的熟悉ggplot2的可视化绘制。到这里,关键空间插值系列的可视化教程(Python和R)也暂时结束,接下来,我会将该系列的所有推文整理汇总(数据、源码和解释文档)。接下来可能会推出几篇商业图表的绘制推文。哦!对了,可能在元旦假期结束之前不再更文(家里有喜事

),提前祝大家元旦快乐哈!小伙伴也可以多看看我之前的推文

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataCharm 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • R-kknn包简介及应用
    • R-kknn包简介
      • R-kknn包应用散点数据可视化
        • R-kknn包应用
          • R-kknn结果可是绘制
          • 总结
          相关产品与服务
          图数据库 KonisGraph
          图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档