机器学习-朴素贝叶斯

本节介绍基于概率论的分类方法:朴素贝叶斯(Naive Bayes),包含以下内容,

  1. 原理
  2. 条件概率
  3. 从文本中构造词向量
  4. 计算词向量的条件概率
  5. 测试分类器
  6. 实例-过滤垃圾邮件

原理

很多时候我们很难让分类器给出类似“某个数据属于哪个分类”的明确答案,即便分类器给出了,但结果也有可能是错误的。这时,我们可以让分类器给出一个最有可能的猜测结果,同时给出相应的概率。

假设数据集有两个分类,C1和C2,给定某个元素a,如果a在C1中的概率大于a在C2中的概率,即 p(a|c1) > p(a|c2),则我们可以说元素a属于C1。通过概率的大小来判断元素的类别就是贝叶斯决策论的核心思想。

朴素贝叶斯是贝叶斯的简化版本,真正的贝叶斯会带来非常大的计算量和模型的复杂程度,通过一定的简化可以使模型更加简单,便于计算。这里的简化是指我们设定数据的属性之间没有关联,其都是独立事件,也就是设定下面公式对任意两个属性都成立:

\large P(AB) = P(A|B) * P(B) = P(A) * P(B)

即,

\large P(A|B) = P(A)

也就是说事件B是否出现与事件A发生的概率没有关系。但事实上很多时候这并不成立,例如,我们分析一段文档,定义事件A为“文档中出现天安门三个字”,定义事件B为“文档中出现广场两个字”。根据我们的生活经验,“天安门广场”在很多时候都一起出现,即事件A的出现会增加事件B出现的概率。所以朴素贝叶斯理论在一定程度上有一些误差,特别在属性之间有很强关联性的时候误差较大,不过其也是一种非常高效的分类方法,在文档分类等领域应用广泛。

条件概率

条件概率是指已知在某个事件已经发生的条件下求另一个事件发生的概率。公式:

\large P(A|B) = \frac{P(AB)}{P(B)}

这里是指已知事件B已经发生,求事件A发生的概率。其概率等于事件A和事件B同时发生的概率除以事件B发生的概率。

下面举个例子来说明条件概率。假设有三个盒子,第一个盒子中放两个红球,第二个盒子中放两个蓝球,第三个盒子中放一个红球和一个蓝球。随机从三个盒子中选择一个盒子,再从选中的这个盒子中拿出一个小球,请问:1)这个小球是红球的概率是多少?2)如果拿出的是红色小球,那么盒子中剩下那个小球也是红球的概率是多少?

第一个问题很好求解,因为总共是6个小球,其中3个是红球,那么第一次选中红球的概率就是3/6=0.5。注意,这里与选择哪个盒子没有关系,因为都是随机选择的。

第二个问题就需要用到条件概率。这里定义两个事件,事件A:随机拿出一个红色小球,事件B:随机选择一个盒子,这个盒子中有两个红色小球。显然,事件A的概率就是上面第一个问题的答案,事件B的概率等于1/3。

所以有,

\large P(A) = \frac{1}{2}, P(B) = \frac{1}{3}

这里,因为如果盒子中两个小球都是红色的,那么不管第一次拿这个盒子中的哪一个小球,拿到的肯定都是红色小球。所以,事件B如果发生,那么事件A也肯定发生。所以有,

\large P(AB) = P(B) = \frac{1}{3}

根据条件概率公式可知:

\large P(B|A) = \frac{P(AB)}{P(A)} = \frac{\frac{1}{3}}{\frac{1}{2}} = \frac{2}{3}

所以,第二个问题的答案是2/3。

这里在延伸一下,因为事件A和事件B发生的概率还可以写成:

\large P(AB) = P(A|B) * P(B) = P(B|A) * P(A)

可以得到,

\large P(B|A) = \frac{P(AB)}{P(A)} = \frac{P(A|B) * P(B)}{P(A)}

因此,我们可以通过交互两个事件的条件顺序来求解未知概率。

从文本中构造词向量

朴素贝叶斯算法常用来分类文档,假设我们现在的需求是要从一堆文档中分析出哪些是有恶意评论的(类别为1),哪些是没有恶意评论的(类别为0)。首先我们先构造数据集,数据集中优6篇训练文章,其类别为(0, 1, 0, 1, 0, 1)。然后找出6篇文章中所有的单词集合(注:若是中文,可以使用分词工具分词),最后通过函数get_vocabulary_vector可以得到任意给定的单词列表在单词集合(词汇表)中每个单词出现的次数。

创建Python模块 prepare_data.py,并输入以下代码:

def load_data():posting_list = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],['stop', 'posting', 'stupid', 'worthless', 'garbage'],['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]class_vec = [0, 1, 0, 1, 0, 1]  # 1 is abusive, 0 notreturn posting_list, class_vecdef create_vocabulary_list(data_set):vocabulary_set = set([])for doc in data_set:vocabulary_set = vocabulary_set | set(doc)return list(vocabulary_set)def get_vocabulary_vector(vocabulary_set, input_set):vocabulary_vector = [0] * len(vocabulary_set)for word in input_set:if word in vocabulary_set:vocabulary_vector[vocabulary_set.index(word)] += 1else:print("Word %r is not in vocabulary!" % word)return vocabulary_vectorif __name__ == "__main__":posting_list, class_vec = load_data()vocabulary_list = create_vocabulary_list(posting_list)print(vocabulary_list)vocabulary_vector1 = get_vocabulary_vector(vocabulary_list, posting_list[0])print(vocabulary_vector1)vocabulary_vector2 = get_vocabulary_vector(vocabulary_list, posting_list[1])print(vocabulary_vector2)

运行结果:

D:\work\python_workspace\machine_learning\venv\Scripts\python.exe D:/work/python_workspace/machine_learning/naive_bayes/prepare_data.py
['not', 'stop', 'buying', 'please', 'so', 'dalmation', 'has', 'cute', 'to', 'him', 'licks', 'maybe', 'ate', 'steak', 'garbage', 'problems', 'help', 'stupid', 'is', 'posting', 'worthless', 'quit', 'dog', 'I', 'park', 'love', 'food', 'how', 'flea', 'take', 'my', 'mr']
[0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0]Process finished with exit code 0

上面代码中采用了词带模型,相比于词集模型,词带模型会累加给定单词出现的次数,而词集模型只会标记为1。一般情况下词带模型的准确性更好一些。

计算词向量的条件概率

接下来要计算训练集中各个单词出现的条件概率,我们首先分析下面的条件概率公式,

\large P(B|A) = \frac{P(AB)}{P(A)} = \frac{P(A|B) * P(B)}{P(A)}

在本例中,这里的事件B有两个定义,1)该文章为有恶意评论的文章,2)该文章为没有恶意评论的文章。事件A就是词汇表中的单词出现的概率。由于A是由词汇表中每个单词组成的,所以在这里每个单词可以理解为A的属性。代表的含义就是给定某个数据A,求其在B中出现的概率。通过转换,我们需要求得给出条件B,求A出现的概率,这个可以通过训练集得到。

创建Python模块training.py,并输入以下代码:

import naive_bayes.prepare_data as pd
import numpy as npdef train_nb(train_matrix, train_category):num_docs = len(train_matrix)num_words = len(train_matrix[0])# class is 1 for abusive doc, so sum(train_category) is the sum of all abusive docsp_abusive = np.sum(train_category) / float(num_docs)# p0_num and p1_num are vectorsp0_num = np.zeros(num_words)p1_num = np.zeros(num_words)p0_denom = 0.0p1_denom = 0.0for i in range(num_docs):if train_category[i] == 1:# Vector plusp1_num += train_matrix[i]p1_denom += np.sum(train_matrix[i])else:# Vector plusp0_num += train_matrix[i]p0_denom += np.sum(train_matrix[i])p0_vect = p0_num / p0_denomp1_vect = p1_num / p1_denomreturn p0_vect, p1_vect, p_abusiveif __name__ == "__main__":posting_list, class_vec = pd.load_data()vocabulary_list = pd.create_vocabulary_list(posting_list)print(vocabulary_list)train_mat = []for post_data in posting_list:train_mat.append(pd.get_vocabulary_vector(vocabulary_list, post_data))print(train_mat)p0_vect, p1_vect, p_abusive = train_nb(train_mat, class_vec)print(p0_vect)print(p1_vect)print(p_abusive)

运行结果:

D:\work\python_workspace\machine_learning\venv\Scripts\python.exe D:/work/python_workspace/machine_learning/naive_bayes/training.py
['food', 'worthless', 'licks', 'park', 'take', 'ate', 'mr', 'steak', 'to', 'flea', 'please', 'help', 'dalmation', 'is', 'garbage', 'how', 'dog', 'maybe', 'him', 'quit', 'has', 'problems', 'I', 'my', 'cute', 'love', 'so', 'buying', 'posting', 'stop', 'not', 'stupid']
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1], [0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1]]
[0.         0.         0.04166667 0.         0.         0.041666670.04166667 0.04166667 0.04166667 0.04166667 0.04166667 0.041666670.04166667 0.04166667 0.         0.04166667 0.04166667 0.0.08333333 0.         0.04166667 0.04166667 0.04166667 0.1250.04166667 0.04166667 0.04166667 0.         0.         0.041666670.         0.        ]
[0.05263158 0.10526316 0.         0.05263158 0.05263158 0.0.         0.         0.05263158 0.         0.         0.0.         0.         0.05263158 0.         0.10526316 0.052631580.05263158 0.05263158 0.         0.         0.         0.0.         0.         0.         0.05263158 0.05263158 0.052631580.05263158 0.15789474]
0.5Process finished with exit code 0

我们分别得到了词汇表中每个单词分别在非恶意评论和恶意评论中的条件概率,以及任何一篇文章是恶意文章的概率。注意,这里我们计算的是每个单词(属性)的条件概率,我们默认单词之间没有关联,相互独立。这就是朴素贝叶斯中朴素两个字的含义。

可以发现,上面输出结果中每个单词的概率都非常小,如果每个属性相乘得到的结果会非常小,可能存在溢出的问题。另外,某些概率为0,一旦相乘整个结果就为0。为了解决这两个问题,我们可以通过对数将乘法变换为加法,并假设词汇表中的单词至少出现一次。

创建Python模块training2.py,并输入以下代码:

import naive_bayes.prepare_data as pd
import numpy as npdef train_nb(train_matrix, train_category):num_docs = len(train_matrix)num_words = len(train_matrix[0])# class is 1 for abusive doc, so sum(train_category) is the sum of all abusive docsp_abusive = np.sum(train_category) / float(num_docs)# p0_num and p1_num are vectorsp0_num = np.ones(num_words)p1_num = np.ones(num_words)p0_denom = num_wordsp1_denom = num_wordsfor i in range(num_docs):if train_category[i] == 1:# Vector plusp1_num += train_matrix[i]p1_denom += np.sum(train_matrix[i])else:# Vector plusp0_num += train_matrix[i]p0_denom += np.sum(train_matrix[i])p0_vect = np.log(p0_num / p0_denom)p1_vect = np.log(p1_num / p1_denom)return p0_vect, p1_vect, p_abusiveif __name__ == "__main__":posting_list, class_vec = pd.load_data()vocabulary_list = pd.create_vocabulary_list(posting_list)print(vocabulary_list)train_mat = []for post_data in posting_list:train_mat.append(pd.get_vocabulary_vector(vocabulary_list, post_data))print(train_mat)p0_vect, p1_vect, p_abusive = train_nb(train_mat, class_vec)print(p0_vect)print(p1_vect)print(p_abusive)

运行结果:

D:\work\python_workspace\machine_learning\venv\Scripts\python.exe D:/work/python_workspace/machine_learning/naive_bayes/training2.py
['park', 'flea', 'stupid', 'has', 'stop', 'my', 'take', 'dog', 'problems', 'worthless', 'to', 'posting', 'mr', 'buying', 'quit', 'how', 'ate', 'is', 'love', 'cute', 'licks', 'help', 'I', 'not', 'him', 'food', 'please', 'dalmation', 'garbage', 'so', 'steak', 'maybe']
[[0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0], [0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]]
[-4.02535169 -3.33220451 -4.02535169 -3.33220451 -3.33220451 -2.63905733-4.02535169 -3.33220451 -3.33220451 -4.02535169 -3.33220451 -4.02535169-3.33220451 -4.02535169 -4.02535169 -3.33220451 -3.33220451 -3.33220451-3.33220451 -3.33220451 -3.33220451 -3.33220451 -3.33220451 -4.02535169-2.9267394  -4.02535169 -3.33220451 -3.33220451 -4.02535169 -3.33220451-3.33220451 -4.02535169]
[-3.23867845 -3.93182563 -2.54553127 -3.93182563 -3.23867845 -3.93182563-3.23867845 -2.83321334 -3.93182563 -2.83321334 -3.23867845 -3.23867845-3.93182563 -3.23867845 -3.23867845 -3.93182563 -3.93182563 -3.93182563-3.93182563 -3.93182563 -3.93182563 -3.93182563 -3.93182563 -3.23867845-3.23867845 -3.23867845 -3.93182563 -3.93182563 -3.23867845 -3.93182563-3.93182563 -3.23867845]
0.5Process finished with exit code 0

现在我们有了所有的训练数据,并且也解决了可能出现的一些问题。接下来我们可以开始测试分类器了。

测试分类器

测试分类器相对比较简单,给定一些单词,得到对应的词向量,再求解该词向量在每个分类中的概率,概率大的分类就是原给定单词的分类。

创建Python模块classify.py,并输入以下代码:

import numpy as np
import naive_bayes.prepare_data as pd
import naive_bayes.training2 as trdef classfy_nb(vec, p0_vec, p1_vec, p1_pro):p0 = np.sum(vec * p0_vec) + np.log(1.0 - p1_pro)p1 = np.sum(vec * p1_vec) + np.log(p1_pro)if p0 > p1:return 0else:return 1if __name__ == "__main__":posting_list, class_vec = pd.load_data()vocabulary_list = pd.create_vocabulary_list(posting_list)print(vocabulary_list)train_mat = []for post_data in posting_list:train_mat.append(pd.get_vocabulary_vector(vocabulary_list, post_data))p0_vect, p1_vect, p_abusive = tr.train_nb(train_mat, class_vec)test_entry = ['love', 'my', 'dalmation']doc = np.array((pd.get_vocabulary_vector(vocabulary_list, test_entry)))result = classfy_nb(doc, p0_vect, p1_vect, p_abusive)print("Entry: %r class is: %r" % (test_entry, result))test_entry = ['love', 'my', 'dalmation', 'stupid', 'stupid']doc = np.array((pd.get_vocabulary_vector(vocabulary_list, test_entry)))result = classfy_nb(doc, p0_vect, p1_vect, p_abusive)print("Entry: %r class is: %r" % (test_entry, result))test_entry = ['stupid', 'garbage']doc = np.array((pd.get_vocabulary_vector(vocabulary_list, test_entry)))result = classfy_nb(doc, p0_vect, p1_vect, p_abusive)print("Entry: %r class is: %r" % (test_entry, result))

运行结果:

D:\work\python_workspace\machine_learning\venv\Scripts\python.exe D:/work/python_workspace/machine_learning/naive_bayes/classify.py
['him', 'dalmation', 'garbage', 'maybe', 'food', 'please', 'I', 'my', 'dog', 'is', 'licks', 'stupid', 'so', 'help', 'take', 'cute', 'stop', 'not', 'ate', 'worthless', 'steak', 'park', 'buying', 'posting', 'flea', 'to', 'love', 'mr', 'problems', 'quit', 'has', 'how']
Entry: ['love', 'my', 'dalmation'] class is: 0
Entry: ['love', 'my', 'dalmation', 'stupid', 'stupid'] class is: 1
Entry: ['stupid', 'garbage'] class is: 1Process finished with exit code 0

可以看出,分类器能准确的对给定单词列举进行分类。注意:根据条件概率的定义,计算给定词向量在某个分类中出现的概率时需要除以该词向量在所有训练文档中出现的概率,但由于我们最终的目的不是计算准确概率数值,而是判断不同概率的大小。因此,这里就都没有除以词向量在所有训练文档中出现的概率,这并不影响最终判断结果。

实例-过滤垃圾邮件

最后通过一个实例来演示使用朴素贝叶斯算法过滤垃圾邮件。数据集中有25封垃圾邮件和25封正常邮件,我们随机选择10封邮件作为测试集,剩下的40封邮件作为训练集。首先通过分词将邮件内容分割成单词,再输入到训练算法,最后再测试10封邮件,检测算法的准确性。

创建Python模块parse_email.py,并输入以下代码:

import re
import random
import naive_bayes.prepare_data as pd
import naive_bayes.training2 as tr
import naive_bayes.classify as cr
import numpy as npdef text_parse(big_str):list_of_tokens = re.split('\s', big_str)return [tok.lower() for tok in list_of_tokens if len(tok) > 2]def spam_test():doc_list = [];class_list = [];full_text = []for i in range(1, 26):word_list = text_parse(open('email/spam/%d.txt' % i).read())doc_list.append(word_list)full_text.extend(word_list)class_list.append(1)word_list = text_parse(open('email/ham/%d.txt' % i).read())doc_list.append(word_list)full_text.extend(word_list)class_list.append(0)vocab_list = pd.create_vocabulary_list(doc_list)training_set = list(range(50));test_set = []for i in range(10):rand_index = int(random.uniform(0, len(training_set)))test_set.append(training_set[rand_index])del (training_set[rand_index])train_mat = [];train_classes = []for doc_index in training_set:train_mat.append(pd.get_vocabulary_vector(vocab_list, doc_list[doc_index]))train_classes.append(class_list[doc_index])p0V, p1V, p_spam = tr.train_nb(np.array(train_mat), np.array(train_classes))error_count = 0for doc_index in test_set:word_vector = pd.get_vocabulary_vector(vocab_list, doc_list[doc_index])if cr.classfy_nb(np.array(word_vector), p0V, p1V, p_spam) != class_list[doc_index]:error_count += 1# print("classification error %r" % doc_list[doc_index])error_rate = float(error_count) / len(test_set)# print('the error rate is: %r' % error_rate)return error_rateif __name__ == "__main__":count = 100error_rates = 0.0for i in range(count):error_rates += spam_test()average_error_rate = error_rates / countprint("Test %r times, average error rate is: %r" % (count, average_error_rate))

运行结果:

D:\work\python_workspace\machine_learning\venv\Scripts\python.exe D:/work/python_workspace/machine_learning/naive_bayes/parse_email.py
Test 100 times, average error rate is: 0.03700000000000002Process finished with exit code 0

测试100次,发现该算法的错误率为3.7%,总的来说还是比较准确了。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Python实现游戏辅助脚本

    目录预处理 需实现的功能对窗口的获得对屏幕图像的获得实现屏幕上找到特定图像实现鼠标点击、按键功能整体实现多进程思路进入关卡完成关卡死亡整个的代码代码较多,文字较少,不懂请留言 使用的是多进程,不能直接运行.py文件,需在s…...

    2024/5/4 16:27:29
  2. eclipse idea 代码规范插件

    一、环境准备 1、安装代码规范插件 eclipse安装方式: 摘自https://blog.csdn.net/qq_32448349/article/details/81744418 打开Help -> Install New Software -> work with填入https://p3c.alibaba.com/plugin/eclipse/update 把自动更新去掉不然安装不了 …...

    2024/4/21 21:22:29
  3. 嘿嘿,我的读者拿到阿里offer,复盘他的时间轴

    作者:程序员小跃 上周六晚上,我在家里刷着群消息,忽然一条私信过来:跃哥,最近拿到了阿里的 offer。虽然只是阿里的意向书,但是也表明这位同学的努力得到了回报。 一时间,当我把这个喜悦分享到群…...

    2024/4/21 21:53:37
  4. 安防视频监控系统视频上云解决方案EasyCVR语音转发功能音频数据打包发送流程介绍

    目前我们的视频上云服务平台EasyCVR已经可集成海康EHome私有协议,并且在前文中我也跟大家讲过EHome协议的配置和调用流程,有兴趣的可以阅读一下:配置及协议介绍、Ehome协议调用流程介绍。 EasyCVR语音转发功能音频数据打包发送流程 1、数据整…...

    2024/4/23 13:27:46
  5. ArcGIS 10.2安装教程

    安装包文件: 一,安装许可 安装好后,先停止服务 二,安装ArcGIS Desktop 单击setup,一路下一步即可,这里安装过程大概5-10分钟 三,启动服务 打开ArcGIS Administrator,安装产品 四&a…...

    2024/4/21 21:53:35
  6. iMindMap12中文思维导图设计软件下载安装激活教程

    iMindMap12是思维导图软件imindmap的最新版本,也是国内领先的思维导图设计软件,由创始人托尼巴赞(Tony Buzan)开发,结合着独特的自由形态头脑风暴视图模式和系统的思维导图视图模式,特别适用于头脑风暴、策…...

    2024/5/4 17:10:27
  7. 大数据信息资料采集:运动场馆健身房体育锻炼商家数据信息采集

    大数据信息资料采集:运动场馆健身房体育锻炼商家数据信息采集 数据采集满足多种业务场景:适合产品、运营、销售、数据分析、政府机关、电商从业者、学术研究等多种身份职业。 舆情监控:全方位监测公开信息,抢先获取舆论趋势。 市场分析&…...

    2024/4/29 9:46:49
  8. Win10 安装 Rational Rose 教程(亲自测试)

    本内容主要借鉴于别人的博客,感兴趣的也可以去看他的博客 网址: https://blog.csdn.net/hdkvsyralkvv_hk/article/details/105330982 (1)先下载相关文件 链接: https://pan.baidu.com/s/1CBTOCiHnGNkmHG6osPIJiQ 提取码…...

    2024/4/23 13:15:13
  9. node学习笔记之mongodb

    mongoDB 这是一个数据库,与MySQL的区别就是,它是一个非关系型数据库 NoSql数据库 1.性能高、I/O处理快 2.速度快 3.稳定不好,占用空间大 1.安装MongoDB 下载对应版本的mongodb来进行安装,安装的后注意需要手动设置数据库的位置…...

    2024/4/24 21:40:31
  10. 软件设计原则-开闭原则

    开闭原则开闭原则定义开闭原则应用案例说明开闭原则定义 开闭原则是Java世界里最基础的设计 原则,它指导我们如何建立一个稳定的、灵活的系统,定义如下: Software entities like classes,modules and functions should be open for extensio…...

    2024/5/4 21:18:39
  11. Maven与JDK环境变量配置

    由于Maven是依赖JDK使用的,所以我们的电脑上需要安装 JDK1.7 版本 并且配置好环境变量,我这边使用的是 JDK8 相关版本。然后再配置Maven的 好啦,废话讲完,上干货 JDK配置环境变量,右击此电脑,选择并点击属…...

    2024/4/26 13:23:48
  12. flax布局

    flax布局 flax布局:Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。 任何一个容器都可以指定为 Flex 布局。行内元素也可以使用 Flex 布局。Webkit 内核的浏览器,必须加上-webkit前缀。注意&#…...

    2024/5/1 3:27:54
  13. 数通部门软开9.16凉经

    一面:1h10min 预约的2点,2:25之后开始。 1.自我介绍,项目。 2.说完然后直接题目发过来,题目大概是: 有本词根的词典 “an me cat ”, 有个句子 “I was meeting another cattey” 句子和词根都是…...

    2024/5/5 0:54:59
  14. 致远OA二开整理(基础版,本地环境搭建,插件project设置,页面引入外部js文档)

    最近在看致远OA开发相关,顺便整理了分文档(基础的)。 关注下方公众号 回复“致远OA”免费获取。...

    2024/5/4 22:15:54
  15. Linux Tomcat配置jks格式证书

    在Tomcat的conf 目录下生成p12证书 openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 -name server 在Tomcat的conf 目录下通过p12证书,生成jks证书 keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -destkeystore…...

    2024/4/24 22:33:35
  16. 打开python的IDLE

    打开python的IDLE #找到安装python的文件 在目录下找到Lib目录 这里写自定义目录标题打开python的IDLE欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创…...

    2024/4/21 21:53:29
  17. LintCode 1308. 因子组合 Python算法

    描述 数字可以被视为其因数的乘积。 例如, 8 2 x 2 x 2; 2 x 4。 编写一个函数,可以输入整数n并返回其因子的所有可能组合。 说明 您可以假设n总是正数。 因数应大于1且小于n。 样例 - 样例1输入: 12 输出: [[2, 6],[2, 2, 3],[3, 4] ] 解释: 2*…...

    2024/5/4 15:36:05
  18. 异步非阻塞的艺术,java并发库中CompletableFuture使用,及python库tornado使用对比

    老猿猿应该都用过guava的ListenableFuture,现在大家都用CompletableFuture了 使用案例地址 (并发处理任务,并且汇总结果后统一处理数据): https://download.csdn.net/download/u011643716/12828671 JDK1.8中的Comp…...

    2024/4/21 12:35:35
  19. SpringCloud——zuul

    概述 Netflix Zuul是一个API网关,它的主要功能是提供网关服务。Netflix Zuul提供了一系列不同类型的过滤器(Filter),通过这些过滤器,系统维护人员能够快速灵活地过滤服务、限制流量、实现服务器的负载均衡,从而避免外部请求冲垮微…...

    2024/4/26 23:18:24
  20. gcc版本切换python版本切换

    目录 gcc版本切换 python版本切换1 python版本切换2 gcc版本切换 查看系统已装gcc ls /usr/bin/gcc* 系统ubuntu18.04,预装gcc7和gcc6,因需要安装gcc4.8 sudo apt-get install gcc-4.8 gcc-4.8-multilib sudo apt-get install g-4.8 g-4.8-multil…...

    2024/5/2 11:39:55

最新文章

  1. C语言-自定义类型:结构体,枚举,联合

    目录 一、结构体1.1 结构体变量的定义和初始化1.2 结构体内存对齐1.3 修改默认对齐数1.4 结构体传参 二、位段2.1 什么是位段2.2 位段的内存分配2.3 位段的跨平台问题2.4 位段的应用 三、枚举3.1 枚举类型的定义3.2 枚举的优点 四、联合(共用体)4.1 联合…...

    2024/5/5 0:53:10
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. C# Solidworks二次开发:六种配合方式以及注意事项API详解

    今天要写的文章是关于配合的一些API介绍。 如果大家还不知道创建配合的API用的是哪个,可以看一下我之前写的文章:C# Solidworks二次开发:创建距离配合以及移动组件API详解_solidworks transform2-CSDN博客 (1)今天要…...

    2024/5/3 11:49:19
  4. N5171B是德科技N5171B信号发生器

    181/2461/8938产品概述: N5171B EXG 射频模拟信号发生器具有最佳的 EXG,旨在满足您对组件参数测试和接收器校准的信号需求。其出色的硬件性能可提供更快的吞吐量、更长的正常运行时间以及极好的准确性和可重复性。 Agilent / HP N5171B EXG 射频模拟信…...

    2024/5/4 4:53:18
  5. 嵌入式硬件中常见的面试问题与实现

    1 01 请列举您知道的电阻、电容、电感品牌(最好包括国内、国外品牌) ▶电阻 美国:AVX、VISHAY威世 日本:KOA兴亚、Kyocera京瓷、muRata村田、Panasonic松下、ROHM罗姆、susumu、TDK 台湾:LIZ丽智、PHYCOM飞元、RALEC旺诠、ROYALOHM厚生、SUPEROHM美隆、TA-I大毅、TMT…...

    2024/5/2 2:32:41
  6. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/4 12:05:22
  7. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/4 11:23:32
  8. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...

    2024/5/4 14:46:16
  9. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...

    2024/5/4 23:54:44
  10. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...

    2024/5/4 12:10:13
  11. 【Objective-C】Objective-C汇总

    方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/4 23:54:49
  12. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...

    2024/5/4 23:54:44
  13. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/4 14:46:12
  14. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...

    2024/5/4 14:46:11
  15. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/4 14:46:11
  16. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/4 2:14:16
  17. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/4 21:24:42
  18. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/4 12:39:12
  19. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...

    2024/5/4 13:16:06
  20. --max-old-space-size=8192报错

    vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...

    2024/5/4 16:48:41
  21. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...

    2024/5/4 14:46:05
  22. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...

    2024/5/4 2:00:16
  23. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...

    2024/5/4 23:54:30
  24. python django 小程序图书借阅源码

    开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图&#xff0…...

    2024/5/4 9:07:39
  25. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/4 14:46:02
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57