我是R用户,因此我习惯使用数据[data $ variable ==' condition',]方式中的条件来使用数据框和访问数据。 我试图在python中编写一个简单的概率神经网络示例。 如果我的数据是:
data = {'o' : [(0.2, 0.5), (0.5, 0.7)],
'x' : [(0.8, 0.8), (0.4, 0.5)],
'i' : [(0.8, 0.5), (0.6, 0.3), (0.3, 0.2)]}
我希望对新记录进行分类:
nuevo=(0.2, 0.6)
我设法编写了下面的代码,创建了一个表格(列表列表),每个印刷品都可以看到... ...
kk=[]
def g (data, nuevo):
for k in data:
print(k)
j=-1
for i in data[k]:
j=j+1
print(i)
print(i[0])
print(i[1])
kk.append([k,i,math.e ** (-1 *((nuevo[0] - i[0]) ** 2 + (nuevo[1] - i[1]) ** 2) / ((2 * (0.1 ** 2))))])
print(kk[j])
g(data, nuevo)
最后我有kk列表列表,我需要选择每个o,x和i的最大值。然后选择具有最大值的那个。
我尝试了类似kk[kk[][0]=='o']
的内容,以获取所有具有' o'但是得到了错误的结果。这一定非常简单,但我无法以更简单的方式看到它(我不想使用循环)。
答案 0 :(得分:0)
您可以使用列表理解
简化您的功能g
def g(d,n):
return [[k,i,exp(-50*((n[0]-i[0])**2+(n[1]-i[1])**2))] for k in d for i in d[k]]
我敢说使用函数来修改全局数据结构并不总是最好的解决方案......
那就是说,你想为每个类别选择最大接近度,所以
def max_p(d, p):
return [max((x for x in p if x[0]==k), key=lambda x: x[2]) for k in d]
再次,列表理解(数据字典k
中每个键d
的列表元素)和新事物,生成器表达式,即部分{ {1}};生成器表达式每次都给出一个元素,即(x for x in p if x[0]==k)
内置函数的计算邻近列表中的所有元素。
max
函数的第二个参数是一个计算排序键的函数,这里max
是一个函数,使用key=lambda x: x[2])
语法在现场定义,返回内部索引为2的元素。
lambda
也就是说,您可以更好地向In [49]: data = {'o' : [(0.2, 0.5), (0.5, 0.7)],
'x' : [(0.8, 0.8), (0.4, 0.5)],
'i' : [(0.8, 0.5), (0.6, 0.3), (0.3, 0.2)]}
In [50]: nuevo = (0.2, 0.6)
In [51]: def g(d,n):
return [[k,i,exp(-50*((n[0]-i[0])**2+(n[1]-i[1])**2))] for k in d for i in d[k]]
....:
In [52]: def max_p(d, p):
return [max((x for x in p if x[0]==k), key=lambda x: x[2]) for k in d]
....:
In [53]: max_p(data, g(data, nuevo))
Out[53]:
[['i', (0.3, 0.2), 0.00020346836901064417],
['x', (0.4, 0.5), 0.0820849986238988],
['o', (0.2, 0.5), 0.6065306597126335]]
In [54]: max(max_p(data, g(data, nuevo)), key=lambda x: x[2])
Out[54]: ['o', (0.2, 0.5), 0.6065306597126335]
In [55]:
模块介绍
另一个选项是numpy
模块,但其他人已经提到过......