ARTS-for-week6-20181124_机器学习

阅读文本大概需要 12 分钟。

每周完成一个ARTS:
每周至少做一个 leetcode 的算法题、阅读并点评至少一篇英文技术文章、学习至少一个技术技巧、分享一篇有观点和思考的技术文章。(也就是 Algorithm、Review、Tip、Share 简称ARTS)

ps:由于公众号不支持添加外链,所以大家遇到有链接的地方滑到文章最下面点击阅读原文就可以访问了哈,如果觉得文章不错,欢迎分享给周围的朋友们哈

ARTS-for-week6-20181124_机器学习_02

又到周末啦,大家该吃吃该喝喝该玩玩,同时也不要抽点时间忘了学习哦。

今天更新文章有点晚了,因为小加一天忙着研究所的毕业论文开题预答辩,答辩时间从早上10点持续进行到下午3点多,为了节约时间,中午老师直接叫了麦当劳外卖,因为人有点多,所以你脑海里可以脑补一波一窝人坐在一个会议室里,每个人前面都放着一台笔记本,啃着汉堡包,喝着cola可乐和黄金炸小薯条的画面。结果当然满屋子都是汉堡包+小薯条的味道,感觉有点像好多热血青年集体在创业的感觉。。。

哈哈,言归正传,下面更新 ARTS 第六周的内容。

Algorithm

LeetCode 9. Palindrome Number 链接 难度:[Eazy]

【题意】

Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.

判断一个数是否是回文数。

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Example 1:

Input: 121
Output: true
Example 2:

Input: -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
Example 3:

Input: 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.

【思路】

这道题不是很难,比较简单,我想到有三种方法,并且分别AC了。

方法一 将原数转换为字符串,然后定义双指针,一个从前往后移动,一个从后往前移动,在指针移动的过程中,如果两个指针指向同一个字符串元素不相等,那么该字符串不是回文字符串,返回false即可。(时间复杂度O(n),空间复杂度O(1))。

方法二 思路跟方法一差不多,也是先将原数转换为字符串,然后我们只要枚举字符串一半的长度,分别将字符串的头尾的字符串进行判断,如果两个发现字符串元素不相等,那么该字符串不是回文字符串,返回false即可。(时间复杂度O(n),空间复杂度O(1))。

方法三 以上两种方法都是在原数的基础上进行了一些转换,可不可以在不进行额外的开销情况下,达到题目的要求呢?当然可以!我们只要再稍微思考一下,就会不难发现,我们重新考虑如果一个数是回文数的话,它有什么特点呢?从前往后读和从后往前读是一样的!我们将原数每位单独提取出来,然后进行重新整合为另一个新数,你会发现在十进制数字条件下重新整合的新数就是原数的逆转!如此一来,我们在不增加额外的开销情况下,直接判断新数和原数的大小关系,问题就解决了! (时间复杂度 O(log10(n)),空间复杂度O(1))。

【参考代码】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*方法一*/
class Solution {
public:
bool isPalindrome(int x) {
if( x<0 || ( x%10==0 && x!=0 ) )
return false;
else
{
string s=to_string(x);
int L=0;
int R=s.length()-1;
while( L<R )
{
if(s[L]!=s[R]) return false;
L++;
R--;
}
return true;
}
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*方法二*/
class Solution {
public:
bool isPalindrome(int x) {
if( x<0 || ( x%10==0 && x!=0 ) )
return false;
string s = to_string(x);
int n = s.size();
for (int i = 0 ;i < n / 2; ++i) {
if (s[i] == s[n - i - 1])
continue;
else
return false;
}
return true;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*方法三*/
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int result = 0;
int origin = x;
while( x > 0)
{
result = result * 10 + x % 10;
x /= 10;
}
return result == origin;
}
};

Review

机器学习中的分类算法类型(英文)

ARTS-for-week6-20181124_拟合_03

本文介绍了常用的机器学习中的分类算法类型

线性分类器
Logistic回归
朴素贝叶斯分类器
支持向量机
决策树
Boosted树
随机森林
神经网络
K近邻

并且对于每种算法进行了简要的概括和总结,最近我正好学习了在 ​​scikit learn​​ 中如何运用分类算法训练模型,分享给大家。

这部分介绍一下 新手如何在 ​​scikit learn​​ 中训练模型

在此部分其中我使用的数据集部分内容为以下形式

1
2
3
4
5
x1,x2,y
0.336493583877,-0.985950993354,0.0
-0.0110425297266,-0.10552856162,1.0
0.238159509297,-0.61741666482,1.0
-0.366782883496,-0.713818716912,1.0

表示图像如下

ARTS-for-week6-20181124_拟合_04

我们知道机器学习领域的一些最重要的分类算法,包括以下算法:

  • 逻辑回归
  • 神经网络
  • 决策树
  • 支持向量机

给出测试数据,知道如何通过代码实际运用它们么?不用担心,!在 sklearn 中非常简单,只需定义分类器,然后使用下面这行代码使分类器与数据拟合(称为 ​​X​​​, ​​y​​):

1
classifier.fit(X,y)

以下是我们定义的主分类器,以及必须导入的文件包:

逻辑回归

1
2
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()

神经网络

(注意:仅适用于 0.18 或更高版本的 scikit-learn)

1
2
from sklearn.neural_network import MLPClassifier
classifier = MLPClassifier()

决策树

1
2
from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier()

支持向量机

1
2
from sklearn.svm import SVC
classifier = SVC()

示例:逻辑回归

我们从头到尾地看看如何读取数据和训练分类器。假设使用上一部分的 X 和 y。然后,以下命令将训练逻辑回归分类器:

1
2
3
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier.fit(X,y)

得出以下界线:

ARTS-for-week6-20181124_拟合_05

练习:训练自己的模型

机器学习学习中定义一个分类器classifier,现要求对X,y进行拟合。

其中X,y数据已经在前面表示过了。

【代码如下】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pandas
import numpy

# Read the data 读取数据
data = pandas.read_csv('data.csv')

# Split the data into X and y 将其拆分为特征 X 和标签 Y,并将它们转变为NumPy数组。
X = numpy.array(data[['x1', 'x2']])
Y = numpy.array(data['y'])

# import statements for the classification algorithms 常见的三种分类算法
from sklearn.linear_model import LogisticRegression #逻辑回归
from sklearn.tree import DecisionTreeClassifier #决策树
from sklearn.svm import SVC #支持向量机

#classifier = LogisticRegression(); #用逻辑回归拟合
#classifier = DecisionTreeClassifier(); #用决策树拟合
classifier = SVC(); #这里我采用支持向量机拟合数据
classifier.fit(X,Y); #调用fit函数拟合数据

Tip

最近在回顾机器学习算法过程中,发现对于混淆矩阵这一块的知识点还不是搞得很清楚,后来经过阅读一些网络上的文章和可视化的参考资料,进一步加深了对混淆矩阵的知识点的理解。

在机器学习中,我们建立一个模型之后,我们想知道它的性能如何,这是个有难度的问题,但是我们可以学习一些不同的指标,通过它们来了解模型的好坏。我们来看看一个示例。

我们来看看患病情况下的一个例子

  • 当就诊者患病,且模型正确确诊为患病时,说明这是一名患者,需要进一步入院进行检查或治疗,这种情况称之为true positive (真阳性)。
  • 当就诊者未患病,而且模型正确诊断患者为健康时,说明这是一名健康就诊者,不需要来医院,可以直接回家,这种情况称之为true negative(真阴性)。
  • 当就诊者患病,但是模型却诊断为健康时,说明模型诊断出错了,我们让患者在未接受治疗的情况下就回家了,这可有点糟糕!这种情况称之为false negative(假阴性)。
  • 最后当就诊者原来是健康的状态,却被模型诊断为患病状态,这也说明模型诊断出错了,我们让一名未患病者入院进行进一步检查或治疗。这种情况称之为false positive(假阳性)。

混淆矩阵,是一个用于描述模型性能的表。假如在一个模型中

我们有 1000 个人是患病的,并且被正确诊断为患病状态,我们把这种情况称之为 true positive (真阳性)。

有 200 个人是患病的,却被诊断为健康状态,我们把这种情况称之为 false negative(假阴性)。

有 800 个人是健康的,却被诊断为患病状态,我们把这种情况称之为 false positive(假阳性)。

最后,有 8000 个人是健康的,并且被正确诊断为健康状态,我们把这种情况称之为 true negative(真阴性)。

混淆矩阵只是存储了这四个值的表格。

CONFUSION MATRIX

ARTS-for-week6-20181124_机器学习_06

总结来说

真阳性:实际为阳性,且模型确定标记为阳性的点
真阴性:实际为阴性,且模型确定标记为阴性的点
假阳性:实际为阴性,但模型确定标记为阳性的点
假阴性:实际为阳性,但模型确定标记为阴性的点

Share

破坏程序员生产力的12件事(英文)

本文列出了影响程序员工作效率的常见情景:工作经常被打断、领导进行微观管理、产品需求不断扩大等等。


爱学习,爱技术

ARTS-for-week6-20181124_拟合_07