@staticmethod
def dot(v1,flower):
dot_prod = 0
i = 0
while i<4:
dot_prod+=float(v1[i])*float(flower[i])
i+=1
return dot_prod
@staticmethod
def norm(vec):
return math.sqrt(iris.dot(vec,vec))
@staticmethod
def sim_score(v1,v2):
score = iris.dot(v1,v2) / (iris.norm(v1)*iris.norm(v2))
return score
所以这个程序的重点是将一组列表与输入数据进行比较。在列表中,有四个浮点数和一种花。我只是想做的是将每个花朵与用户提供的输入进行比较。这是比较输入文件数据和文件数据的正确方法吗? flower将是文件中的信息
答案 0 :(得分:0)
正如一位评论者提到的那样,你一定要看看numpy和scipy,这会使很多数学运算 - 特别是那些涉及矩阵和向量的运算 - 变得更加容易。
余弦距离直接available in scipy,可以大大简化您的代码:
from scipy.spatial.distance import cosine
score = cosine(v1, v2)
加载存储在文件中的数据取决于文件格式。存储数据的一种常用方法是在csv文件中,其中每行包含一个条目(在您的情况下是一个花),其值以逗号分隔。如果您有一个名为flowers.csv
的文件,您可以将其加载到如下所示的numpy数组中:
import csv
import numpy as np
# open the csv file to read the data
with open('flowers.csv') as flower_file:
# create a reader that will read the file line by line
# and split each line at the commas while reading
flower_reader = csv.reader(flower_file)
# map list of string values in each line to floats,
# and package the whole thing in a numpy array
flower_data = np.array([map(float, line) for line in flower_reader])
然后,如果用户提供输入,我们会调用user_flower
,我们可以使用scipy函数flower_data
获取它与cosine
中每个花之间的余弦距离如上所述:
distances = [cosine(user_flower, f) for f in flower_data]
最相似的花的数量最少。