数据预处理,绘图
数据集大概是这样子的
将数据预处理一下
def get_data(loc="iris.csv"):
with open(loc, 'r') as fr:
lines = csv.reader(fr)
data_file = np.array(list(lines))
data = data_file[1:, 0:-1].astype(float)
labels = data_file[1:, -1]
return data, labels
返回地data如下
labels如下
之后绘图
def draw():
style_list = ['ro','go','bo']
data, labels = get_data()
print(data)
print(labels)
cc = defaultdict(list)
for i, d in enumerate(data):
cc[labels[i]].append(d)
p_list = []
c_list = []
for i, (c, ds) in enumerate(cc.items()):
draw_data = np.array(ds)
p = plt.plot(draw_data[:, 0], draw_data[:, 1], style_list[i])
p_list.append(p)
c_list.append(c)
plt.legend(map(lambda x:x[0], p_list), c_list)
plt.title("鸢尾花萼片的长度和宽度")
plt.xlabel("萼片的长度(cm)")
plt.ylabel("萼片的宽度(cm)")
plt.show()
对data进行进一步处理,得到索引和元素,然后将其用dict存储起来
再次处理
对cc的key和value进行循环
cc = defaultdict(list)
for i, d in enumerate(data):
cc[labels[i]].append(d)
cc的结果如下:
for i, (c, ds) in enumerate(cc.items()):
draw_data = np.array(ds)
p = plt.plot(draw_data[:, 0], draw_data[:, 1], style_list[i])
p_list.append(p)
c_list.append(c)
得到一张这样的图
但是标题显示有问题,这就很烦了
总结一下预处理的过程,大概就是提取出自己的需要的数据,然后在python的各种数据类型之间进行转换
python的各种数据类型和nump的数组一定要很熟悉
KNN近邻算法
从代码上就能看地差不多了
def classify(input_data, train_data, labels, k):
data_size = train_data.shape[0]
diff = np.tile(input_data, (data_size, 1)) - train_data
sqrt_diff = diff ** 2
sqrt_distance = sqrt_diff.sum(axis=1)
distance = np.sqrt(sqrt_distance)
sorted_index = distance.argsort()
class_count = Counter(labels[sorted_index[:k]])
return class_count.most_common()[0][0]
每种花其实是有四个属性的,萼片的长度和宽度,花瓣的长度和宽度
近邻算法就是计算距离
根据距离的远近来判断
所以先diff = np.tile(input_data, (data_size, 1)) - train_data
计算出差值
之所以 np.tile
是怕数据的维度不一样
然后平方 ,平方之后,沿行方向求和再开方
random的shuffle() 方法将序列的所有元素随机排序。
这里需要注意的是:
python3中的random.shuffle()方法只能打乱list
所以必须将range类型的转换成list类型的
所以打乱的代码:
def try_once():
data, labels = get_data()
index = range(len(data))
data = data[index]
labels = labels[index]
index = list(index)
random.shuffle(index)
labels = labels[index]
data = data[index]
input_data = data[-1]
data = data[:-1]
input_label = labels[-1]
labels = labels[:-1]
print('input_index:', index[-1])
print('true class:', input_label)
print(classify(input_data, data, labels, 5))
这样就完成了KNN算法了
结果如下
input_index: 58
true class: versicolor
versicolor
==========
input_index: 70
true class: versicolor
virginica
==========
input_index: 76
true class: versicolor
versicolor
==========
input_index: 107
true class: virginica
virginica
==========
input_index: 67
true class: versicolor
versicolor
==========
网友评论