ARTS-for-week6-20181124

网友投稿 700 2022-10-25

ARTS-for-week6-20181124

ARTS-for-week6-20181124

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

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

今天更新文章有点晚了,因为小加一天忙着研究所的毕业论文开题预答辩,答辩时间从早上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

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

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

线性分类器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

表示图像如下

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

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

给出测试数据,知道如何通过代码实际运用它们么?不用担心,!在 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)

得出以下界线:

练习:训练自己的模型

机器学习学习中定义一个分类器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

总结来说

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

Share

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

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

爱学习,爱技术

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:NoChat 一个轻量级的iOS聊天UI框架
下一篇:一个用于教育目的简单PHP框架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~