- 2024-12-03
-
加入了学习《DigiKey 应用说:大模型时代的智能汽车》,观看 DigiKey 应用说:大模型时代的智能汽车
- 2024-11-01
-
加入了学习《【2024 DigiKey创意大赛】- 基于毫米波雷达的生命体征检测及健康监护系统》,观看 【2024 DigiKey创意大赛】- 基于毫米波雷达的生命体征检测及健康监护系统-作品提交
- 2024-09-25
-
加入了学习《DigiKey 应用说:Raspberry Pi 5 在视频直播中的应用》,观看 Raspberry Pi 5 在视频直播中的应用
- 2024-08-22
-
发表了主题帖:
【超小型 Linux 开发套件Quantum Tiny Linux】-内核编译失败
本帖最后由 硬核王同学 于 2024-8-24 17:17 编辑
一、源码分析
先进到稚晖君的仓库目录下,并配置下环境,可以参考这个wiki:https://wiki.friendlyelec.com/wiki/index.php/Building_U-boot_and_Linux_for_H5/H3/H2+/zh
配置编译器
先下载H3的交叉编译器
mkdir -p /opt/FriendlyARM/toolchain
tar xf arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz -C /opt/FriendlyARM/toolchain/
export PATH=/opt/FriendlyARM/toolchain/4.9.3/bin:$PATH
export GCC_COLORS=auto
. ~/.bashrc
arm-linux-gcc -v
出现version 4.9.3 (ctng-1.21.0-229g-FA)即配置成功
编译Linux内核
cd linux
touch .scmversion
make linux_card_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
chmod 777 scripts/gen_initramfs_list.sh
sudo chmod 777 /usr/lib/cups/backend/cups-brf
sudo chmod 777 /usr/lib/cups/backend/implicitclass
make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-
/usr/
make zImage dtbs ARCH=arm CROSS_COMPILE=arm-linux-
这里碰到4个问题:
1.源码仓库的kernel.tar.gz是二进制文件,不是压缩包,所以只能回退到未压缩的提交
2.源码编译碰到multiple definition of ‘yylloc‘,需要修改scripts/dtc/dtc-lexer.lex.c文件中YYLTYPE yylloc;为extern YYLTYPE yylloc;
3.make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-的时候,要提前把INITRAMFS_SOURCE定义一个文件,否则编译会报错
4.make zImage dtbs ARCH=arm CROSS_COMPILE=arm-linux-时,出现段错误,到这一步排查不下去了,有大神可以帮忙看一下
最后本来想分析下mpu6050驱动源码,现在估计废了,大佬帮忙看看怎么编译生成设备树和镜像文件的
- 2024-08-14
-
发表了主题帖:
一起读《机器学习算法与实现 —— Python编程与应用实例》- 第5章 k均值聚类算法
上一章的k最近邻算法是一种分类方法,是监督学习的一种;而k均值聚类算法是一种聚类算法,是无监督学习的一种。通俗的讲,k最近邻算法的类别是已知的(即分类),而k均值聚类算法是未知的(即聚类)。
一、无监督学习思想
监督学习是指当训练集有明确的答案时,需要寻找问题与答案之间关系的学习方式。
无监督学习只需要数据,即没有明确的答案,也可以挖掘数据之间的关系。
聚类的行为本源来自人类天生具备的归纳和总结能力。
二、k均值聚类原理
书上讲的有点绕,这里我讲下我自己的理解:
在上方这幅图中,很容易看出有三种类型,分别是黄圈、绿圈、红圈。
当我们使用k均值聚类算法时,并不知道当前一共有多少种类型,所以只能假设有k个类型(这个k一定大于1且小于总样本数)。
假设我们的k为3,可以随机选择3个点来作为3个类别的中心点,并划分这3个中心点附近的样本属于哪一类。
此时求每个类别中样本的平均值,这个平均值就当成下一次分类的中心点,并再次划分这3个中心点附近的样本属于哪一类。
重复上述过程,直到中心点不再发生显著变化或达到预设的迭代次数或样本划分属于哪一类不再发生变化。
此时就找到了k个类型的k个中心点,即达到k均值聚类算法的最优点。
三、k均值聚类算法
这里引用下布树辉老师的讲义:
四、算法过程演示
这里也是直接看布树辉老师的讲义就行了,重点是自己将k均值聚类算法编程实现!
https://gitee.com/pi-lab/machinelearning_notebook/blob/master/3_kmeans/1-k-means.ipynb
五、k均值聚类算法实现
先使用模拟生成的满足高斯分布的随机数据作为数据集来演示算法。
%matplotlib inline
# import librarys
import numpy as np
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import random
# 生成数据
centers = [(7, 0), (0, 0), (5, 5)]
n_samples = 500
X, y = make_blobs(n_samples=n_samples, n_features=2,
cluster_std=1.0, centers=centers,
shuffle=True, random_state=42)
# 画出数据
plt.figure(figsize=(15, 9))
marksamples = ['or', 'ob', 'og', 'ok', '^r', '^b', '<g'] # 样本图形标记
for i in range(len(X)):
markindex = y[i]
plt.plot(X[i, 0], X[i, 1], marksamples[markindex], markersize=10)
plt.savefig("fig-res-k-means_data.pdf")
plt.show()
绘制原始数据,特征分布如图所示
有了原始数据,就可以着手实现k均值聚类算法,初始化聚类过程通过随机选择样本的方式实现。
# k-means
def calc_distance(v1, v2):
"""
计算两个样本的特征距离
v1 - 样本1的特征向量
v2 - 样本2的特征向量
"""
return np.sum(np.square(v1-v2))
def rand_cluster_cents(X, k):
"""
初始化聚类中心:通过在区间范围随机产生的值作为新的中心点
X - 样本数据 (n x D)
k - 聚类个数
"""
# 样本数
n=np.shape(X)[0]
# 生成随机下标列表
dataIndex=list(range(n))
random.shuffle(dataIndex)
centroidsIndex = dataIndex[:k]
# 返回随机的聚类中心
return X[centroidsIndex, :]
def kmeans(X, k):
"""
kMeans算法
X - 样本数据 (n x D)
k - 聚类个数
"""
# 样本总数
n = np.shape(X)[0]
# 分配样本到最近的簇:存[簇序号,距离的平方] (n行 x 2列)
clusterAssment = np.zeros((n, 2))
# step1: 通过随机产生的样本点初始化聚类中心
centroids = rand_cluster_cents(X, k)
print('最初的中心=', centroids)
iterN = 0
while True:
clusterChanged = False
# step2:分配到最近的聚类中心对应的簇中
for i in range(n):
minDist = np.inf;
minIndex = -1
for j in range(k):
# 计算第i个样本到第j个中心点的距离
distJI = calc_distance(centroids[j, :], X[i, :])
if distJI < minDist:
minDist = distJI
minIndex = j
# 样本上次分配结果跟本次不一样,标志位clusterChanged置True
if clusterAssment[i, 0] != minIndex:
clusterChanged = True
clusterAssment[i, :] = minIndex, minDist ** 2 # 分配样本到最近的簇
iterN += 1
sse = sum(clusterAssment[:, 1])
print('the SSE of %d' % iterN + 'th iteration is %f' % sse)
# step3:更新聚类中心
for cent in range(k): # 样本分配结束后,重新计算聚类中心
ptsInClust = X[clusterAssment[:, 0] == cent, :]
centroids[cent, :] = np.mean(ptsInClust, axis=0)
# 如果聚类重心没有发生改变,则退出迭代
if not clusterChanged:
break
return centroids, clusterAssment
# 进行k-means聚类
k = 3 # 用户定义聚类数
mycentroids, clusterAssment = kmeans(X, k)
通过rand_cluster_cents()函数生成初始聚类中心。
在上述程序中,打乱样本下标后,选择前k个样本作为初始聚类中心。k均值主函数kmeans()主要分为3个步骤:
步骤1,调用函数rand_cluster_cents(),通过随机产生的样本点初始化聚类中心。
步骤2,计算每个样本到每个聚类中心的距离,将距离最近的聚类中心更新为新值。
步骤3,根据每个样本所属的聚类关系计算新的聚类中心。
当给定k=3时,输出为:
最初的中心= [[4.95053629 5.67481949]
[0.48100923 0.22388402]
[7.51503527 0.51378595]]
the SSE of 1th iteration is 4874.740134
the SSE of 2th iteration is 3505.099431
the SSE of 3th iteration is 3502.239035
用以下程序将聚类结果可视化:
def datashow(dataSet, k, centroids, clusterAssment, fnFig=None): # 二维空间显示聚类结果
from matplotlib import pyplot as plt
num, dim = np.shape(dataSet) # 样本数num ,维数dim
if dim != 2:
print('sorry,the dimension of your dataset is not 2!')
return 1
marksamples = ['or', 'ob', 'og', 'ok', '^r', '^b', '<g'] # 样本图形标记
if k > len(marksamples):
print('sorry,your k is too large,please add length of the marksample!')
return 1
# 绘所有样本
for i in range(num):
markindex = int(clusterAssment[i, 0]) # 矩阵形式转为int值, 簇序号
# 特征维对应坐标轴x,y;样本图形标记及大小
plt.plot(dataSet[i, 0], dataSet[i, 1], marksamples[markindex], markersize=6)
# 绘中心点
markcentroids = ['o', '*', '^'] # 聚类中心图形标记
label = ['0', '1', '2']
c = ['yellow', 'pink', 'red']
for i in range(k):
plt.plot(centroids[i, 0], centroids[i, 1], markcentroids[i], markersize=15, label=label[i], c=c[i])
#plt.legend(loc='upper left') #图例
plt.xlabel('feature 1')
plt.ylabel('feature 2')
plt.title('k-means cluster result') # 标题
if fnFig != None: plt.savefig(fnFig)
plt.show()
# 画出实际图像
def trgartshow(dataSet, k, labels, fnFig=None):
from matplotlib import pyplot as plt
num, dim = np.shape(dataSet)
label = ['0', '1', '2']
marksamples = ['ob', 'or', 'og', 'ok', '^r', '^b', '<g']
# 通过循环的方式,完成分组散点图的绘制
for i in range(num):
plt.plot(dataSet[i, 0], dataSet[i, 1], marksamples[int(labels[i])], markersize=6)
# 添加轴标签和标题
plt.xlabel('feature 1')
plt.ylabel('feature 2')
plt.title('true result') # 标题
# 显示图形
if fnFig != None: plt.savefig(fnFig)
plt.show()
# label=labels.iat[i,0]
# 绘图显示
datashow(X, k, mycentroids, clusterAssment, "fig-res-k-means_predict.pdf")
trgartshow(X, 3, y, "fig-res-k-means_groundtruth.pdf")
数据的真值如下所示
k均值聚类结果如下所示
本章后三节还讲了使用sklearn进行聚类、评估聚类性能和一个k均值图像压缩的例子,想深入了解这个算法的可以自行看书再实现下,我们暂时只需要大致了解下这个算法的实现,在真正需要用的到的情况下再深入研究!
总结
本章讲述了k均值聚类算法的原理和实现,还通过一个图像压缩的例子展示该算法的实际使用之处,有很大的借鉴意义。通过学习,我们了解该算法是通过k最近邻算法的基础上,增加了循环迭代来获取最优结果的,且体验从监督学习算法切换到无监督学习算法,深刻理解了这两种不同算法的不同之处。
-
发表了主题帖:
一起读《机器学习算法与实现 —— Python编程与应用实例》- 第4章 k最近邻算法
机器学习中有一种最基本的任务,就是分类。指将数据样本映射到一个已事先定义的类别中的学习过程,即生成一个分类函数或分类模型,将每个数据样本分配到某个定义好的类别中。
本章就先介绍一种最基本的分类方法:k最近邻算法。它既能用于分类,又能用于回归。
k最近邻算法的核心思想是:通过度量给定样本到训练数据集中所有样本的特征距离,将与给定样本特征距离最近的k个样本中出现次数最多的类别指定为该样本最优估计的类别。
这句话很绕啊,我个人理解,给定一个k范围内,你和谁身上的特点相似的地方更多,你就属于哪种类型。比如我们都是黑头发、黄皮肤、黑眼睛,我们就更属于亚洲人,而不属于非洲人~
一、K最近邻原理
这里作者也做举了一个很形象的例子:
如图,如果要确定Xu是属于w1,w2还是w3,如果k取5,那么只需要统计,与它最近的5个点的距离。
如图所示,其中Xu有4个点是最靠近红色(w1),那么Xu就确定属于为红色(w1)。
而实际应用中,样本不可能会如此简单,书中做了其他特殊情况的描述,如果碰到了复杂问题可以再从书中进行深入了解。
特征距离计算
在k最近邻算法中,需要比较给定样本到其他样本的特征距离,因此要引入特征空间中的距离度量方式。在机器学习中有几种常用的,曼哈顿距离、欧氏距离等。k最近邻算法使用的通常是欧式距离。
在二维空间中,两个点之间的欧氏距离计算公式为:
在二维空间其实就是计算 (p1,p2)(p1,p2) 和 (q1,q2)(q1,q2) 的距离。拓展到多维空间,则公式变成:
k最近邻算法的本质是,计算待预测样本到所有已知样本的距离,然后对计算得到的距离排序,选出距离最小的k个值,看哪些类别比较多。
二、机器学习的思维模型
学习knn算法的原理和实现时,需要思考机器学习解决问题的思维方式,即在给定问题后,如何思考并解决机器学习问题。从问题到测试,机器学习的思维模型如下所示:
上图是机器学习的经典的流程
问题:我们需要解决的问题是什么?用什么表达待解决问题的关键要素?
核心思想: 通过什么手段解决问题?
数学理论: 如何构建数学模型,使用什么数学方法?
算法: 如何将数学理论、处理流程转化成计算机可以实现的算法?
编程: 如何把算法变成可以计算机执行的程序?
测试: 如何使用训练、测试数据来验证算法?
深入思考:所采用的方法能够取得什么效果,存在什么问题,如何改进?
三、数据生成
采用机器学习解决问题时,编程的第一步是生成并整理训练数据和测试数据,然后可视化这些数据。观察数据在特征空间中的分布,可以大致了解数据的特性。
因此先生成一些训练数据和测试数据,如下所示:
先打开Jupyter ,创建一个KNN的文件
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
# 生成模拟数据
np.random.seed(314)
data_size1 = 100
x1 = np.random.randn(data_size1, 2) + np.array([4,4])
y1 =[0 for _ in range(data_size1)]
data_size2 = 100
x2 = np.random.randn(data_size2, 2) * 2 + np.array([10, 10])
y2 = [1 for _ in range(data_size2)]
# 合并生成全部数据
x = np.concatenate((x1, x2), axis=0)
y = np.concatenate((y1, y2), axis=0)
data_size_all = data_size1 + data_size2
shuffled_index = np.random.permutation(data_size_all)
x = x[shuffled_index]
y = y[shuffled_index]
# 分割训练集和测试集
split_index = int(data_size_all * 0.7)
x_train = x[:split_index]
y_train = y[:split_index]
x_test = x[split_index:]
y_test = y[split_index:]
# 绘制结果
plt.scatter(x_train[:,0], x_train[:,1], c= y_train, marker='.')
plt.title("训练数据")
plt.show()
plt.scatter(x_test[:,0], x_test[:,1], c= y_test, marker='.')
plt.title("测试数据")
plt.show()
以上代码分别从以(4,4)为中心和(10,10)为中心的两个不同高斯分布中抽取100个样本点。来自不同高斯分布的样本点属于不同的类。合并样本后,打乱顺序,取前70%作为训练数据,取后30%作为测试数据,同时可视化数据点的分布,结果如下所示:
训练数据:
测试数据:
四、程序实现
结合算法步骤,k最近邻算法的实现分为三步:
1.计算距离
kNN_distance()函数:计算测试数据与各个训练数据之间的距离。
2.按距离取样本点
kNN_vote()函数:确定k个点中不同类别的出现频率,返回其中出现频率最高的类别作为测试数据的预测类别。
3.投票决定类别。
调用kNN_distance()函数计算距离,对距离排序后,选取距离最小的k个点,在调用kNN_vote()函数得到预测类别。
具体算法实现:
import numpy as np
import operator
# -------程序实现
def kNN_distance(v1, v2):
'''计算两个多维向量的距离'''
return np.sum(np.square(v1 - v2))
def kNN_vote(ys):
'''根据ys的类别, 挑选类别最多的一类作为输出'''
vote_dict = {}
for y in ys:
if y not in vote_dict.keys():
vote_dict[y] = 1
else:
vote_dict[y] += 1
# 找到类别最多的一类,也可以用循环遍历的方式来找,这里使用了max函数来直接返回值最大的键
maxk = max(vote_dict, key=lambda k: vote_dict[k])
return maxk
def kNN_predict(x, train_x, train_y, k=3):
'''
针对指定的数据进行分类,参数:
x - 输入的待分类样本
train_x - 训练数据的样本
train_y - 训练数据的标签
k - 最近邻的样本数
'''
dist_arr = [kNN_distance(x, train_x[j]) for j in range(len(train_x))]
sorted_index = np.argsort(dist_arr)
top_k_index = sorted_index[:k]
ys = train_y[top_k_index]
return kNN_vote(ys)
统计训练数据、测试数据的精度,如下所示:
# 对每个样本进行分类
y_train_est = [kNN_predict(x_train[i], x_train, y_train) for i in range(len(x_train))]
# 统计训练精度
n_correct = 0
for i in range(len(x_train)):
if y_train_est[i] == y_train[i]:
n_correct += 1
accuracy = n_correct / len(x_train) * 100.0
print("Train Accuracy: %f%%" % accuracy)
# 对测试集的样本进行分类
y_test_est = [kNN_predict(x_test[i], x_train, y_train,3) for i in range(len(x_test))]
# 统计训练精度
n_correct = 0
for i in range(len(x_test)):
if y_train_test[i] == y_test[i]:
n_correct += 1
accuracy = n_correct / len(x_test) * 100.0
print("Test Accuracy: %f%%" % accuracy)
print(n_correct,len(x_test))
输出为:
Train Accuracy: 100.000000%
Test Accuracy: 96.666667%
58 60
上述程序,先后对训练数据和测试数据应用kNN算法,并将分类结果与实际标签对比,发现分类准确性分别达到了100%和96.67%,说明kNN算法对数量少的简单数据具有优秀的分类能力。
五、将kNN算法封装为类
当我们想复用自己写的kNN算法,且进一步改进算法,可以将其封装为类。使用类分装程序的最大优点如下:1.统一调用API接口,让调用者更方便地集成各种算法;2.将数据和操作集成在一起,降低阅读和理解代码的难度。
下面是实现这一思路的简要描述,具体实现大家可以看书。
__init__()和fit()函数:分别用于存储初始化kNN类的k值和分类前已有的含标签数据。
_square_distance()、_vote()和predice()函数:与函数实现版本kNN_distance()、kNN_vote()和kNN_predict()的功能相同,区别是前者是基于类的方法,可以调用类存储的训练数据。
score()函数:计算分类结果的准确度。
六、基于sklearn的分类实现
动手编程实现的kNN分类器有些细节还不完美。例如:1.未优化算法,当数据量较大时,算法的效率很低;2.通用性较差。解决实际问题时,可以使用比较成熟的机器学习库,如传统学机器学习领域中著名的scikit-learn(也称sklearn),这个库包括了大部分机器学习方法,涵盖了几乎所有的主流机器学习算法,是基于Python语言的开源机器学习工具包,可通过NumPy,SciPy和Matplotlib等Python数值计算库高效地实现算法应用。sklearn中的k近邻分类器是KNeighborsClassifier。
书中通过一个实例讲解如何对sklearn中包含的手写字体数据集digits进行kNN分类,感兴趣的可以看书自行了解。
总结
本章讲述了k最近邻算法的原理和实现,还介绍了如何使用sklearn来进行kNN的识别实现。通过学习,初步掌握了k最近邻算法的原理和实现,了解了真正的机器学习算法的神奇之处。除此之外,还有很多其他的机器学习算法可以供我们学习。比如下章的k均值聚类算法!
- 2024-08-05
-
回复了主题帖:
【超小型 Linux 开发套件Quantum Tiny Linux】- 扩展外设使用
freebsder 发表于 2024-7-17 11:43
这么小个屏,真是难为了这么强大的处理器
确实屏幕再大点会更好
-
回复了主题帖:
【超小型 Linux 开发套件Quantum Tiny Linux】-开发资源分享与登录系统
hellokitty_bean 发表于 2024-7-12 15:41
因为桌面的窗口管理系统使用了轻量级xfce,调皮小老鼠出现了
原来登录用户不一样,桌面背景也不一样
- 2024-08-04
-
发表了主题帖:
【超小型 Linux 开发套件Quantum Tiny Linux】- 功耗、散热、外壳
这一期比较简单,我们看下它的功耗、散热和外壳。
一、功耗
功耗对于产品的性能和电池寿命有着直接的影响。低功耗设计可以延长设备的运行时间,减少充电次数,对环保也有益处。因此,许多现代电子设备都强调低功耗特性。
功耗是指设备在单位时间内所消耗的能量。这个概念通常用来描述电子设备的能源效率,特别是在便携式设备和节能产品中。
虽然Quark这套开发套件使用的是不带电池的方式,直接用USB口供电。我们也可以观察此时的功耗,用于未来采用电池时的开发套件的参考。
下面是我运行Ubuntu18.04时的功耗:
可以看到,此时5V电压时,电流为250mA左右
直接功率的计算公式为:P = V×I,其中 P 是功率,V 是电压,I 是电流。
将给定的数值代入公式: P=5V×250mA=1.25WP=5V×250mA=1.25W
也就是说,如果我有一块1000毫安时的电池,我可以使用不到20个小时!
如果再多跑一些程序、外设,可能功耗更高,所以未来选择电池时一定要看好该套件的功耗,选择相对应的电池容量。
二、散热
由于采用了 H3 CPU,发热很严重。如果没有散热措施,开机后在很短的时间温度就能飙升到很高,摸起来热的烫手,简单看下室温30度,运行6h的CPU温度:
pi@Quark-N:~$ cat /sys/class/thermal/thermal_zone0/temp
61905
/sys/class/thermal/thermal_zone0/temp这个文件包含了CPU温度的传感器读数,单位是mK(1000mK等于1°C)。
因为条件有限,没有热成像仪,所以无法更直观地观察Quark,只能期待后面的大佬分享了!
三、外壳
关于Quark-n的外壳,coolflyreg163大神分享了一种自己可以3D打印的:https://gitee.com/coolflyreg163/quark-n-3d
我在淘宝上找了一家可以直接购买的:【淘宝】https://m.tb.cn/h.gkZdUkOSPafUbu4?tk=NiiJ3W3FjHX
看起来还不错!
-
发表了主题帖:
【超小型 Linux 开发套件Quantum Tiny Linux】- SDK环境搭建及使用
一、克隆地址分享:
一共有两个地址,一个是稚晖君的原始项目SDK:
https://github.com/peng-zhihui/Project-Quantum?tab=readme-ov-file
另一个是针对这块板子的上层使用,quark-n的地址,:
https://gitee.com/coolflyreg163/quark-n
二、克隆SDK
原始项目SDK
我习惯在windows上,用VM虚拟机出一个Ubuntu编译,所以根据自己情况提前准备好编译环境,具体可以参考我这篇文章:虚拟机+Ubuntu环境搭建
首先新建quark的文件夹,把SDK克隆下来
mkdir quark
cd quark/
git clone https://github.com/peng-zhihui/Project-Quantum.git
git clone https://gitee.com/coolflyreg163/quark-n.git
克隆好后,查看下文件夹
linux@linux-virtual-machine:~/work/quark$ ls
Project-Quantum quark-n
linux@linux-virtual-machine:~/work/quark$ cd Project-Quantum/
linux@linux-virtual-machine:~/work/quark/Project-Quantum$ ls
1.Hardware 2.Bootloader 3.Kernel 4.Images 5.Tools 6.Docs LICENSE README.md
这里的几个项目文件,稚晖君在README.md中都有说明,这里我再介绍下:
项目文件结构说明
Hardware:量子计划包含了一系列邮票孔形式的超迷你积木模块,目前工程文件里已开放的有:
Quark-Core:基于全志H3/H5芯片的ARM-Linux核心板模块,引出的外设有SDIO、USBx4、I2Cx2、SPIx2、UARTx3、HDMI、CAMERA、以太网口、GPIO等。
Atom-Shield:对应于核心板的底板模块,将核心板的几乎所有外设都用上了,自己设计底板的时候可以直接基于Atom进行硬件裁剪。
Gluon-Power:一个指甲盖大小的电源管理模块,在Atom上有用到,支持锂电池的充放电管理,以及一路5V DC-DC升压和一路3.3V降压输出。
Electron-Arduino:一个基于ATmega328的协处理器模块,可以直接烧录Arduino的Bootloader作为Arduino板卡使用,非常迷你。
Bootloader:SOM的u-boot源代码,移植自FriendlyARM的仓库
Kernel: SOM用的主线Linux内核源码,添加了一些自己的驱动,修改了设备树配置,原始仓库是这个
Image: 打包好的系统镜像,可以直接烧录到SD里进行启动。
Docs: 相关芯片的Datasheet文档。
各个模块(硬件、软件、镜像)的详细说明可以进入相关文件夹内查看README.md
quark-n
linux@linux-virtual-machine:~/work/quark/Project-Quantum$ cd ..
linux@linux-virtual-machine:~/work/quark$ cd quark-n/
linux@linux-virtual-machine:~/work/quark/quark-n$ ls
boot images npi-config sun8i-h3-atom_n.dts xrdp
drivers Kernels README.md WorkSpace
gpio_key_led.py LICENSE sun8i-h3-atom_n.dtb WuKong
quark-n的项目文件说明比较少,我这里补充下:
项目文件结构说明
boot:uboot启动脚本
drivers:存放wifi驱动模块
gpio_key_led.py:使用新的dts的中的蓝色led设备
images:时钟图片
Kernels:没什么用
LICENSE:GPLv2条约
sun8i-h3-atom_n.dtb:全志CPU的设备树二进制文件,用于在dts里添加蓝色LED的设备
sun8i-h3-atom_n.dts:全志CPU的设备树文件
WorkSpace:自带LCD屏的数码时钟开发代码
WuKong:wukong-robot 是一个简单、灵活、优雅的中文语音对话机器人/智能音箱项目,目的是让中国的 Maker 和 Haker 们也能快速打造个性化的智能音箱。项目地址:https://gitee.com/yadongzhao87/wukong-robot
xrdp:升级到ubuntu 20.04 LTS后,无法使用远程桌面连接quark的xrdp的解决办法
三、编译SDK
稚晖君的原始项目SDK编译方法可以参考每个目录下的REDEME.md
比如uboot编译的REDEME.md:
Project-Quantum
编译方法可以参考Friendly-ARM的教程:http://wiki.friendlyarm.com/wiki/index.php/Building_U-boot_and_Linux_for_H5/H3/H2%2B/zh
配置好环境之后,编译命令:
```
$ cd u-boot
$ make quark_n_h3_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
$ make ARCH=arm CROSS_COMPILE=arm-linux-
```
四、quark-n使用
直接在板子上把quark-n克隆下来
git clone https://gitee.com/coolflyreg163/quark-n.git
cd quark-n
pi@Quark-N:~/qurak/quark-n$ ls
boot images npi-config sun8i-h3-atom_n.dts xrdp
drivers Kernels README.md WorkSpace
gpio_key_led.py LICENSE sun8i-h3-atom_n.dtb WuKong
参考quark-n的使用技巧:https://gitee.com/coolflyreg163/quark-n/
蓝牙
上一章我们用蓝牙一直链接失败,我换了个普通的蓝牙耳机,且登录系统的用户换成了pi,这样就可以成功连接蓝牙耳机了!
通过使用技巧13可知:
蓝牙连接音箱或耳机 系统默认缺少软件包,安装下列软件包,重启之后删除之前的配对,然后重新配对
sudo apt-get install pulseaudio-module-bluetooth bluez-tools
以下命令用于启动时自动运行
pactl load-module module-bluetooth-discover
再试着播放音频,把root里的test.wav拷贝到pi的目录下
#打开终端登录root用户
su
quark
#cp文件
cp /root/Music/test.wav /home/pi/Music
搞了半天,用Audacity一直播听不到音乐,我就换成调用PulseAudio方式就成功了
首先确保安装PulseAudio服务
pi@Quark-N:/$ dpkg -l | grep pulseaudio
ii pulseaudio 1:8.0-0ubuntu3.15 armhf PulseAudio sound server
ii pulseaudio-module-bluetooth 1:8.0-0ubuntu3.15 armhf Bluetooth module for PulseAudio sound server
ii pulseaudio-module-x11 1:8.0-0ubuntu3.15 armhf X11 module for PulseAudio sound server
ii pulseaudio-utils 1:8.0-0ubuntu3.15 armhf Command line tools for the PulseAudio sound server
ii xfce4-pulseaudio-plugin:armhf 0.2.4-1 armhf Xfce4 panel plugin to control pulseaudio
再列出所有音频输出设备:
pactl list sinks
可以看到我有一共蓝牙音频设备——Kulark E2,下面设置 Kulark E2 为默认音频输出:
pactl set-default-sink bluez_sink.B4_A2_EB_6B_53_71
然后再播放我们的测试音频:
paplay /home/pi/Music/test.wav
这样就可以听见声音了!!!
麦克风
既然声音解决了,Audacity录制音频也没玩明白,还是用命令行方式录制
首先用arecord 看下有没有麦克风
arecord -l
可以看到H3 Audio Codec (硬件编解码器) (card 2):这似乎是物理音频输入设备,具有一个子设备。我们就试下用这个录音
arecord -D plughw:CARD=2,DEV=0 -f cd -t wav -d 10 output.wav
这里的-D选项指定了设备描述符plughw:CARD=2,DEV=0,-f cd
表示以 CD 质量(44.1 kHz, 16 bit, 2 声道)录制,-t wav指定了输出格式为 WAV,-d 10
表示录制持续时间为 10 秒,output.wav是输出文件的名称。
录制成功,就出现一个output.wav的文件,我们试着播放下这个文件
aplay output.wav
用蓝牙耳机听一下声音,果然,就是刚才我们录制的声音!
播放视频
视频最好转换到和屏幕一个分辨率,不然就会卡顿掉帧,用以下命令转换
ffmpeg -i /home/pi/Videos/BadApple.mp4 -strict -2 -s 240x134 /home/pi/Videos/BadApple_240x134.mp4
ffmpeg: 这是主程序名称,调用 FFmpeg 工具。
-i /home/pi/Videos/BadApple.mp4: -i 参数后面跟着的是输入文件的路径。这里指定了要转换的源视频文件的位置。
-strict -2: 这个参数用于指定 FFmpeg 在解码或编码时对不兼容流的处理方式。-strict 后面可以跟从 -2 到 2 的数字,数字越大,对流的兼容性越严格。-2 是一个较低的严格级别,允许更多的不兼容流被处理。
-s 240x134: -s 参数用于设置输出视频的尺寸。这里指定了输出视频的分辨率为 240 像素宽和 134 像素高。
/home/pi/Videos/BadApple_240x134.mp4: 这是输出文件的路径和文件名。转换后的视频将保存在这个位置。
播放视频
sudo mplayer -vo fbdev2:/dev/fb1 -x 240 -y 135 -zoom /home/pi/Videos/BadApple.mp4
sudo: 以超级用户权限运行命令。
mplayer: 播放器程序。
-vo fbdev2: 指定视频输出驱动为 fbdev2。fbdev2 是 fbdev 的一个变种,提供了更多的功能和配置选项。
/dev/fb1: 帧缓冲设备的设备文件。这取决于你的系统配置,可能需要根据你的硬件调整。
-x 240 -y 135: 设置视频的显示宽度和高度。这些值可能需要根据你的显示需求调整。
-zoom: 使视频缩放到适应屏幕。
/home/pi/Videos/BadApple.mp4: 要播放的视频文件的路径。
我随便找了个抖音MP4的视频,转换出来是这样的:
openCV
系统镜像中还内置了OpenCV ,可以通过接入USB 摄像头实现人脸识别功能
您将需要一个USB相机。将USB相机连接到开发板的USB端口A。
用ls /dev/video* 查看自己的摄像头
ls /dev/video* /dev/video0 /dev/video1
我的摄像头是video0,每个人可能都不一样,根据自己的情况确定摄像头,这个不行就换一个,可能还需要在python文件中改成自己调用的摄像头。
进入项目文件夹:
$ cd WorkSpace/OpenCV
切换成root用户,要不然没有权限,运行demo:
$ python FaceDetectOnTft.py
您可以在开发板的LCD屏幕上看到视频!!
使用新的dts的中的蓝色led设备
将 sun8i-h3-atom_n.dtb 替换到 /boot/sun8i-h3-atom_n.dtb
cp ~/quark/quark-n/sun8i-h3-atom_n.dtb /boot/
重启
sudo shutdown -r now
用于测试的Python代码,gpio_key_led.py
from periphery import LED
import time
ledUser = LED("usr_led", True)
while True:
time.sleep(1)
ledUser.write(255)
time.sleep(1)
ledUser.write(0)
ledUser.close()
gpio_key_led.py是按下Key后,亮起蓝色led
在/sys/class/leds下,显示 pwr_led(黄), status_led(白), usr_led(蓝)
ls /sys/class/leds/
或运行以下命令
sudo cat /sys/kernel/debug/gpio
输出结果里有一行
gpio-359 ( |usr_led ) out hi
即表示成功
用于自带LCD屏的数码时钟
需要先执行:使用新的dts的中的蓝色led设备
首先,将Clock放置到指定位置
ln -s /home/pi/quark/quark-n/WorkSpace/Clock ~/WorkSpace/
其次,将启动脚本放置到指定位置
chmod +x /home/pi/quark/quark-n/WorkSpace/Scripts/start_ui_clock.sh
mkdir -p ~/WorkSpace/Scripts/services
ln -s /home/pi/quark/quark-n/WorkSpace/Scripts/services/ui_clock.service ~/WorkSpace/Scripts/services/
ln -s /home/pi/quark/quark-n/WorkSpace/Scripts/start_ui_clock.sh ~/WorkSpace/Scripts/
从这里,下载2个字体文件:“STHeiti Light.ttc”,“PingFang.ttc”,拷贝到~/WorkSpace/Clock/fonts。
https://gitee.com/coolflyreg163/quark-n/releases/Fonts
或运行命令
cd ~/WorkSpace/Clock/fonts
wget https://gitee.com/coolflyreg163/quark-n/attach_files/603438/download/STHeiti%20Light.ttc
wget https://gitee.com/coolflyreg163/quark-n/attach_files/603439/download/PingFang.ttc
运行如下命令进行安装
cd /home/pi/WorkSpace/Clock/
sudo python -m pip install --index http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt
mkdir /home/pi/WorkSpace/Clock/logs
sudo ln -s /home/pi/WorkSpace/Scripts/services/ui_clock.service /lib/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable ui_clock
此时,在重启后会自动启动Clock。下面是手动命令:
#1.启动(手动启动后按Ctrl + C可脱离)
sudo systemctl start ui_clock
#2.停止
sudo systemctl stop ui_clock
#3.产看状态
sudo systemctl status ui_clock
#4.重启系统
sudo shutdown -r now
但是我运行后发现有问题,ruamel.yaml版本不对,所以我更新了下系统,升级到Ubuntu 18.04
从Ubuntu 16.04 升级到Ubuntu 18.04
首先更新系统到最新版本,运行如下命令:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get autoremove
sudo apt dist-upgrade
安装update-manager-core,执行如下命令:
sudo apt-get install update-manager-core
执行系统升级,执行如下命令:
sudo do-release-upgrade
升级时间比较长,我花了好几个小时!
升级过程中遇到的问题
提示 “Your python3 install is corrupted. Please fix the ‘/usr/bin/python3’ symlink.”,执行如下命令:
sudo ln -sf /usr/bin/python2.7 /usr/bin/python
sudo ln -sf /usr/bin/python3.5 /usr/bin/python3
提示“The upgrade has aborted. The upgrade needs a total of 1,606 M free space on disk '/'. Please free at least an additional 388 M of disk space on '/'. Empty your trash and remove temporary packages of former installations using 'sudo apt-get clean'. ”,执行如下命令:
#删除临时文件
sudo rm -rf /tmp/*
#清理ATP缓存
sudo apt-get clean
执行清理操作后,可以再次尝试升级
如果还有问题仍然阻止升级,那么我们需要查看升级日志,来确定具体为什么原因无法升级
cat /var/log/dist-upgrade/main.log
升级到ubuntu 18.04 LTS后,按照如下步骤,安装ui_clock的依赖包
注意:升级后,python3的版本变为3.6.9,之前系统的3.5.2的包已经无法使用
首先安装python3的pip模块
sudo apt-get install python3-pip
安装python3的包 注意:安装pygame的时候,时间比较长,耐心等待
sudo python3 -m pip install fire
sudo python3 -m pip install ruamel.yaml
sudo python3 -m pip install pygame==1.9.6
sudo python3 -m pip install python-periphery
sudo python3 -m pip install PyYAML
sudo python3 -m pip install Markdown
sudo python3 -m pip install tornado
sudo python3 -m pip install smbus
sudo python3 -m pip install Pillow
sudo python3 -m pip install numpy
注意:如果使用上述命令安装失败,出现“Could not find a version that satisfies the requirement”,可以采用以下方法,解决方法原链接:http://t.csdnimg.cn/UQR0i
方法一:pip install 安装包名字 -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com //豆瓣镜像网站
(如果还不行记得加sudo)
sudo pip install fire -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
sudo pip install ruamel.yaml -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
sudo pip install pygame==1.9.6 -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
sudo pip install python-periphery -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
sudo pip install PyYAML -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
sudo pip install Markdown -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
sudo pip install tornado -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
sudo pip install smbus -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
sudo pip install Pillow -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
sudo pip install numpy -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
注意:如果使用pip安装numpy失败,可以使用如下命令安装numpy
sudo apt-get install python3-numpy
使用LCD屏显示数码时钟
搞了好久终于到最后一步了,用下面这个命令可以手动打开数码时钟
sudo python3 /home/pi/WorkSpace/Clock/main.py
不知道为什么系统自动启动就不行,后面看有没有大神懂这部分的了
[FAILED] Failed to start ui_clock.service.
See 'systemctl status ui_clock.service' for details.
pi@Quark-N:~$ sudo systemctl start ui_clock
Job for ui_clock.service failed because the control process exited with error code.
See "systemctl status ui_clock.service" and "journalctl -xe" for details.
该表盘还可以结合WuKong-robot使用,这部分可以直接看quark-n的使用技巧,这里就不再赘述。
- 2024-08-01
-
发表了主题帖:
一起读《机器学习算法与实现 —— Python编程与应用实例》- 第3章 Python常用库
本帖最后由 硬核王同学 于 2024-8-1 12:03 编辑
使用Python进行机器学习编程时,数值计算必不可少,如果只依靠Python内置的列表等数据结构,那么计算效率很低。要同时获得高开发效率和高执行效率,就需要使用第三方库来实现这个看似矛盾的需求。核心思想是底层的计算使用C/C++/Fortran等语言实现,高层的调用等则使用Python来实现,这样即可保证开发的便携性,又可保证较高的执行效率。本章主要介绍Numpy和Matplotlib库。
一、Numpy数值计算库
Numpy主要用于Python的数值计算,为Python提供高性能向量、矩阵和高维数组的计算。Numpy是用C和Fortran语言实现的,因此计算向量化数据时的性能非常好。Numpy是Python中用于科学计算的非常基础的库,可以进行线性代数与高维函数计算、傅里叶变换,以及产生伪随机数等。
加载Numpy库
首先下载numpy 库
conda install numpy
或
pip install numpy
要使用Numpy模块,可按以下所示的方法加载它。
from numpy import * # 不建议用这种方式导入库
import numpy as np # 建议使用这种方式
建议使用上面的第二种导入方法:不仅方便跟踪代码,而且能够避免名称空间污染。
在Numpy模块中,用于向量、矩阵和高维数据集的数据结构是数组,下面介绍对数组的各种操作。
创建Numpy数组
初始化新Numpy数组的方法有多种,如下所示。
由列表创建数组。
使用函数生成数组,例如arange,linspace等。
从文件中读取数据形成数组。
1.由列表创建数组
创建数组
可以使用np.array()函数由Python列表创建新的向量或矩阵。如以下代码所示:
import numpy as np
a = [1, 2, 3, 4]
print(a)
# a vector: the argument to the array function is a Python list
v = np.array(a)
print(v)
输出为:
[1, 2, 3, 4]
[1 2 3 4]
生成二维数组
# 矩阵:数组函数的参数是一个嵌套的Python列表
a = [[1, 2], [3, 4], [5, 6]]
M = np.array(a)
print(M.shape)
Numpy数组的类型和尺寸
v和M两个都是属于numpy模块提供的ndarray类型。
print(type(v), type(M))
输出为:
v和M之间的区别仅在于他们的形状。我们可以用属性函数ndarray.shape得到数组形状的信息。
Numpy数组中的元素个数
通过属性函数ndarray.size我们可以得到数组中元素的个数
M.size
输出为:
6
Numpy数组的形状和元素个数
使用函数np.shape()和np.size()也可得到数组的形状和元素个数
print(np.shape(M)) print(np.size(M))
输出为:
(3,2)
6
到目前为止numpy.ndarray看起来非常像Python列表(或嵌套列表)。为什么不简单地使用Python列表来进行计算,而不是创建一个新的数组类型?
下面有几个原因:
Python列表非常普遍。它们可以包含任何类型的对象。它们是动态类型的。它们不支持矩阵和点乘等数学函数。由于动态类型的关系,为Python列表实现这类函数的效率不是很高。
Numpy数组是静态类型的和同构的。元素的类型是在创建数组时确定的。
Numpy数组是内存高效的。
由于是静态类型,数学函数的快速实现,比如“numpy”数组的乘法和加法可以用编译语言实现(使用C和Fortran).
Numpy数组的数据类型
利用ndarray的属性函数dtype(数据类型),可以得出数组的数据类型
M.dtype
输出为:
dtype('int64')
Numpy数组的错误类型复制
M[0,0,0] = "Hello"
输出为:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[7], line 1
----> 1 M[0,0] = "Hello"
ValueError: invalid literal for int() with base 10: 'Hello'
Numpy数组的指定类型赋值
要设定数组的数据类型,可用dtype关键字显式地定义创建的数组数据类型
M = np.array([[1, 2], [3, 4]], dtype=complex)
print(M)
输出为:
[[1.+0.j 2.+0.j]
[3.+0.j 4.+0.j]]
dtype常用的数据类型包括int、float、complex、bool、object等,也可显式地定义数据类型的位数,如int64、int16、float128、compl128等。
2.使用函数生成数组
对于较大的数组,使用显式的Python列表人为地初始化数据效率比较低。生成有规律的数组,可以使用下面的函数:
arange()函数
arange()函数的作用是创建等差数组,和Python内置的range函数不同,arange函数还支持浮点数输入。
linspace() 函数和 logspace()函数
linspace()函数用于创建一个等差数列的一维数组,所创建数组元素的数据格式是浮点型的,一般有三个参数:起始值、终止值(默认包含这个数值)、数的个数。
logspace()函数用于创建等比数列,参数也包含起始值、终止值和数的个数,这里的起始值和终止值是10的幂(默认基数是10)。如果要修改基数,可以通过添加参数base来实现。
mgrid()函数
mgrid()函数用于返回多维数组,它的三个参数分别是起点、终点和步长。函数左边的返回值按列展开,右边的返回值按行展开。步长是一个隐藏参数,默认为实数1,当步长为实数时,表示按间隔划分,例如0.1表示从起点按0.1递增(左闭右开递增)。
random()函数
random()函数用于生成随机数组,也可以生成正态分布的随机数。
zeros()函数和ones()函数
zeros()函数用于生成一个全为0的多维数组,ones()函数用于生成一个全为1的多维数组。
访问数组元素
1.索引
下标索引
可以用方括号和下标索引访问特定的元素,如下所示
M = np.arry([1,2],[3,4],[5,6])
print(M[1,1])
printf(M[1][1])
#如果省略其他索引,则返回整行,或者返回一个N-1维的数组
print(M[1])
#除了使用索引,还可以使用:来实现相同的效果
print(M[1,:]) #行1
输出为
3
3
[3 4]
[3 4]
下标访问
采用索引可给数组中的元素赋新值,如下所示
M[0,0] = 10
M[1,:] = 0
print(M)
输出为
[[10 2]
[0 0]
[5 6]]
2.切片索引
切片索引是语法[lower:upper:step]的技术名称,用于访问数组中的部分元素,如[1:3]表示从下标为1的元素取到下标3的前一个元素。步长参数决定切片的间隔。
A = np.array([1,2,3,4,5])
print(A[1:3])
输出为
array([2,3])
切片索引是可变的,若为它们分配了新值,则从中提取切片的原始数组将被修改。
在实际使用中,可以省略[lower:upper:step]中任意的零个、一个、两个甚至三个值,而使用默认值。
索引切片工作方式对多维数组的操作与对一维数组的操作类似。
3.花式索引
花式索引利用整数数组作为下标进行索引。与切片索引不同,它将获得的数据复制到新数组中,改变新数组中的值,原数组不变。
还可使用索引掩码进行索引。掩码是布尔数据类型的Numpy数组,一个元素是被选择(True)还是不被选择(False)取决于索引掩码在每个元素位置的布尔值。
这个特性在需要有条件地从数组中选择元素时非常有用。例如,使用比较运算符可以方便地选择特定的元素。
使用where()函数可将索引掩码转换为位置索引。注意,where()函数的输入不同时,返回的输出也不同:若输入是一个一维数组,则返回一个索引数组;若输入是一个二维数组,则返回两个索引数组,这两个索引数组表示所有满足条件的元素的位置。
4.遍历数组元素
通常情况下,应尽可能避免遍历数组元素等操作,因为在Python这样的解释语言中,迭代操作要比向量化操作慢很多。然而,有时程序会不可避免地进行一些迭代操作。对于这种情况,Python的for循环是最方便的遍历数组的方法。
当需要遍历一个数组的每个元素并修改数组的元素时,使用enumerate()函数可以方便地在for循环中获得元素及其索引。
文件读写
在实际开发中,经常需要从文件中读取数据进行处理。Numpy中提供一系列读写文件的方法,下面依次介绍下。
1.逗号分隔值(CSV)文件
逗号分隔值文件是一种常见的数据文件格式,要从这些文件中将数据读入Numpy数组,可以使用genfromtxt()函数。genfromtxt()函数用于创建数组表格数据,它先将文件的每行转换成字符串序列,后将每个字符串序列转换成相应的数据类型。
使用NumPy加载CSV文件的方式
import numpy as np
data = np.genfromtxt('stockholm_td_adj.dat')
print(data.shape)
输出为
(77431,7)
使用np.savetxt()函数可以按照CSV格式来保存NumPy数组。np.savetxt()函数将数据保存至本地,它有两个参数:一个是保存的文件名,另一个是需要保存的数组名;另外,还可以通过添加格式参数来确定想要保存的数据的格式。
2.Numpy数据文件
如果不需要和用其他编程语言编写的程序交互数据,就可将数据保存为NumPy数据文件,np.save()函数用于将文件保存至本地,np.load()用于加载NumPy数组文件。
线性代数函数
向量化计算是使用Python/NumPy编写高效计算程序的关键,这意味着要尽可多地使用矩阵和向量运算来表示计算程序,如矩阵——矩阵乘法。本届介绍NumPy支持的线性代数运算。
1.标量数组的四则运算
常用的算术运算符可用来对标量数组进行四则运算
v1 = np.arange(0,5)
print(v1 * 2)
print(v1 + 2)
输出为
[0,2,4,6,8]
[2,3,4,5,6]
2.数组间的元素运算
对数组进行四则运算时,默认是逐元素运算的。
3.矩阵代数
矩阵的乘法可以使用dot()函数,他的两个参数可以计算矩阵-矩阵、矩阵-向量和向量-向量相乘。使用dot()函数对两个一维数组进行计算时,结果为两个数组的内积;对两个二维数组进行时,结果为两个二维数组所对应的矩阵乘积。
另外,可将数组对象转换成矩阵,这将改变标准算数运算符+、-、*的操作而变成矩阵代数。矩阵是NumPy函数库中不同于数组的数据类型,它可直接对矩阵数据进行计算,还提供基本的统计功能,如转置、求逆等。矩阵是数组的分支,很多时候是通用的,不同的是,矩阵可以使用简单的运算符号,而数组更灵活。
4.矩阵求逆
调用np.linalg.inv()函数可以求矩阵的逆。
数据统计
将数据集存储在NumPy数组中通常是非常有用的。
1.统一函数的用法
NumPy函数库提供了许多用于对数组中的数据集进行统计的函数,常用的函数主要包括如下几种:
mean():计算平均值
std():计算标准差
var():计算方差
max():取最大值
min():取最小值
sum():计算各个元素之和
prod():计算所有元素的乘积
trace():计算对角线元素的和
2.数组子集的统计
为了计算部分数据的统计值,可以使用索引、花式索引或者从其他数组中提取所关心的数据,并计算统计值。
3.高维数组的维度
对高维数组应用min()、max()等函数时,是对整个数组进行计算的。但在很多情况下,需要计算某个维度的数据统计值,而使用axis参数可以根据行或列来决定函数的具体表现。
许多适用于数组和矩阵的函数与方法可以接受相同的关键字参数axis。
数组的操作
1.数组变形、大小调整和堆叠
NumPy数组的形状确定后就不需要复制底层数据,这就使得即使是对大型数组,计算机也能进行较快的操作。
2.添加、删除维度
对矩阵进行乘法运算时,两个矩阵对应的维度保持一致才能正确执行。如果两个矩阵的维度不一致,那么可以使用newaxis()函数来增加一个新维度,例如将一个向量转换为列矩阵或行矩阵。
某些情况下,需要删除长度为1的维度,这时可以使用np.squeeze()函数。
3.叠加和重复数组
利用函数repeat()、vstack()、hstack()和concatenate(),可以用较小的向量和矩阵来创建更大的向量和矩阵。repeat()函数用于重复数组中的元素,tile()函数用于横向和纵向地复制元矩阵。
4.数组的复制和“深度复制”
为了获得高性能,NumPy中的赋值通常不复制底层数据。例如,在函数之间传递对象时,复制数组通常可以避免产生大量不必要的内存复制。
5.类型转换
NumPy数组是静态类型的,而数组的类型一旦创建就不会改变。然而,使用astype()函数[参见类似的asarray()函数]可以显式地将一个数组的类型转换为其他类型,进而创建一个新类型的数组。
二、Matplotlib绘图库
Matplotlib是Python的绘图库,它与Numpy一起使用,提供了有效的MATLAB开源替代方案。它也可与图形工具包一起使用,如PyQt和wxPython,以让自己开发的程序支持图形绘制。Matplotlib库可通过pip或Conda直接安装,十分方便。
Pyplot
matplotlib.pyplot是一组命令风格的函数,它们使matplotlib的工作方式类似于MATLAB。每个pyplot函数都对图形进行一些更改:例如,创建图形,在图形中创建绘图区域,在绘图区域中绘制一些线,用标签装饰绘图,等等。
1.基本绘图实例:
import numpy as np
import matplotlib.pyplot as plt
#设置x轴的数据和y轴的数据,'x-b'配置绘制的类型和颜色
plt.plot([1,2,3,4],[1,2,3,4], 'x-b')
plt.ylabel('some numbers')
plt.xlabel('variable')
plt.show()
所绘的一条直线如下图所示,折线图中的x和y由plt.plot()函数的前两个参数给出,类型由第三个参数给出。对每对x,y参数,都有一个可选的第三个参数,它是表示图形颜色和线条类型的格式字符串。
2.Pyplot支持的绘图样式
多子图绘制
类似于MATLAB,Pyplot也有当前图的概念,所有的绘图命令都适用于当前图。例如plt.subplot(nrows,ncols,index)将绘图区域分成nrows行和ncols列,并在第index个子图下绘制。下面代码演示了如何绘制两个子图。
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
plt.figure(1)
plt.subplot(2,1,1)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
plt.subplot(2,1,2)
plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
plt.show()
图像处理
在后面的学习中我们会使用pyplot.imshow()函数显示图像。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
# 加载图片
img=mpimg.imread('example.png')
imgplot = plt.imshow(img)
pyplot.imshow()函数函数有一个参数cmap,它提供多种类型的颜色映射。使用时指定cmap参数,可为图像添加一些效果。如以下图像,应用伪彩色方案进行图像绘图。
lum_img = img[:,:,0]
plt.imshow(lum_img)
# 运用你'hot'彩色地图
plt.imshow(lum_img, cmap="hot")
plt.colorbar()
总结
本章讲述了Python库的一些基础用法,通过学习,初步掌握了Numpy、Matplotlib库,除此之外,还有很多第三方库可以供我们学习。我们暂时对Python的库学习到这步,下章我们一起学习机器学习的一种基本分类方法——k最近邻算法!
- 2024-07-25
-
发表了主题帖:
一起读《机器学习算法与实现 —— Python编程与应用实例》- 第2章 Python语言
学编程的应该都学过Python吧,可谓是最实用的语言了。但是为什么机器学习选择了Python语言,而不去选择其他语言呢?还有Python语言我们都应该掌握哪些基础呢?想知道这些问题,那我们这章,就跟随布树辉老师一起来学习下Python!
配套学习资源:
在线视频:https://www.bilibili.com/video/BV1oZ4y1N7ei/?p=9
讲义:https://gitee.com/pi-lab/machinelearning_notebook
一、为什么选择Python
Python的设计哲学是优雅、明确、简单,且与其他编程语言相比,初学者更容易上手。
Python是一种解释型的、高级的、通用的、面向对象的动态语言,主要特点包括:简单易用,学习成本低;拥有大量的标准库和第三方库;开源且免费试用。
Python拥有良好的生态、较低的学习门口、方便的开发体验,已成为大众最喜欢的语言之一。
二、安装Python环境
由于Python的库较多,且依赖关系比较复杂,Python一般通过包管理系统来管理计算机中安装的Python软件包。目前,主要的包管理系统有pip和Anaconda。为了让初学者快速地使用Python,本书主要以Python为例介绍如何安装。
注意:本书的安装说明中有较多的细节,可能与读者的系统不适配,因此可能会遇到问题,遇到问题时,请通过搜索引擎查找解决办法,以提高自己解决问题的能力。
Windows安装
这里我只例举Windows下的安装:
由于网络下载速度较慢,因此推荐使用镜像来提高下载的速度。镜像的使用方法可以参考:Anaconda镜像的说明文档
在下列镜像网站找到适合自己的安装文件,然后下载
https://mirrors.bfsu.edu.cn/anaconda/archive/
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
https://mirrors.aliyun.com/anaconda/archive/
https://mirrors.hit.edu.cn/anaconda/archive/
例如: https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2020.11-Windows-x86_64.exe
按照说明,把Anaconda安装好。
登录anaconda的官网下载,anaconda是一个集成的工具软件不需要我们再次下载。
anaconda官网
输入你的邮箱注册
点击立即下载,选择windows版本
直接双击安装,下一步就好了。
windows搜索框里找一下anaconda prompt
打开,出现(base),安装成功。
设置软件源
各系统都可以通过修改用户目录下的.condarc文件。
Windows 用户无法直接创建名为.condarc的文件,可先执行conda config --set show_channel_urls yes生成该文件之后再修改。然后在命令行输入notepad .condarc将下面的内容拷贝到文本编辑器里面。
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/main
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/r
- https://mirrors.bfsu.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.bfsu.edu.cn/anaconda/cloud msys2:https://mirrors.bfsu.edu.cn/anaconda/cloud
bioconda: https://mirrors.bfsu.edu.cn/anaconda/cloud
menpo: https://mirrors.bfsu.edu.cn/anaconda/cloud
pytorch: https://mirrors.bfsu.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.bfsu.edu.cn/anaconda/cloud
simpleitk: https://mirrors.bfsu.edu.cn/anaconda/cloud
设置pip源
pip config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple/
新建conda环境
conda create -n machinelearning python=3.9
安装常用Python库
conda install jupyter scipy numpy sympy matplotlib pandas scikit-learn
安装PyTorch
GPU 版本
# 访问 https://pytorch.org/,查最新的安装命令
# 例如 pytorch-cuda=11.6
# 安装cudatoolkitconda
install cudatoolkit
# 安装最新版本
conda install pytorch torchvision torchaudio pytorch-cuda -c pytorch -c nvidia
# 安装特定版本
#conda install pytorch torchvision torchaudio pytorch-cuda=11.6 -c pytorch -c nvidia
CPU 版本
conda install pytorch -c pytorch
pip3 install torchvision
检测GPU是否在PyTorch中可用:
python
>>> import torch
>>> torch.cuda.is_available()
Conda使用技巧
Conda创建自己的环境
conda create -n <your_env> python=x.x
# exampleconda create -n machinelearning python=3.9
上面的python=x.x中的x.x对应自己系统中的Python版本
Conda怎么激活自己的环境
conda activate <your_env>
# example conda activate machinelearning
Conda常用命令
# 帮助命令
conda -h
conda help
# 配置频道(已有)
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/pkgs/main/
# 退出当前环境
conda deactivate
# 克隆环境
conda create -n BBB --clone AAA
# 查看基本信息
conda infoconda info -h
# 查看当前存在环境
conda env listconda info --envs
# 删除环境
conda remove -n <your_env> --all
三、Jupyter Notebook
本在线讲义使用Jupyter Notebook编写,因此首先介绍Jupter Notebook的使用方法。使用Notebook,可以方便的将理论描述、程序、数据可视化等集成在一个多媒体页面,方便大家的学习。
Jupyter notebook 是一种 Web 应用,它能让用户将说明文本、数学方程、代码和可视化内容全部组合到一个易于共享的文档中,非常方便研究和教学,让编写、阅读变得一目了然。Jupyter notebook特别适合做科学计算、数据处理,其用途可以包括数据清理和探索、可视化、机器学习和大数据分析。
Jupyter 安装
安装Jupyter最简单的方法就是使用 Anaconda,其发行版附带了 Jupyter Notebook。在 conda 环境下安装 Jupyter Notebook 可以使用
conda install jupyter
当然,也可以通过pip来安装
pip install jupyter
安装后便可在终端中输入以下命令启动:
# jupyter notebook
或者
# jupyter-notebook
常用操作
点击右上角的新建一个文件
输入以下代码
print("Hello Machine Learning!")
ctrl+Enter运行后可看到打印如下
ctrl+s保存
四、Python基础
可能很多人都已经学习过Python,我们这里就做一个复习,如果有不会的部分,可以在网上搜索自学!
这里把布树辉老师的学习讲义放到这里,方便初学者学习:https://gitee.com/pi-lab/machinelearning_notebook/blob/master/0_python/1_Basics.ipynb
导入库与Python之禅
#导入库
import os
os.listdir('.')
变量
用于表示某个对象或值的名称成为变量。
运算符
1.算术运算符
算术运算符即数学运算符,用来对数字进行数学运算,如加、减、乘、除。
2.关系运算符
关系运算符也称比较运算符,用于对常量、变量或表达式的结果进行大小比较。
内置函数
1.range()函数
range()函数输出指定范围内的整数。他还可通过指定特定范围内的两个数字之差来生成一个序列,元素以迭代容器的形式返回。
2.int()函数
int()函数将字符串或浮点数转换为整数。他有两个参数输入,一个是不同数字系统中的值,另一个是它的基数。
类似的函数还有用于转换为二进制数的bin()、用于转换为浮点数的float()、返回值是当前整数对应的ASCII字符的chr()、用于获得字符的ASCII值的ord().
3.round()函数
round()函数将输入值四舍五入为指定的位数和最接近的整数。
4.type()函数与isinstance()函数
由于Python是脚本语言,变量的类型不需要事先定义,所以有时候需要判断变量的类型,这就要用到类型判断函数type(),该函数返回给定变量的类型。另外一个判断类型的函数是isinstance()函数,它判断给定的变量是否是给定的类型,若是,则返回True;这个函数还可同时检查多个类型。
五、print()函数
print()函数是Python的内置函数,照顾要用于打印变量的值。
在Python中,单引号(‘)、双引号(“”)和三引号(“”“)用于表示字符串。
大部分情况下单引号用于声明一个字符。
声明一行时使用双引号,声明段落/多行时使用三引号。
%s用于引用包含字符串的变量。
六、数据结构
数据结构是计算机存储、组织数据的方式,简单来说是指相互之间存在一种或多种特定关系的数据元素的集合。
Python中的数据结构设计的非常巧妙,使用起来非常方便,几乎绝大多数的数据结构都可以通过list,tuple,dict,string,set等表示,因此用户几乎不需要自己定义数据结构,仅仅使用Python内置的数据结构即可实现非常复杂的算法和操作。
列表
列表是最常用的数据结构,可以把它看作用方括号括起来的数据序列,数据之间用逗号分隔。这些数据都可以通过调用其索引值来访问。
1.1 索引
1.2 切片
1.3 列表的内置函数
1.4 复制一个列表
元组
元组与列表相似,但唯一大的区别是列表中的元素可以更改,而元组中的元素不能更改。
2.1 将一个元组映射到另一个元组
2.2 元组内置函数
集合
集合主要用于消除序列/列表中的重复数字。它还用于执行一些标准的集合操作。
3.1 内置函数
字符串
字符串是基于文本的有序数据,用单/双/三重引号括起来表示。
4.1 内置函数
词典
词典更像数据库,因为在这里你可以用用户定义的字符串索引特定的序列。
5.1 内置函数
七、控制流语句
一般情况下,程序按照语句编写顺序依次执行,形成标准的面向过程的结构化形式。然而,由于程序具有很强的逻辑性,有时需要根据某些条件选择性地执行某些语句或者跳过某些语句。控制流语句用于控制程序流程的选择、循环、转向、和返回等,以实现程序的各种结构。Python的流程控制语句和其他语言类似,如C语言。
判断语句
1.1 If
1.2 If-else
1.3 if-elif
循环语句
2.1 for
2.2while
2.3break
2.4continue
列表推导(List Comprehensions)
Python可以使用列表推导模式,用一行代码就可以很容易地生成所需的列表。
八、函数
在大部分时候,在一个算法中,需要重复执行一组语句,如果每次都重复写出来,不仅乏味而且编程效率比较低,降低程序的可读性。为了将重复的执行抽象出来,可使用函数将一组操作封装成一个整体,给一个名称和参数列表作为可变量的输入。
函数的参数
定义一个函数first_func()
def first_func():
print("Hey Jack!")
print("Jack, How do you do?")
first_func()
funca=first_func
funca()
Hey Jack!
Jack, How do you do?
Hey Jack!
Jack, How do you do?
first_func() 每一次只打印一个人的消息。我们可以让函数 first_func() 接受参数,该参数将存储名称然后打印相应地接受字符串。为了这样做,需要像所示的那样在函数内添加一个参数。
返回语句
当函数产生某个值,并且该值必须存储在一个变量中,或者需要返回或返回给主算法进行进一步操作时,使用return语句。
默认参数
当一个函数的参数在大多数情况下是常见的或者它是隐式的时,使用这个概念。
任意数量的参数
如果函数要接受的参数数量未知,则在参数前使用星号。
全局变量和局部变量
在函数内部声明的变量是局部变量,生命周期限于函数执行期间;在函数外部声明的是全局变量。
lambda函数
程序中有时需要临时使用一个简单的函数,单独定义出来比较费事,为了提高编程效率,Python等很多语言引入了Lambda函数,这些Lambda函数没有使用任何名称定义,只携带一个表达式,返回的是函数本身(类似函数指针或者函数对象)。Lambda函数在操作列表时非常方便。这些函数由关键字lambda定义,后面跟着变量、冒号和相应的表达式。
九、类和对象
Python中的变量、列表、字典等在底层都是对象,对象是类的实列,而类是用来描述具有相同属性和方法的对象集,它定义集合中每个对象共有的属性和方法。
本节常见的定义和概念定义:
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例
对象(Object):通过类定义的数据结构实例(Instance),对象包括两类成员(类变量和实例变量)和方法。例如我们定义了一个Person类,而具体的人,比如小明,小黄就是Person类的实例
属性: 描述该类具有的特征,比如人类具备的属性,身份证,姓名,性别,身高,体重等等都是属性
方法: 该类对象的行为,例如这个男孩会打篮球,那个女孩会唱歌等等都是属于方法,常常通过方法改变一些类中的属性值
类
成员函数与变量
类是现实事物的抽象表达,往往存在一些对内和对外的操作,即实现一些功能。这些功能一般代表类中的函数和变量,而类内的函数成为该类的”方法“,类中的变量成为属性。
继承
继承是面向对象编程的一种重要方式,通过继承,子类可以扩展父类的功能。父类是继承的类,也称基类;子类是从另一个类继承的类,也称派生类。
总结
本章讲述了Python的一些基础用法,通过学习,也应该初步掌握了Python,但这还远远不够,还需要大量的练习和调试,系统的地学习Python编程。我们暂时对Python的基础用法学习到这步,下面我们再一起学习一下Python的库!
- 2024-07-14
-
发表了主题帖:
【超小型 Linux 开发套件Quantum Tiny Linux】- 扩展外设使用
我们还是先跟着官方wiki学着试一下外设的使用:https://wiki.seeedstudio.com/cn/Quantum-Mini-Linux-Development-Kit/#%E4%BA%A7%E5%93%81%E7%89%B9%E6%80%A7
使用EMMC启动
需要使用EMMC启动夸克的镜像,首先需要将镜像拷贝到TF卡上。
通过SSH或远程桌面连接进入夸克的终端,输入如下命令:
sudo dd if=/dev/mmcblk0 of=/dev/mmcblk1 bs=512 count="EMMC的Block数+1" & sudo watch -n 5 pkill -USR1 ^dd$
其中EMMC的Block数可以使用fdisk -l查看。
sudo fdisk -l
查看mmcblk1的sectors数为30777344
pi@Quark-N:~$ sudo fdisk -l
Disk /dev/mmcblk0: 29.8 GiB, 31927042048 bytes, 62357504 sectors Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x41efd092
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 49152 131071 81920 40M 83
Linux /dev/mmcblk0p2 131072 2588671 2457600 1.2G 83
Linux /dev/mmcblk0p3 2588672 19455999 16867328 8G 83
Linux Disk /dev/mmcblk1: 14.7 GiB, 15758000128 bytes, 30777344
sectors Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mmcblk1boot1: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mmcblk1boot0: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
sudo dd if=/dev/mmcblk0 of=/dev/mmcblk1 bs=512 count="30777345" & sudo watch -n 5 pkill -USR1 ^dd$
定制命令行欢迎信息
欢迎信息主要是这个目录下的脚本来打印的:
/etc/update-motd.d/
比如要修改 FriendlyELEC 的大字LOGO,可以修改/etc/update-motd.d/10-header 这个文件,比如要将LOGO改为Seeed,可将以下行:
TERM=linux toilet -f standard -F metal $BOARD_VENDOR
改为:
TERM=linux toilet -f standard -F metal Seeed
我改了串口上显示没啥效果
更换软件包源和pip源
wget http://112.124.9.243/aptsouce.sh
chmod 755 aptsouce.sh
sudo -H ./aptsouce.sh
sudo apt-get update
wget后要加这个地址http://112.124.9.243/aptsouce.sh,否则下载不了aptsouce.sh
蓝牙
系统镜像中具有内置的蓝牙驱动程序,您可以按照以下步骤启动蓝牙:
$ bluetoothctl
进入 bluetoothctl 界面后。运行scan扫描列出附近所有的蓝牙设备:
$ scan on
复制设备的MAC地址,然后使用以下命令连接到设备:
$ pair A4:xx:xx:xx:xx:30 $ trust A4:xx:xx:xx:xx:30 $ connect A4:xx:xx:xx:xx:30
现在您的开发板已连接到蓝牙设备。输入quit回终端。在开发板上播放音乐,然后您将在蓝牙扬声器设备上听到音乐!
您也可以在远程桌面中通过状态栏的蓝牙图标进行图形化的连接配对。
我测试可以连接,但不能播放音乐,可能驱动有问题
麦克风
Atom-N(载板)上还有一个内置麦克风,使其具备机器学习功能!我们提供了简单的测试示例,可以轻松使用随镜像预先安装的 Audacity 软件。
使用远程桌面登录开发板。
打开Audacity软件。
开始录制并与麦克风交谈,您会看到声波!
注意
你可以使用 arecord -l命令来寻找麦克风.
如果想基于麦克风进行进一步开发,可以在 WorkSpace/WuKong 中找到并使用 WuKong Robot 和 snowboy.
Audacity 没玩明白。
LCD屏幕
LCD屏幕使用SPI与CPU进行通信,并且其驱动程序内置于系统镜像中,因此在启动系统时应该能够看到系统消息日志:
如果将USB键盘和鼠标连接到开发板,则这将成为最小体积的电脑!
有一个使用python编写的pygame示例,演示了LCD使用。
进入文件:
$ cd WorkSpace/PyGame
运行示例:
$ sudo python hello_world.py
您也可以在LCD屏幕下输入s-tui命令,可以将屏幕用于显示系统的监控信息。
这个可以跑,点击绿色点退出。
OpenCV
系统镜像中还内置了OpenCV ,可以通过接入USB 摄像头实现人脸识别功能
您将需要一个USB相机。将USB相机连接到开发板的USB端口A。
进入项目文件夹:
$ cd WorkSpace/OpenCV
运行demo:
$ python FaceDetectOnTft.py
您可以在开发板的LCD屏幕上看到视频!!
测试过也不行!卡掉了。
GPIO
对于GPIO访问,因为是基于Linux所以十分方便,并且可以使用Python轻松控制。
鉴于上面很多外设都不能使用,所以我们直接转到quark-n实现外设的操控,GPIO是可以正常使用的,下一篇文章分享下如何操作
进入到项目文件夹:
$ cd WorkSpace/GPIO
运行GPIO示例:
$ sudo python gpio_key_led.py
改成按键按下灭蓝灯:
整体来说,官方给的wiki问题点还不少,实际玩耍还要看quark-n,下一篇文章就给大家分享下如何正确玩这块板子。
- 2024-07-12
-
发表了主题帖:
【超小型 Linux 开发套件Quantum Tiny Linux】-开发资源分享与登录系统
一、开发板介绍
别看这块板子这么小,实际可玩性非常高!下面给大家介绍下这块板子:
硬件总览
规格参数
td {white-space:nowrap;border:1px solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
规格参数
详情
Quark-N SoM
CPU
Allwinner H3, 四核Cortex-A7 @ 1GHz
GPU
ARM Mali400 MP2 GPU
内存
512MB LPDDR3 RAM
存储
16GB eMMC
接口
以太网, SPI, I2C, UART, 可复用的GPIO, MIC, LINEOUT
GPIO
2.0mm间距26针式接头连接器,包括USB OTG,USB串口,I2C,UART,SPI,I2S,GPIO
PCB
6层高密度沉金设计
工作温度
0-80°C
尺寸
31mmx22mm
Atom-N Carrier Board
插槽
Quark-N的m.2接口
USB
USB 2.0×2 USB Type-C×1
无线连接
RTL8723BU: Wi-Fi: IEEE 802.11 b/g/n @2.4GHz 蓝牙: BT V2.1/ BT V3.0/ BT V4.0
板载外设
1 x 麦克风 1 x MPU6050运动传感器(陀螺仪 + 加速度计) 4 x 按钮 (GPIO-KEY, Uboot, Recovery, Reset) 1 x TFT 显示屏
外部存储
Micro SD卡插槽
尺寸
40mm*35mm
产品特性
体积超小 (31mm x 22mm) 和高度集成的四核Cortex-A7 Linux SoM
带有丰富外围设备和接口的底板(40mmx35mm) : 麦克风,陀螺仪,加速度计,4个按钮和TFT显示屏等
集成了完整的ARM-Linux系统以进行高级开发
无线连接能力(Wi-Fi + 蓝牙)
具有m.2接口可以轻松设计您的底板
广泛的应用场景,例如个人服务器,智能语音助手和机器人开发等
USB Type-C功能:带USB-TTL可以直接用于串口登录终端
二、开发资源分享
在网上找了一些教程和资源,给大家分享下:
教程:
https://wiki.seeedstudio.com/cn/Quantum-Mini-Linux-Development-Kit/#%E4%BB%8Eubuntu-1604-%E5%8D%87%E7%BA%A7%E5%88%B0ubuntu-1804-lts
评测:
https://www.cnblogs.com/WATER-code/p/17508420.html
克隆代码地址:
https://gitee.com/coolflyreg163/quark-n
三、环境搭建
启动开发板
首先把板子启动起来吧,电脑Type-C供电就可以,刚开始供电以为板子没有任何反应,还以为板子坏了(正常来说都会先烧一个版本测试板子功能的)
后面看教程才知道还要自己手动烧。
首先,下载镜像文件:https://files.seeedstudio.com/wiki/Quantum-Mini-Linux-Dev-Kit/quark-n-21-1-11.zip
下载完成后解压出来.img文件,再下载烧录工具:https://www.balena.io/etcher/
下载完直接双击运行,把镜像文件烧录到sd卡中(至少16G,烧录完后sd卡只能用于启动,记得提前备份自己的文件!)
烧录完成,有时候电脑会提示是否格式化,这个点取消,直接拔出sd卡插到板子上。
给开发板供电,稍等一下开发板上的灯会亮起。并且可以看到一个可爱的小图标,这时我们的开发板就启动成功了!
黄灯常量代表上电。
白灯的为系统心跳LED,根据CPU的负载会有规律的闪烁。
串口登录系统
系统启动完成后,会看到电脑上识别到一个USB串口,可以用这个串口登录Quark-N进行终端交互,或者用相关命令连接WiFi后通过SSH登录。
本来想通过usb串口连接的,但是发现没有这个驱动,给大家分享一下如何安装CP21X的驱动。
首先,进入官网:https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads
选择DOWNLOADS界面,windows10、11选择第一个,windows7、8选择第4个
下载完成后,解压压缩包会出现这个界面,右击.inf文件选择安装
安装成功后,设备管理器就可以看到COM口啦
用串口工具(我一般常用SecureCRT)登录开发板,记得波特率选为115200
系统默认用户和密码
普通用户:
users: pi
password: quark
Root用户:
users: root
password: quark
系统配置
你可以使用这个npi-config命令来配置系统,如用户、系统语言、时区、ssh等等.
注意,系统已经默认配置好, 如果你不知道如何配置系统,请保持默认配置.
开启WiFi
首先我们要用串口登录系统,配置连接WiFi后通过SSH登录。
这里有一个快捷的脚本:
cd /home/pi/WorkSpace/System/net/
sudo python connect_wifi.py SSID PASSWORD
其中SSID是WIFI名字,PASSWORD为密码
下面是正常使用,我们使用NetworkManager来管理网络,但请按照以下步骤连接到Wi-Fi:
切换到root用户:
$ su root
开启Wi-Fi:
$ nmcli r wifi on
扫描附近的Wi-Fi:
$ nmcli dev wifi
连接到特定的Wi-Fi:
$ nmcli dev wifi connect "SSID" password "PASSWORD" ifname wlan0
重启网卡设备
sudo ifconfig wlan0 down sudo ifconfig wlan0 up
连接成功后,下次开机,WiFi 也会自动连接。
如果你的USB WiFi无法正常工作, 大概率是因为文件系统里缺少了对应的USB WiFi固件。
可以通过下列命令安装所有的USB WiFi固件:
apt-get install linux-firmware
有关NetworkManager的更多参考,请阅读here.
SSH登录系统
可以通过ifconfig查看网络
ifconfig
通过SSH工具连接,我习惯用PUTTY
输入用户名和登录密码就可以登录系统了
软件更新 (可选择)
第一次连接到网络后,最好先更新软件:
$ sudo apt-get update
远程桌面连接
系统镜像中包含xrdp服务
并在正常情况下默认运行,可以使用Windows自带的远程桌面连接
软件进入Quark-N的桌面:
使用 ifconfig 获取开发板的ip地址
在Windows电脑上搜索远程桌面连接,打开软件
在同一局域网中,输入开发板的IP地址并登录,这样就可以进行远程桌面控制了!
不知道为什么,我的桌面壁纸和别人的不一样哈哈
- 2024-07-10
-
发表了主题帖:
一起读《机器学习算法与实现 —— Python编程与应用实例》- 第1章 绪论
本书介绍
本书的名称是《机器学习算法与实现——Python编程与应用实例》,作者布树辉是西北工业大学的教授,我浏览了他的gitee,里面都有很全的自学机器学习及编程的资料,大家可以去看看:https://gitee.com/pi-lab
本书总共有11章,可以分为3大块,第一部分是Python语言;第二部分是机器学习的基础算法及实现;第三部分为深度学习及目标检测。
从第一章绪论就可以看出来,本书实践性很强,可以边做实验边理解书中的概念,而且本书还配有视频教程和电子档的资料,b站就能免费观看!
最后,本书质量非常不错,彩版印刷,看起来相当舒服,真心建议大家买一本回去仔细学习!
第一章介绍
第一章介绍了一些机器学习的来历、基本的专业术语和机器学习的类型,还有机器学习在现实生活中的应用,以及实现机器学习应用的具体步骤,另外又讲了一下评估机器学习模型好坏的方法和学习机器学习的方法。
总的来说,第一章主要是向还不熟悉机器学习的同学介绍和认识机器学习,并且扩展讲了一下现实生活中对机器学习的应用步骤,以及告诉我们,新手该如何正确学习机器学习,和学习机器学习正确的方法。
下面我就摘取一些我认为很有价值的东西,分享给大家:
人类想要构建智能机器,让机器具备和人一样的学习能力,就需要让机器自己具备智能。而使机器自己具备智能这样的学习理论和方法就是重要的研究课题。我们正好可以让机器模仿人类的学习方式实现”机器学习“:输入、整合和输出。
实际上人类学习的定义就是:人类的学习是根据过往的知识或经验,对一类问题形成某种认识或总结出一定的规律,然后利用这些知识对新问题进行判断、处理的过程。
而真正的现实生活中,具有海量的信息,挖掘其所蕴含的知识,突破人类认知能力的瓶颈,是人类目前面临的主要挑战之一,所以“机器学习”就是解决这一理念的产物。
机器学习的定义如下:机器学习是一类算法的总称,这些算法能够从大量历史数据中挖掘出隐含的规律,并用于分类、回归和聚类。
机器学习更简单和形象的定义是:寻找从输入样本数据到期望输出结果之间的映射函数。注意,机器学习的目标是使学习得到的函数很好地适用于“新样本”,而不是仅适用于训练样本。
机器学习的基本思路如下:1.收集并整理数据;2.将显示问题抽象成数学模型;3.利用机器学习方法求解数学问题;4.评估求解得到的数学模型。
无论使用什么算法和数据,机器学习的应用都包含上述几个步骤。
一、机器学习的发展历程
从20世纪50年代至今,人工智能的发展经历了“推理期”“知识期”和“机器学习时期”
机器学习时期大致也分为三个阶段。20世纪80年代初,连接主义较为流行。20世纪90年代,统计学习方法占据主流舞台。进入21世纪,深度神经网络被提出,连接主义思想又受到大家关注。
具体机器学习的发展历程可以百度搜索,我们主要为了学习技术,对于历史背景在学习技术的过程中再详细了解。
二、机器学习的基本术语
本章及以下内容不必强求理解,只需记住这些名词和概念即可,后续章节中深入讲解设计的概念和内涵。
1.特征:特征是被观测目标的一个独立可观测的属性或特点,即某个东西可直接被观察到的属性。很多个特征可以定义出一个标签,这个标签是无法直接观察到或难以被观察到的属性,比如可以通过一个草莓的大小、颜色、成熟度等等的特征来判断出这个草莓味道是否甜的标签。
2.样本:样本是数据的特定实例,分为两类,有标签样本和无标签样本。无标签样本不包含标签,需要通过算法根据数据在特征空间中的分布关系自动找到样本之间的关系。样本的集合构成数据集,在不同的阶段对算法模型进行训练、测试和验证,数据集也正好被分为训练集、测试集、验证集。
3.模型:模型定义特征与标签之间的关系,一般可以是为一个由参数定义的函数或逻辑操作的集合。模型的生命周期包括两个阶段:1.训练阶段,创建或学习模型。2.推理阶段,将训练后的模型应用于无标签样本,对其做出有用的预测。
4.回归、分类与聚类:机器学习的基本应用是回归、分类和聚类。回归和分类都属于监督学习,其主要特点是根据输入的特征,分析并得到数值或类别。回归问题常用于预测一个连续值,如预测房价、未来气温等。分类问题的目的是将事物打上标签,结果通常为离散值。聚类问题属于无监督学习,用于在数据中寻找隐藏的模式或分组。
5.泛化与过拟合:通过数据学习得到模型的过程就是学习,也称训练。先根据训练数据集构建一个模型,然后将该模型用于此前未见过的新数据的过程,被称为模型的泛化。构建一个对现有信息量来说过于复杂的模型,如果该模型在拟合训练数据集时表现得非常好,但在测试数据集上表现非常差,就说明模型出现了过拟合。与之相反,模型如果过于简单,就可能无法掌握数据的全部内容及数据中的变化,机器学习模型甚至在训练集上表现都很差,不能拟合复杂的数据,这种成为欠拟合。只有在训练集和测试机的精度都较高的情况下,才认为模型对数据拟合的成都刚刚好,模型的泛化表现出色,这才是最期望的模型。
三、机器学习的基本分类
1.监督学习:监督学习是指在训练机器学习模型时,使用有标签的训练样本数据。首先建立数据样本特征和已知结果之间的练习来求解最优模型参数,然后同各国模型和求解的的模型参数对新数据进行结果预测。监督学习通常用于分类和回归问题。监督学习的难点是,获取具有目标值的标签样本数据的成本较高,而成本高的原因是这些训练集要一路来人工进行标注。
2.无监督学习:根据类别位置(未被标记)的训练样本解决模式识别中的各种问题,称为无监督学习。无监督学习与监督学习的区别是选取的样本数据无需标签信息,而只需分析这些数据的内在规律。此外无监督学习也适用于降维。无监督学习的优点是,数据不需要进行人工标注,且数据获取成本低。
3.半监督学习:半监督学习是监督学习和无监督学习相结合的一种学习方法,半监督学习方法可以结合分类、回归和聚类,只需少量有带标签的样本和和大量无标签的样本即可获得较好的应用效果。
4.深度学习:根据人工神经网络的层数或者机器学习方法的非线性处理深度,可以将机器学习算法分为浅层学习算法和深度学习算法。浅层学习算法的典层代表是感知机,深度神经网络主要是指处理层数较多的神经网络。
5.强化学习:强化学习又称再励学习、评价学习或增强学习,用于描述和解决智能体与环境交互的学习策略,以达成回报最大化或者实现特定目标的问题。
6.总结:机器学习与人工智能:人工智能是一种概念,主要目标是使机器能够胜任通常人类智能才能完成的复杂工作。机器学习是一种实现人工智能的方法,是一种实现机器学习的技术,也是当前最热门的机器学习方法。下图展示了机器学习和人工智能之间的关系。
四、机器学习的应用
以机器学习为代表的各种智能方法不仅应用于图像识别、语音识别、自然语言处理等传统领域,在其他方向也有其重要的作用,下面几种是比较常见且重要的应用:
1.图像识别与处理
2.语音识别与自然语言处理
3.环境感知与智能决策
4.融合物理信息的工程设计
五、机器学习应用的步骤
使用机器学习解决实际问题时,遵循的基本流程如下:
选择合适的模型。这通常需要视实际问题而定,即要针对不同的问题和任务选取恰当的模型,而模型就是一组函数的集合。
判断函数的好坏。这需要确定一个衡量标准,即通常所说的损失函数,损失函数的确定也需要视具体问题而定,如回归问题一般采用欧式距离,分类问题一般采用交叉熵代价函数。
找出“最好”的函数的模型参数。如何从高维参数空间最快地找出最优的那组参数是最大的难点。常用的方法有梯度下降法、最小二乘法等。
学习得到“最好”的函数的参数后,需要在新样本上进行测试,只有在新样本上表现很好时,才算是一个最优模型。
机器学习的流程本质上是数据准备、数据分析、数据处理和结果反馈的过程,如下列排序所示:
1.应用场景分析
2.数据处理
3.特征工程
4.算法模型训练与评估
5.应用服务
六、机器学习的评估方法
当模型训练完成时,需要对模型进行跟踪与评估。为了让得到的模型适用于新样本,即使模型获得一个最期望的模型。为了充分验证机器学习模型的性能和泛化能力,需要选择与问题匹配的评估方法,才能发现模型选择或训练过程中的问题,进而迭代地优化模型。下面是两种常见的评估方法:
1.数据集划分方法:数据集一般需要分割为训练集、测试集和验证集,划分方法如下:1.留出法2.交叉验证法3.自助法
2.性能度量:性能度量是衡量模型泛化能力的数值评价标准,反映了所求解模型的性能。
七、如何学习机器学习
主要有两个中心思想:
1.由浅入深:机器学习综合了诸多学科知识,应由浅入深,循序渐进的方法学习机器学习,并基于Python应用建立感性认识,在学和做的过程中不断强化理解机器学习的深度与广度。
2.形成于思:机器学习是一门实践性很强的学科,需要理论与实践相结合,不仅要理解还要实践,学习机器学习时应先快速建立感性认识去解决一些实际问题,并在解决问题的过程中加深理论、算法、编程、验证等方面的理解。
总结
最后,攀登机器学习这座“高山”,不必强求一步就学会,而在做与学的过程中不断强化感性认识,进而牵引理论学习。所以对于机器学习这些多而复杂的概念,可以先认识了解,在实验中学习和加深这些概念的印象即可。后面几章就是在实践中进行学习,希望大家可以和我一起跟着布树辉老师做实验,从而真正掌握机器学习这门学科!!!
- 2024-07-05
-
加入了学习《C++零基础入门到精通》,观看 C++入门-01-代码、编译和程序
-
加入了学习《C++零基础入门到精通》,观看 导学视频
- 2024-06-20
-
回复了主题帖:
共读入围:《机器学习算法与实现 —— Python编程与应用实例》
个人信息确认无误,确认可以完成测评分享计划
- 2024-06-17
-
加入了学习《泰克 4 系列 B MSO》,观看 泰克4系列B MSO混合信号示波器简介
- 2024-06-15
-
加入了学习《用树莓派和Python开发机器人教程》,观看 控制电机:用软硬件让马达动起来