HelloDavid


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

mongo输入带'.'的字典

发表于 2019-06-07 | 分类于 mongo

mongodb默认是不允许存储键中带’.’的字典,
pymongo中实现的两种解决方案:

  1. 将字典键中的’.’用’_’等其他符号替代;
  2. 但是当字典包含多层嵌套字典,我觉得通过替换过于麻烦,所以我使用了另一种方案:
    collection.insert(docs, check_keys=False)
    即通过设置check_keys来使得mongo不检查’.’, 但是这个方案只限于临时解决方案,因为这个方案只适合于pymongo2.7版本,并且在后续版本中insert这个方法是被废弃的,而新增的insert_one和insert_many并没有checks_keys的属性。

MongoDB 学习

发表于 2019-06-07 | 分类于 数据库

记录下我在学习mongoDB时遇到的一些问题与解决方案

问题:
windows下启动mongoDB后显示等待连接端口,并且停止在这一步:

1
2
3
4
5
6
7
8
2017-09-17T11:57:32.398+0800 I CONTROL  [initandlisten]
2017-09-17T11:57:32.398+0800 I CONTROL [initandlisten] ** WARNING: Access control is n
2017-09-17T11:57:32.399+0800 I CONTROL [initandlisten] ** Read and write acce
nrestricted.
2017-09-17T11:57:32.402+0800 I CONTROL [initandlisten]
2017-09-17T11:57:32.966+0800 I FTDC [initandlisten] Initializing full-time diagnost
:/data/db/diagnostic.data'
2017-09-17T11:57:32.972+0800 I NETWORK [thread1] waiting for connections on port 27017

解决:
其实,这不是卡住了,而是数据库已经启动,并且这个终端还不能关掉,关掉意味着数据库也关了。
因此,保留这个终端,再开个终端,进入mongoDB\bin文件夹后输入.\mongo(注意,这里不是.\mongod)回车,就可以进入mongodb了

问题:
ubuntu上出现无法连上mongodb的问题,显示已启用另一个终端:

1
2
3
mongod
2017-09-20T04:07:41.308-0400 I STORAGE [initandlisten] exception in initAndListen: 98 Unable to create/open lock file: /data/db/mongod.lock errno:13 Permission denied Is a mongod instance already running?, terminating
2017-09-20T04:07:41.308-0400 I CONTROL [initandlisten] dbexit: rc: 100

解决:

1
sudo chown -R `id -u` /data/db

一句话解决,虽然我也不清楚原理。
接下来同样是另起一个终端输入mongo即成功

Machine learning

发表于 2019-06-07 | 分类于 机器学习

本文仅为个人笔记,错误之处敬请包涵。 ——— David

这篇介绍不涉及任何公式推导,仅提供一些思路以及相应的资料,感兴趣的可以自行查找资料学习。

书籍推荐

理论类:

机器学习,周志华;

统计学习方法,李航;

深度学习,Ian goodfellow;

实践类:

机器学习实战,peter harrington;

python机器学习及实践,范淼;

休闲类:

数学之美,吴军;

博客推荐:

刘建平的博客:https://www.cnblogs.com/pinard/

peghoty的博客:https://blog.csdn.net/itplus

poll的笔记:http://www.cnblogs.com/maybe2030/

监督学习

监督学习是指对带标签的数据进行模型学习。

回归

回归任务常见的是线性回归linear regression.

注意回归和分类任务的区别,回归的标签值是连续值,而分类的标签值是离散值。

通常我们还会遇到逻辑回归logistic regression, 注意,逻辑回归是用于分类的!

逻辑回归LR是机器学习中非常基础的算法,因此非常重要。

知识点:交叉熵损失函数,极大似然估计。

相关资料:

poll的博客:www.cnblogs.com/maybe2030/p/5494931.html

逻辑回归:https://www.cnblogs.com/Belter/p/6128644.html

逻辑回归推导:http://blog.csdn.net/pakko/article/details/37878837

极大似然估计:http://blog.csdn.net/star_liux/article/details/39666737

SVM

通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

阅读全文 »

线性回归和逻辑回归的比较

发表于 2019-06-07 | 分类于 机器学习

线性回归

1536368052441

用一组变量的(特征)的线性组合,来建立与结果之间的关系。

模型表达:$y(x, w)=w_0+w_1x_1+…+w_nx_n$

逻辑回归

逻辑回归用于分类,而不是回归。

在线性回归模型中,输出一般是连续的, 对于每一个输入的x,都有一个对应的输出y。因此模型的定义域和值域都可以是无穷。

但是对于逻辑回归,输入可以是连续的[-∞, +∞],但输出一般是离散的,通常只有两个值{0, 1}。

这两个值可以表示对样本的某种分类,高/低、患病/ 健康、阴性/阳性等,这就是最常见的二分类逻辑回归。因此,从整体上来说,通过逻辑回归模型,我们将在整个实数范围上的x映射到了有限个点上,这样就实现了对x的分类。因为每次拿过来一个x,经过逻辑回归分析,就可以将它归入某一类y中。

阅读全文 »

Leetcode-Valid Parentheses

发表于 2019-06-07 | 分类于 leetcode

Valid Parentheses

验证有效括号对:给定一个只包含括号类型的字符串,判断该字符串的括号是否有效闭合。Description
Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[‘ and ‘]’, determine if the input string is valid.
The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not.

解题思路:
采用栈来解决,依次检查给的characters,如果是左括号都入栈;如果是右括号,检查栈如果为空,证明不能匹配,如果栈不空,弹出top,与当前扫描的括号检查是否匹配。全部字符都检查完了以后,判断栈是否为空,空则正确都匹配,不空则证明有没匹配的。

代码中采用字典方式,将右括号作为键,将左括号作为值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
stack = []
dict = {')':'(', ']':'[', '}':'{'}

for char in s:
if char in dict.values():
stack.append(char)
elif char in dict.keys():
if stack==[] or stack.pop()!=dict[char]:
return False
else:
return False

return stack==[]

Leetcode-Valid Anagram

发表于 2019-06-07 | 分类于 leetcode

Valid Anagram

给定两个字符串,判断其中一个字符串是否是另一个字符串的异序组合。
Given two strings s and t, write a function to determine if t is an anagram of s.

For example,
s = “anagram”, t = “nagaram”, return true.
s = “rat”, t = “car”, return false.

Description

tip:anagram的意思是把单词的字母顺序打乱,重新排列后变成一个新单词。

解题思路1:
将两个字符串排序后直接比较是否相同。

1
2
3
4
5
6
7
8
class Solution(object):
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
return sorted(s) == sorted(t)

解题思路2:
采用字典的方式,分别记录两个字符串中每个字符的出现次数,比较字典是否相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution(object):
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
dict1, dict2 = {}, {}
for i in s:
dict1[i] = dict1.get(i, 0) + 1
for j in t:
dict2[j] = dict2.get(j, 0) + 1
return dict1 == dict2

tip:
dict.get(key, default=None):对于键key返回其对应的值,或者若dict中不包含key则返回default(注意,default的默认值是None)。

Leetcode-Search Insert Position

发表于 2019-06-07 | 分类于 leetcode

Search Insert Position

给定一个有序的无重复元素的序列,和一个目标元素,求出该元素在数组中的下标,若数组中不存在该元素,则返回其在数组中的顺序下标。
Description

解题思路:
直接采用暴力查询。首先判断目标元素是否在数组中,若存在,则直接返回下标。
若不存在,将目标元素与数组中的最大最小值比较;如果介于最大最小值之间,则与数组中的任意两个相邻元素进行比较。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if target in nums:
return nums.index(target)

if target<min(nums):
return 0
elif target>max(nums):
return len(nums)
else:
for i in range(len(nums)):
if nums[i]<target and nums[i+1]>target:
return i+1

改进:
采用二分查找的思路,leetcode上提供的另一种解法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def searchInsert(self, nums, key):
if key > nums[len(nums) - 1]:
return len(nums)

if key < nums[0]:
return 0

l, r = 0, len(nums) - 1
while l <= r:
m = (l + r)/2
if nums[m] > key:
r = m - 1
if r >= 0:
if nums[r] < key:
return r + 1
else:
return 0

elif nums[m] < key:
l = m + 1
if l < len(nums):
if nums[l] > key:
return l
else:
return len(nums)
else:
return m

Leetcode-Roman to Integer

发表于 2019-06-07 | 分类于 leetcode

Roman to Integer

将罗马数字转换为阿拉伯数字。
Description

leetcode没有说明具体的转换规则,我是按照罗马数字规则设置的。

解题思路:
一个保存罗马数字映射的字典:

1
roman = {'M': 1000,'D': 500 ,'C': 100,'L': 50,'X': 10,'V': 5,'I': 1}

规则:

  • 如果一个元素值比右边元素大,则加上这个元素;
  • 如果一个元素值比右边元素小,则减去这个元素;
  • 始终加上末尾的元素;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
roman = {'M': 1000,'D': 500 ,'C': 100,'L': 50,'X': 10,'V': 5,'I': 1}

num = 0
for i in range(len(s)-1):
if roman[s[i]]>=roman[s[i+1]]:
num = num + roman[s[i]]
else:
num = num - roman[s[i]]

return num+roman[s[-1]]

Remove Duplicates from Sorted List

发表于 2019-06-07 | 分类于 python

从排序链表中删除重复元素。
Description

解题思路:
依次比较相邻的两个链表元素,若值相等,则将前一个节点的next引用为后一个节点的后一个节点。使用cur来依次向下遍历元素,最后返回head。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution(object):
def deleteDuplicates(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
cur = head

while cur:
while cur.next and cur.next.val==cur.val:
cur.next = cur.next.next
cur = cur.next
return head

Leetcode-Remove element

发表于 2019-06-07 | 分类于 leetcode

在我看来是remove duplicated elements from sorted array的姊妹题。

给定一个数组(未排序)和一个元素,要求从数组中去除这个元素并返回数组长度。超出数组长度的部分不在考虑范围内。
Description

解题思路:
利用两个指针,一个用来遍历整个数组,如果与给定的元素不相同,则利用另一个index下标将该元素加入到nums数组中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
if not nums:
return 0

index = 0
for i in range(len(nums)):
if nums[i] != val:
nums[index] = nums[i]
index += 1

return index

另外看见一个比较特别的解法:

1
2
3
4
5
6
def removeElement(self, nums, val):
try:
while True:
nums.remove(val)
except:
return len(nums)

123…5
David

David

From Zero to One

45 日志
16 分类
39 标签
© 2019 David 苏ICP备17049163号-2
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4