鸢尾花数据分类实战

数据预处理,绘图

数据集大概是这样子的


10651191-b52456fd99f35f5a.png

将数据预处理一下

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如下


10651191-d3fa0e99616c50e7.png

labels如下


10651191-6bd9e6992bb36238.png

之后绘图

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的结果如下:


10651191-28f16d50005151fe.png
    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)

得到一张这样的图

10651191-995db78eb12dfa19.png

但是标题显示有问题,这就很烦了

总结一下预处理的过程,大概就是提取出自己的需要的数据,然后在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
==========
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值