美文网首页
鸢尾花数据分类实战

鸢尾花数据分类实战

作者: 萍水间人 | 来源:发表于2019-06-01 19:49 被阅读0次

数据预处理,绘图

数据集大概是这样子的


将数据预处理一下

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
==========

相关文章

网友评论

      本文标题:鸢尾花数据分类实战

      本文链接:https://www.haomeiwen.com/subject/epnatctx.html