[转载]【R语言新书】前言Ⅰ—谈如何学习编程语言
0.1 怎么学习编程语言?
编程语言是人与计算机沟通的一种形式语言,根据设计好的编程元素和语法规则,来严格规范地表达我们想要做的事情的每一步(程序代码),使得计算机能够明白并正确执行,得到期望的结果。
编程语言和数学语言很像,数学语言是最适合表达科学理论的形式语言,用数学符号、数学定义和逻辑推理,来规范严格地表达科学理论。
很多人说:“学数学,就是靠大量刷题”,“学编程,就是照着别人的代码敲代码”。
我不认可这种观点,这样的学习方法事倍功半,关键是这样做你学不会真正的数学,也学不会真正的编程!
那么应该怎么学习编程语言呢?
就好比要成为一个好的厨师,首先得熟悉各种常见食材的特点秉性,掌握各种基本的烹饪方法,然后就能根据客人需要随意组合食材和烹饪方法制作出各种可口的大餐。
数学的食材就是定义,烹饪方法就是逻辑推理,一旦你真正掌握了定义+逻辑推理,各种基本的数学题都不再话下,而且你还学会了数学知识。
同理,编程的食材和烹饪方法就是编程元素和语法规则,比如数据结构(容器)、分支/循环结构、自定义函数等,一旦你掌握了这些编程元素和语法规则,根据问题的需要,你就能信手拈来优化组合它们,从而自己写出代码解决问题。
所以,学习任何一门编程语言,根据我的经验,有这么几点建议(步骤):
1. 理解该编程语言的核心思想,比如 Python 是面向对象,R 语言是面向函数也面向对象,另外,高级编程语言还都倡导向量化编程。在核心思想的引领下去学它去思考去写代码。
2. 学习该编程语言的基础知识,这些基础知识本质上是相通的同样的东西,只是在不同编程语言下披上了其特有的外衣(编程语法),基础知识包括:数据类型及数据结构(容器)、分支/循环结构、自定义函数、文件读写、可视化等。
3. 前两步完成之后,就算基本入门【脚注1】了,可以根据需要,根据遇到的问题,借助网络搜索、借助帮助,遇到问题解决问题,逐步提升,用的越多会的越多,也越熟练。
脚注1: 至少要经历过一种编程语言的入门,再学习其它编程语言就会很快。
以上是学习编程语言的正确、快速、有效的方法,切忌不学基础语法,用到哪就突击哪,找别人的代码一顿不知其所以然的瞎改,这样始终无法入门,更谈不上将来提高。
再来谈一个学编程过程中普遍存在的问题:如何跨越能看懂别人的代码到自己写代码的鸿沟。
很多人绝大多数人在编程学习过程中,都要经历这样一个过程:
-
学习基本语法 -
能看懂和调试别人的代码
-
将难以入手大问题分解为可以逐步解决的小问题 -
用计算机的思维去思考解决每步小问题 -
借助类比的简单实例和代码片段,梳理出详细算法步骤 -
将详细算法步骤用逐片段地用编程语法翻译成代码并调试通过
-
让分类阈值以某步长在 [1,0] 上变化取值; -
对某一个阈值,
-
循环迭代,计算所有阈值的 TPR 和 FPR -
根据 TPR 和 FPR 数据绘图
library(tidyverse)
df = tibble(
ID = 1:10,
`真实类别`=c("Pos","Pos","Pos","Neg","Pos","Neg","Neg","Neg","Pos","Neg"),
`预测概率`=c(0.95,0.86,0.69,0.65,0.59,0.52,0.39,0.28,0.15,0.06)
)
knitr::kable(df)
c = 0.85
df1 = df %>%
mutate(
`预测类别` = ifelse(预测概率 >= c, "Pos", "Neg"),
`预测类别` = factor(预测类别, levels = c("Pos", "Neg")),
`真实类别` = factor(真实类别, levels = c("Pos", "Neg"))
)
knitr::kable(df1)
cm = table(df1$预测类别, df1$真实类别)
cm
cm["Pos",] / colSums(cm)
cal_ROC = function(df, c) {
df = df %>%
mutate(
`预测类别` = ifelse(预测概率 >= c, "Pos", "Neg"),
`预测类别` = factor(预测类别, levels = c("Pos", "Neg")),
`真实类别` = factor(真实类别, levels = c("Pos", "Neg"))
)
cm = table(df$预测类别, df$真实类别)
t = cm["Pos",] / colSums(cm)
list(TPR = t[[1]], FPR = t[[2]])
}
cal_ROC(df, 0.85)
c = seq(1, 0, -0.02)
rocs = map_dfr(c, cal_ROC, df = df)
head(rocs) # 查看前 6 个结果
rocs %>%
ggplot(aes(FPR, TPR)) +
geom_line(size = 2, color = "steelblue") +
geom_point(shape = "diamond", size = 4, color = "red") +
theme_bw()