学习毫末智行数据标注怎么分组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习毫末智行数据标注怎么分组相关的知识,希望对你有一定的参考价值。

机器学习实战(十)——利用K-均值聚类算法对未标注数据分组
聚类是一种无监督的学习,即对于训练数据来说并没有已知标签,我们是根据样本之间的相似程度将其划分为多个类。

一、K-均值聚类算法
K-均值算法可以通过计算样本之间的相似程度,将训练集划分为K个类别。这里类别数K是用户指定的。每一个类别通过其质心(类别中所有点的中心)来描述。其特点是思路和算法都很简单,但是比较容易收敛到局部最小值,并在在大规模的数据集上收敛速度较慢

用伪代码来描述可以更好地理解该算法流程:

创建k个点作为起始质心(通常是随机选择)
当任意一个点的类别分配结果发生改变时:
遍历数据集中的每一个数据点:
遍历每一个质心:
计算当前数据点和这个质心的距离
将当前数据点分配到最近的质心,即最近的类别之中
遍历完每一个数据点分类后重新计算每一个类别的质心(取类别中所有点的均值)
登录后复制
K-均值算法所需要的支持函数为:

from numpy import *

def loadDataSet(fileName):
dataMat = []
fr = open(fileName)
for line in fr.readlines():
curLine = line.strip().split('\t')
fltLine = list(map(float,curLine)) # 这里原文错了
dataMat.append(fltLine)
return dataMat

def distEclud(vecA,vecB):
disTance = sqrt(sum(power(vecA-vecB,2)))
return disTance

# 用于初始化聚类中心的函数
def randCent(dataSet,k):
n = shape(dataSet)[1]
centroids = mat(zeros((k,n))) # 每一行都是一个质心的坐标,有n维度
for j in range(n):
minJ = min(dataSet[:,j])
rangeJ = float(max(dataSet[:,j]) - minJ)
centroids[:,j] = minJ + rangeJ * random.rand(k,1)
# 随机构建k个聚类中心,每一个中心的每一个坐标都不会超过已有样本的范围
return centroids
登录后复制

注意:如果直接按照原文的代码,会报错,错误为:

TypeError: unsupported operand type(s) for -: 'map' and 'map'
登录后复制
因为在python3中,map函数返回的类型是该对象的内存地址,不是我们想要的列表类型,因此需要加上list,即:

fltLine = list(map(float,curLine))
登录后复制
接下来为具体的K-均值算法函数:

def kMeans(dataSet, k, distMeas = distEclud, createCent = randCent):
# 与之前的类似,后两个参数为函数的引用,当想用另外的方式计算距离或者初始化
# 就改这两个参数即可
m = shape(dataSet)[0]
clusterAssment = mat(zeros((m,2))) # 用来存储样本点所属的类和距离
centroids = createCent(dataSet,k) # 初始化k个类的质心
clusterChanged = True # 用来记录当前循环是否有样本点改变了类别
while clusterChanged:
clusterChanged = False
for i in range(m):
minDist = inf # 初始化
minIndex = -1
for j in range(k):
distIJ = distMeas(centroids[j,:],dataSet[i,:]) # 计算距离
if distIJ < minDist: # 更新距离
minDist = distIJ
minIndex = j
if clusterAssment[i,0] != minIndex: # 如果不相等则说明发生了更新
clusterChanged = True
clusterAssment[i,:] = minIndex,minDist**2
print(centroids)
for cent in range(k): # 更新质心的位置
# 先找出属于当前类的样本点
ptsInClust = dataSet[nonzero(clusterAssment[:,0].A == cent)[0]]
centroids[cent,:] = mean(ptsInClust,axis = 0) # 按照平均值来更新
return centroids,clusterAssment
登录后复制

二、使用后处理来提高聚类性能
由于上述K-均值的过程中聚类数目k是需要用户指定的,那么问题就是什么样的k才是最好的,以及如何评价。

思路就在于之前分类的时候存储了每一个样本点到其对应质心的距离。一种用于度量聚类效果的指标为SSE(误差平方和),就是类别种各个样本点距离类别质心的距离之和。

降低SSE的方法最简单的当然是增加划分的类别数,例如可以将SSE最大的类划分为多个类。但为了在保持类别数不变的情况下降低SSE,可以划分为较多个类后再对类进行合并直到满足数目要求,例如将最近的质心合并,或者合并两个使得SSE增幅最小的质心。

三、二分 K-均值算法
该算法提出是为了克服K-均值收敛于局部最小值的问题。具体的思路为:

首先将所有点作为一个类别,然后将该类别按照K-均值的分类方法分成两个类

之后再选在其中一个类别继续划分,直到满足指定的类别数目为止

而如何选择划分的类别,取决于对哪个类别划分能够最大程度的降低整体SSE的值

用伪代码的形式加以理解:

将所有点看成一个类别
当类别数目小于k时:
对于每一个类别:
计算总误差
对当前类进行K-均值聚类(k=2)
计算划分后的总误差
选择使得误差减少最多的那个类进行划分
登录后复制
具体代码为:

def biKmeans(dataSet, k, distMeas = distEclud):
m = shape(dataSet)[0]
clusterAssment = mat(zeros((m,2)))
centroid0 = mean(dataSet, axis = 0).tolist()[0] # 以所有样本点的均值作为初始化中心
centList = [centroid0]
for j in range(m):
clusterAssment[j,1] = distMeas(mat(centroid0),dataSet[j,:])**2 # 计算距离
while(len(centList) < k): # 当前类别数目未达到要求k就循环
print("the len of centList is :",len(centList))
lowestSSE = inf
for i in range(len(centList)): # 对当前已有的类
# 找到属于当前类的样本
ptsInCurrCluster = dataSet[nonzero(clusterAssment[:,0].A == i)[0],:]
# 对当前类进行二分
centroidMat,splitClustAss = kMeans(ptsInCurrCluster,2,distMeas)
seeSplit = sum(splitClustAss[:,1]) # 对划分之后的当前的误差求和
# 计算其他类别的总误差,可以和这个划分的求和来计算样本的总误差
seeNoSplit = sum(clusterAssment[nonzero(clusterAssment[:,0].A != i)[0],1])
print("seeSplit and seeNoSplit:",seeSplit,seeNoSplit)
if (seeSplit + seeNoSplit) < lowestSSE:
bestCentToSplit = i # 记录最好的那个划分类别
bestNewCents = centroidMat # 记录划分后的两个新类的质心
bestClustAss = splitClustAss.copy() # 记录类内样本的划分情况
lowestSSE = seeSplit + seeNoSplit
# 找到了那个最适合的类来划分了
# 以下两个只是对新划分出来的类更新数字,因此划分为01,但现在已有了其他类
bestClustAss[nonzero(bestClustAss[:,0].A == 1)[0],0] = len(centList) # 作为新的类
bestClustAss[nonzero(bestClustAss[:,0].A == 0)[0],0] = bestCentToSplit # 作为原来的类
print("the bestCentToSplit is: ",bestCentToSplit)
print("the len of bestClustAss is:",len(bestClustAss)) # 有多少个样本
centList[bestCentToSplit] = bestNewCents[0,:] # 更新原来的类的质心
centList.append(bestNewCents[1,:]) # 增加新类的质心
# 原来属于划分类的那些拿出来,令它们等于新的划分结果,相当于对他们更新
clusterAssment[nonzero(clusterAssment[:,0].A == bestCentToSplit)[0],:] = bestClustAss
centList = list(map(lambda x: [x[0], x[1]], [matrix.tolist(i)[0] for i in centList]))
return mat(centList),clusterAssment
登录后复制

注意:如果按照原文代码,将会有以下错误:

发生在:

return mat(centList),clusterAssment
登录后复制
错误为:

ValueError: matrix must be 2-dimensional
登录后复制
将centList打印出来发现:

[matrix([[2.93386365, 3.12782785]]), matrix([[-0.45965615, -2.7782156 ]]), matrix([[-2.94737575, 3.3263781 ]])]
登录后复制
就是说这个只有一维,但是矩阵要求是二维的。那么可以进行如下处理:

centList = list(map(lambda x: [x[0], x[1]], [matrix.tolist(i)[0] for i in centList]))
登录后复制
分析:

>>> A = [np.matrix([[-1.70351595, 0.27408125]]), np.matrix([[2.836743 , 3.6383055]]), np.matrix([[3.1604785 , 1.93671333]])]
>>> [np.matrix.tolist(i)[0] for i in A]
Out[10]: [[-1.70351595, 0.27408125], [2.836743, 3.6383055], [3.1604785, 1.93671333]]
>>> map(lambda x: [(x[0]), x[1]], [np.matrix.tolist(i)[0] for i in A])
Out[11]: <map at 0x22c6ba6e5c0>
>>> list(map(lambda x: [(x[0]), x[1]], [np.matrix.tolist(i)[0] for i in A]))
Out[12]: [[-1, 0.27408125], [2, 3.6383055], [3, 1.93671333]]
登录后复制
l a b m d a labmda labmda是匿名函数,就是创建一个匿名函数,其输入参数为x,返回值为 [ x [ 0 ] , x [ 1 ] ] [x[0],x[1]] [x[0],x[1]],然后map即是将这个匿名函数应用于第二个参数的每一个元素中。

四、示例:对地图上的点进行聚类
从网站获取经纬度的代码就跳过了,因为文件places.txt中的最后两列就是经纬度信息,直接利用这些进行聚类

都是画图的代码,就不做解释了
参考技术A 学习毫末智行数据标注怎么分组?
答:1. K-均值聚类算法 K-均值算法可以通过计算样本之间的相似程度,将训练集划分为K个类别。这里类别数K是用户指定的。每一个类别通过其质心(类别中所有
2. 使用后处理来提高聚类性能 由于上述K-均值的过程中聚类数目k是需要用户指定的,那么问题就是什么样的k才是最好的,以及如何评价。 思路就在于之前
3. 二分 K-均值算法 。

一年融资三轮背后,毫末智行“凭什么”?

自动驾驶又一独角兽诞生。

今年2月10日,毫末智行获得长城汽车一笔融资,资金不详。12天后,毫末智行完成数亿元Pre-A轮融资,投资方包括首钢、美团、高瓴资本等。

今日,毫末智行宣布获得A轮融资近10亿元,美团、高瓴创投、高通创投、首程控股、九智资本等领投,资金将主要用于自动驾驶研发投入和人才体系建设。据36氪报道,毫末智行投后估值超过10亿美元。

一年内获得三轮融资,如此让资本“疯狂”的毫末智行,究竟做对了什么?

赛道火热,新兴自动驾驶独角兽诞生

毫末智行成立于2019年,脱胎于长城,前身为2015年长城汽车成立的智能驾驶系统开发部,2019年11月独立后,其核心团队一部分来自于“老东家”,另一部分则是从自动驾驶百度Apollo团队和华为团队等企业挖来的有关自动驾驶的人才,因此毫末智行拥有“传统车企+互联网”复合经验。

据了解,毫末智行已经开发了L2级别的辅助驾驶功能,公司预计到2022年年底,其L2辅助驾驶将在34款车型中可用。其还在研发L4级别的自动驾驶技术,并已与美团物流车辆合作,可以在没有人类驾驶员的多场景下进行货物的运输。

在宣布获得近10亿元A轮融资后,毫末智行成为国内为数不多实现智能驾驶规模量产的新兴自动驾驶独角兽。

“自动驾驶是整个智能汽车行业门槛最高、周期最为持久的创业赛道之一,完成 A 轮融资是毫末打赢的生存第一仗。而在政策、市场、人才、技术、资本等综合要素的助力下,相信中国一定会诞生世界级的自动驾驶公司。基于此,毫末期待携手国内外优秀的合作伙伴、投资机构,继续保持技术创新及商业化落地优势,加快推出新产品、新服务。” 毫末智行董事长张凯表示。

随着相关技术和政策的落地,自动驾驶从概念进入现实的同时,也吸引了大批玩家和资本入场。

据不完全统计,今年以来,针对自动驾驶的投融资事件已超30起,披露投融资总金额超过2019年全年的总额。前瞻产业研究院数据显示,到2021年预计全球无人驾驶汽车市场规模将达70.3亿美元。

在资本狂飙之外,各类型自动驾驶公司的技术和商业模式火速研发、量产和落地。尤其在运输、物流等商用细分领域,机场、码头、高速等局部环境中,无人驾驶已经开始普及并运行。

国内自动驾驶企业中,百度获得了加州全无人驾驶测试许可,小马智行已经在中国广州、美国加州尔湾以及弗里蒙特市向公众提供服务;大众集团在国内的Robotaxi项目已经在合肥开始运营;百度旗下无人车出行服务平台“萝卜快跑”已经在北京等地开始启动试点,预计3年之内,会有30个城市接入“萝卜快跑”服务。

一周之前,文远知行宣布获得广汽集团3000万美元战略投资。三方计划在未来几年逐步建立起一支Robotaxi车队并实现商业化运营,以粤港澳大湾区为核心向全国辐射,面向大众推出安全、经济、绿色的自动驾驶出行服务。其中,计划于2022年在如祺出行平台上线Robotaxi运营,为用户提供自动驾驶出行服务。

自动驾驶持久战,毫末智行能否创造“毫末模式”?

据中信证券分析,自动驾驶预计将是万亿级的广阔市场,有望解决人力成本提升、交通安全、司机短缺等诸多痛点,其中城市开放场景的市场空间最大。不过,正如张凯所说,自动驾驶也是整个智能汽车行业门槛最高的创业赛道。

要将相关技术进行实际应用并完成一定数量级的自动驾驶汽车测试、实现商业化落地,依然是最大的难题。

因为和通用的Cruise自动驾驶公司模式相似,毫末智行从建立至今一直被称为是中国版Cruise。然而,技术是包括毫末智行在内的任何自动驾驶企业都需要面临的问题。除此之外,自动驾驶行业也是乱象丛生,如多种技术路线并存、各自为政;不同厂商对自动驾驶级别的标准定义不同等等。

对于自动驾驶汽车企业来说,如何在剧烈变化的外部环境下寻求良性发展,就成了首要挑战。尤其是经过资本繁荣期,行业内充斥着大量初创企业和知名厂商,大家都在沿着各自的技术路径和商业模式向前摸索。

“黑猫、白猫,能抓到老鼠的都是好猫。”AI自动驾驶是一场持久战,“熬”是一方面,而如何为“熬”奠定基础则是企业眼下需要迫切解决的问题。

毫末智行制定了属于自己的“风车战略”,以数据智能为核心,以乘用车无人驾驶、无人驾驶物流车、自动驾驶硬件三条业务线为叶片,形成了良性循环,这些业务线都可以最小化产品起步,实现商业化运转并自我造血,从而带来源源不断的商业能量。

如今自动驾驶已经到了反思的时刻,未来的科技变革也不会太遥远,不过现下中国自动驾驶企业整体发展依旧处于较早阶段,多处于起步发展阶段。如何做到安全与高效并驾齐驱,才是决定一个自动驾驶企业能走多远的重要标准。

本文来源:松果财经(songguocaijing1)

以上是关于学习毫末智行数据标注怎么分组的主要内容,如果未能解决你的问题,请参考以下文章

一年融资三轮背后,毫末智行“凭什么”?

毫末智行,现在是中国营收增速最快的无人车公司

渐进派破壁:西有特斯拉,东有毫末智行!用数据智能推动自动驾驶历史进城...

毫末智行“AI DAY”即将来临,自动驾驶未来何解?

自动驾驶系统为何要打上「思想钢印」?北京顺义闹市区里藏着毫末智行的谜底...

以匠心正道,以决心致远:毫末智行的自动驾驶之路