Python 物联网入门指南(一)(4)

简介: Python 物联网入门指南(一)

Python 物联网入门指南(一)(3)https://developer.aliyun.com/article/1506427

使用 SMB 共享树莓派的主文件夹

当您将树莓派连接到网络时,您可以通过设置文件共享来访问主文件夹;这样可以更轻松地传输文件,并提供了一种快速简便的备份数据的方法。服务器消息块SMB)是一种与 Windows 文件共享、OS X 和 Linux 兼容的协议。

准备工作

确保您的树莓派已接通电源并连接到互联网。

您还需要另一台在同一本地网络上的计算机来测试新的共享。

如何做…

首先,我们需要安装samba,这是一款处理与 Windows 共享方法兼容的文件夹共享的软件:

  1. 确保您使用以下命令来获取可用软件包的最新列表:
sudo apt-get update
sudo apt-get install samba  

安装将需要大约 20MB 的空间,并需要几分钟的时间。

  1. 安装完成后,我们可以按照以下方式复制配置文件,以便在需要时恢复默认设置:
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup
sudo nano /etc/samba/smb.conf  

向下滚动并找到名为Authentication的部分;将# security = user行更改为security = user

如文件中所述,此设置确保您必须输入用户名和密码才能访问树莓派的文件(这对于共享网络非常重要)。

找到名为Share Definitions[homes]的部分,并将read only = yes行更改为read only = no

这将允许我们查看并向共享的主文件夹写入文件。完成后,按Ctrl + XYEnter保存并退出。

如果您已将默认用户从pi更改为其他内容,请在以下说明中进行替换。

  1. 现在,我们可以添加pi(默认用户)来使用samba
sudo pdbedit -a -u pi
  1. 现在,输入密码(您可以使用与登录相同的密码或选择不同的密码,但避免使用默认的树莓密码,这对某人来说将非常容易猜到)。重新启动samba以使用新的配置文件,如下所示:
sudo /etc/init.d/samba restart
[ ok ] Stopping Samba daemons: nmbd smbd.
[ ok ] Starting Samba daemons: nmbd smbd.  
  1. 要进行测试,您需要知道树莓派的hostname(默认hostnameraspberrypi)或其 IP 地址。您可以使用以下命令找到这两者。
hostname
  1. 对于 IP 地址,添加-I
hostname -I  

在网络上的另一台计算机上,在资源管理器路径中输入\raspberrypipi地址。

根据您的网络,计算机应该能够在网络上找到树莓派,并提示输入用户名和密码。如果它无法使用hostname找到共享,您可以直接使用 IP 地址,其中192.168.1.69应更改为匹配 IP 地址\192.168.1.69pi

保持树莓派最新

树莓派使用的 Linux 镜像经常更新,以包括对系统的增强、修复和改进,以及对新硬件的支持或对最新板的更改。您安装的许多软件包也可以进行更新。

如果您打算在另一个树莓派板上使用相同的系统镜像(特别是较新的板),这一点尤为重要,因为旧镜像将缺乏对任何布线更改或替代 RAM 芯片的支持。新固件应该可以在较旧的树莓派板上工作,但是旧固件可能与最新的硬件不兼容。

幸运的是,每次有新版本发布时,您无需重新刷写 SD 卡,因为可以进行更新。

准备就绪

您需要连接到互联网才能更新系统。始终建议首先备份您的镜像(至少复制您的重要文件)。

您可以使用uname -a命令检查当前固件的版本,如下所示:

Linux raspberrypi 4.4.9-v7+ #884 SMP Fri May 6 17:28:59 BST 2016 armv7l GNU/Linux  

可以使用/opt/vc/bin/vcgencmd version命令来检查 GPU 固件,如下所示:

May  6 2016 13:53:23
Copyright (c) 2012 Broadcom
version 0cc642d53eab041e67c8c373d989fef5847448f8 (clean) (release)

如果您在较新的板上使用较旧的固件(2012 年 11 月之前),这一点很重要,因为最初的 B 型板只有 254MB RAM。升级可以使固件利用额外的内存(如果可用)。

free -h命令将详细说明主处理器可用的 RAM(总 RAM 在 GPU 和 ARM 核心之间分配),并将给出以下输出:

total       used       free     shared    buffers     cached
    Mem:          925M       224M       701M       7.1M        14M       123M
    -/+ buffers/cache:        86M       839M
    Swap:          99M         0B        99M

然后可以在重新启动后重新检查前面的输出,以确认它们已经更新(尽管它们可能已经是最新的)。

如何做…

  1. 在运行任何升级或安装任何软件包之前,值得确保您拥有存储库中最新的软件包列表。update命令获取可用软件和版本的最新列表:
sudo apt-get update  
  1. 如果您只想获取当前软件包的升级,upgrade将使它们全部保持最新状态:
sudo apt-get upgrade
  1. 为确保您运行的是最新版本的 Raspbian,可以运行dist-upgrade(请注意:这可能需要一小时或更长时间,具体取决于需要升级的数量)。这将执行upgrade将执行的所有更新,但还将删除多余的软件包并进行清理:
sudo apt-get dist-upgrade  

这两种方法都将升级软件,包括在启动和启动时使用的固件(bootcode.binstart.elf)。

  1. 要更新固件,可以使用以下命令:
sudo rpi-update  

还有更多…

您经常会发现您想要对设置进行干净的安装,但是这意味着您将不得不从头开始安装所有内容。为了避免这种情况,我开发了 Pi-Kitchen 项目(github.com/PiHw/Pi-Kitchen),基于Kevin Hill的基础工作。这旨在提供一个灵活的平台,用于创建可以自动部署到 SD 卡的定制设置:

Pi Kitchen 允许在启动之前配置树莓派

Pi-Kitchen 允许配置各种口味,可以从 NOOBS 菜单中选择。每种口味都包括一系列食谱,每个食谱都提供最终操作系统的特定功能或特性。食谱可以从为 Wi-Fi 设备设置自定义驱动程序,到在您的网络上映射共享驱动器,再到提供一个功能齐全的网络服务器,所有这些都组合在一起,以满足您的要求。

该项目处于测试阶段,作为概念验证开发,但是一旦您配置好一切,将完全工作的设置直接部署到 SD 卡上将非常有用。最终,该项目可以与 Kevin Hill 的 NOOBS 的高级版本PINN Is Not NOOBSPINN)结合使用,旨在为高级用户提供额外功能,例如允许操作系统和配置存储在您的网络上或外部 USB 存储器上。

第二章:划分文本数据和构建文本分类器

本章介绍了以下主题:

  • 构建文本分类器
  • 使用标记化预处理数据
  • 词干化文本数据
  • 使用分块划分文本
  • 构建词袋模型
  • 文本分类器的应用

介绍

本章介绍了构建文本分类器的方法。这包括从数据库中提取重要特征、训练、测试和验证文本分类器。最初,使用常用词训练文本分类器。后来,训练好的文本分类器用于预测。构建文本分类器包括使用标记化预处理数据、词干化文本数据、使用分块划分文本和构建词袋模型。

构建文本分类器

分类器单元通常被认为是将数据库分成各种类别的。朴素贝叶斯分类器方案被广泛认为是根据训练模型将文本分隔的文献。本章的这一部分最初考虑了一个带有关键词的文本数据库;特征提取从文本中提取关键短语并训练分类器系统。然后,实施词频-逆文档频率tf-idf)转换以指定单词的重要性。最后,使用分类器系统预测并打印输出。

如何做…

  1. 在新的 Python 文件中包含以下行以添加数据集:
from sklearn.datasets import fetch_20newsgroups 
category_mapping = {'misc.forsale': 'Sellings', 'rec.motorcycles': 'Motorbikes', 
        'rec.sport.baseball': 'Baseball', 'sci.crypt': 'Cryptography', 
        'sci.space': 'OuterSpace'} 
training_content = fetch_20newsgroups(subset='train', 
categories=category_mapping.keys(), shuffle=True, random_state=7) 
  1. 执行特征提取以从文本中提取主要单词:
from sklearn.feature_extraction.text import CountVectorizer 
vectorizing = CountVectorizer() 
train_counts = vectorizing.fit_transform(training_content.data) 
print "nDimensions of training data:", train_counts.shape 
  1. 训练分类器:
from sklearn.naive_bayes import MultinomialNB 
from sklearn.feature_extraction.text import TfidfTransformer 
input_content = [ 
    "The curveballs of right handed pitchers tend to curve to the left", 
    "Caesar cipher is an ancient form of encryption", 
    "This two-wheeler is really good on slippery roads" 
] 
tfidf_transformer = TfidfTransformer() 
train_tfidf = tfidf_transformer.fit_transform(train_counts) 
  1. 实现多项式朴素贝叶斯分类器:
classifier = MultinomialNB().fit(train_tfidf, training_content.target) 
input_counts = vectorizing.transform(input_content) 
input_tfidf = tfidf_transformer.transform(input_counts) 
  1. 预测输出类别:
categories_prediction = classifier.predict(input_tfidf) 
  1. 打印输出:
for sentence, category in zip(input_content, categories_prediction): 
    print 'nInput:', sentence, 'nPredicted category:',  
            category_mapping[training_content.target_names[category]] 

以下屏幕截图提供了根据数据库输入预测对象的示例:


它是如何工作的…

本章的前一部分提供了有关实施分类器部分和一些样本结果的见解。分类器部分是基于训练好的朴素贝叶斯中的先前文本与测试序列中的关键测试之间的比较工作的。

另请参阅

请参阅以下文章:

使用标记化预处理数据

数据的预处理涉及将现有文本转换为学习算法的可接受信息。

标记化是将文本分成一组有意义的片段的过程。这些片段被称为标记。

如何做…

  1. 介绍句子标记化:
from nltk.tokenize import sent_tokenize
  1. 形成一个新的文本标记器:
tokenize_list_sent = sent_tokenize(text)
print "nSentence tokenizer:" 
print tokenize_list_sent 
  1. 形成一个新的单词标记器:
from nltk.tokenize import word_tokenize 
print "nWord tokenizer:" 
print word_tokenize(text) 
  1. 引入一个新的 WordPunct 标记器:
from nltk.tokenize import WordPunctTokenizer 
word_punct_tokenizer = WordPunctTokenizer() 
print "nWord punct tokenizer:" 
print word_punct_tokenizer.tokenize(text) 

标记器得到的结果如下所示。它将一个句子分成单词组:

词干化文本数据

词干处理过程涉及为标记器的单词创建适当的缩写单词。

如何做…

  1. 使用新的 Python 文件初始化词干处理过程:
from nltk.stem.porter import PorterStemmer 
from nltk.stem.lancaster import LancasterStemmer 
from nltk.stem.snowball import SnowballStemmer 
  1. 让我们描述一些要考虑的词,如下所示:
words = ['ability', 'baby', 'college', 'playing', 'is', 'dream', 'election', 'beaches', 'image', 'group', 'happy'] 
  1. 确定要使用的一组词干处理器
stemmers = ['PORTER', 'LANCASTER', 'SNOWBALL'] 
  1. 为所选的“词干处理器”初始化必要的任务:
stem_porter = PorterStemmer() 
stem_lancaster = LancasterStemmer() 
stem_snowball = SnowballStemmer('english') 
  1. 格式化表格以打印结果:
formatted_row = '{:>16}' * (len(stemmers) + 1) 
print 'n', formatted_row.format('WORD', *stemmers), 'n' 
  1. 反复检查单词列表,并使用选择的“词干处理器”对它们进行排列:
for word in words:
  stem_words = [stem_porter.stem(word), 
  stem_lancaster.stem(word), 
  stem_snowball.stem(word)] 
  print formatted_row.format(word, *stem_words) 

词干处理过程得到的结果如下截图所示:

使用分块分割文本

分块过程可用于将大文本分成小的、有意义的单词。

如何做…

  1. 使用 Python 开发并导入以下包:
import numpy as np 
from nltk.corpus import brown 
  1. 描述将文本分成块的函数:
# Split a text into chunks 
def splitter(content, num_of_words): 
   words = content.split(' ') 
   result = [] 
  1. 初始化以下编程行以获取分配的变量:
current_count = 0 
   current_words = []
  1. 开始使用单词进行迭代:
for word in words: 
     current_words.append(word) 
     current_count += 1 
  1. 获取必要数量的单词后,重新组织变量:
if current_count == num_of_words: 
       result.append(' '.join(current_words)) 
       current_words = [] 
       current_count = 0 
  1. 将块附加到输出变量:
result.append(' '.join(current_words)) 
       return result 
  1. 导入“布朗语料库”的数据,并考虑前 10000 个单词:
if __name__=='__main__': 
  # Read the data from the Brown corpus 
  content = ' '.join(brown.words()[:10000]) 
  1. 描述每个块中的字大小:
# Number of words in each chunk 
  num_of_words = 1600 
  1. 初始化一对重要的变量:
chunks = [] 
  counter = 0 
  1. 通过调用“分割器”函数打印结果:
num_text_chunks = splitter(content, num_of_words) 
  print "Number of text chunks =", len(num_text_chunks) 
  1. 分块后得到的结果如下截图所示:


构建词袋模型

在处理包含大单词的文本文档时,我们需要将它们转换为几种类型的算术表示。我们需要将它们制定为适合机器学习算法的形式。这些算法需要算术信息,以便它们可以检查数据并提供重要的细节。词袋程序帮助我们实现这一点。词袋创建一个文本模型,使用文档中的所有单词来发现词汇。随后,它通过构建文本中所有单词的直方图来为每个文本创建模型。

如何做…

  1. 通过导入以下文件初始化一个新的 Python 文件:
import numpy as np 
from nltk.corpus import brown 
from chunking import splitter 
  1. 定义main函数并从“布朗语料库”中读取输入数据:
if __name__=='__main__': 
        content = ' '.join(brown.words()[:10000]) 
  1. 将文本内容分成块:
num_of_words = 2000 
    num_chunks = [] 
    count = 0 
    texts_chunk = splitter(content, num_of_words) 
  1. 基于这些“文本”块构建词汇表:
for text in texts_chunk: 
      num_chunk = {'index': count, 'text': text} 
      num_chunks.append(num_chunk) 
      count += 1
  1. 提取文档词矩阵,有效地计算文档中每个单词的出现次数:
from sklearn.feature_extraction.text      
  import CountVectorizer
  1. 提取文档术语“矩阵”:
from sklearn.feature_extraction.text import CountVectorizer 
vectorizer = CountVectorizer(min_df=5, max_df=.95) 
matrix = vectorizer.fit_transform([num_chunk['text'] for num_chunk in num_chunks]) 
  1. 提取词汇并打印它:
vocabulary = np.array(vectorizer.get_feature_names()) 
print "nVocabulary:" 
print vocabulary 
  1. 打印文档术语“矩阵”:
print "nDocument term matrix:" 
chunks_name = ['Chunk-0', 'Chunk-1', 'Chunk-2', 'Chunk-3', 'Chunk-4'] 
formatted_row = '{:>12}' * (len(chunks_name) + 1) 
print 'n', formatted_row.format('Word', *chunks_name), 'n' 
  1. 迭代单词,并打印每个单词在不同块中的重现:
for word, item in zip(vocabulary, matrix.T): 
# 'item' is a 'csr_matrix' data structure 
 result = [str(x) for x in item.data] 
 print formatted_row.format(word, *result)
  1. 执行词袋模型后获得的结果如下所示:


为了理解它在给定句子上的工作原理,请参考以下内容:

文本分类器的应用

文本分类器用于分析客户情绪,在产品评论中,当在互联网上搜索查询时,在社交标签中,预测研究文章的新颖性等等。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
13天前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
13天前
|
Python
深入理解Python装饰器:从入门到实践####
本文旨在通过简明扼要的方式,为读者揭开Python装饰器的神秘面纱,从基本概念、工作原理到实际应用场景进行全面解析。不同于常规的摘要仅概述内容概要,本文将直接以一段精炼代码示例开篇,展示装饰器如何优雅地增强函数功能,激发读者探索兴趣,随后深入探讨其背后的机制与高级用法。 ####
45 11
|
10天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
10天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
10天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
16天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
60 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
10天前
|
设计模式 缓存 开发框架
Python中的装饰器:从入门到实践####
本文深入探讨了Python中装饰器的工作原理与应用,通过具体案例展示了如何利用装饰器增强函数功能、提高代码复用性和可读性。读者将学习到装饰器的基本概念、实现方法及其在实际项目开发中的实用技巧。 ####
21 3
|
13天前
|
机器学习/深度学习 数据采集 数据可视化
Python在数据科学中的应用:从入门到实践
本文旨在为读者提供一个Python在数据科学领域应用的全面概览。我们将从Python的基础语法开始,逐步深入到数据处理、分析和可视化的高级技术。文章不仅涵盖了Python中常用的数据科学库,如NumPy、Pandas和Matplotlib,还探讨了机器学习库Scikit-learn的使用。通过实际案例分析,本文将展示如何利用Python进行数据清洗、特征工程、模型训练和结果评估。此外,我们还将探讨Python在大数据处理中的应用,以及如何通过集成学习和深度学习技术来提升数据分析的准确性和效率。
|
12天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
12天前
|
人工智能 数据挖掘 程序员
Python编程入门:从零到英雄
【10月更文挑战第37天】本文将引导你走进Python编程的世界,无论你是初学者还是有一定基础的开发者,都能从中受益。我们将从最基础的语法开始讲解,逐步深入到更复杂的主题,如数据结构、面向对象编程和网络编程等。通过本文的学习,你将能够编写出自己的Python程序,实现各种功能。让我们一起踏上Python编程之旅吧!
下一篇
无影云桌面