成为创作者的初心其实很简单,当时正值准备考研的时期,我的放松活动也就需要变得既能愉悦身心又不要玩物丧志,因此我便找到了写博客这么一个方式,恰好赶上 CSDN 官方的活动以及我当时确实编写出了十分满意的程序,我的第一篇博客便这么诞生了。
在第一篇博客发布后,我并未马上收到很多的阅读量,但是CSDN源源不断的传作激励活动给了我继续创作下去的动力与乐趣,那段时间里传作博客是我是我日常生活中重要的组成部分,带给我很多轻松与快乐。在2020年上半年的时候,我把自己毕设时遇到的问题整理成博客发表了出去,随着时间的推移,那两篇博客的阅读量持续上涨,大大超出我的预期,至今,那仍是我阅读量最高的博客,我也将它们放到了主页置顶的位置。从创作到今天我收获了下面让我自豪与满意的成果。
最近一年发生了很多事情,我没有编写很多程序,博客也就几乎没有发布,但我在 CSDN 的问答区找到了新的放松方式,在这里有一些难以解决的问题,而我则选择自己的专业领域给出尽可能正确的解答。在这一年里我回答了许多的问题,每次的采纳都让我十分开心与自豪。
目前为止,我自己最满意的代码仍是我第一篇博客编写的代码,这段代码是机器学习书籍上的一个习题,机器学习的课后习题有博主做出了详细的整理,但当时我并未找到该题的代码,因此我便自己尝试编写代码,并最终运行出了一个结果。
# -*- coding: utf-8 -*-
"""
Created on Sun Apr 21 11:57:22 2019
@author: lazyn
"""
import os
from sklearn.linear_model import LogisticRegression
import numpy as np
import pandas as pd
import warnings
from createPlot import createPlot
import matplotlib.pyplot as plt
warnings.filterwarnings("ignore")
#定义连续值处理函数
def con_deal(temp_df, a):
for j in range(0, len(temp_df)):
temp_df.iat[j] = 0 if(temp_df.iat[j] < a) else 1
return temp_df
#定义计算连续值正确率的函数
def con_acc(data, Y):
a = np.sort(np.array(data))
a = (a[0: len(a) - 1] + a[1: len(a)])/2
max_acc, ind = 0, 0
for i in range(0, len(a)):
temp_df = con_deal(data.copy(), a[i])
X0 = np.array(temp_df).reshape(-1, 1)
logreg = LogisticRegression()
logreg.fit(X0, Y)
acc = logreg.score(X0, Y)
if max_acc < acc:
max_acc = acc
ind = i
temp_df0 = X0
print(round(max_acc, 3), end = ', 判断结果为:\n')
print(logreg.predict(temp_df0))
return [max_acc, a[ind]]
#获取根节点函数
def getroot(X1, Y1, m):
max_acc = 0
for i in m:
if i != '密度' and i != '含糖率':
print(i + '节点, 正确率为', end = ':')
X0 = np.array(X1[i]).reshape(-1, 1)
logreg = LogisticRegression()
logreg.fit(X0, Y1)
acc = logreg.score(X0, Y1)
print(round(acc, 3), end = ', 判断结果为:\n')
print(logreg.predict(X0))
if max_acc < acc:
max_acc = acc
root = i
else:
print(i + '节点, 正确率为', end = ':')
acc = con_acc(X1[i], Y1)[0]
if max_acc < acc:
max_acc = acc
root = i
return root
#获取决策树数组函数
def gettree(X, Xo, Y, m):
n1, n2 = [], []
root = getroot(X, Y['好瓜'], m)
print('故选择' + root + '为根节点')
n1.append(root)
m.remove(root)
if root == '密度' or root == '含糖率':
div = con_acc(X[root], Y['好瓜'])[1]
X[root], Xo[root], Y[root] = con_deal(X[root], div), con_deal(Xo[root], div), con_deal(X[root], div)
# print(X, Xo)
Attr, Attro = X[root].unique(), Xo[root].unique()
# print(Attr, Attro)
for j, jo in zip(Attr, Attro):
n3 = []
if root == '密度' or root == '含糖率':
if j >= div:
key = '≥' + str(div)
else:
key = '<' + str(div)
else:
key = jo
print(root + '为' + key + '时:')
n3.append(key)
X1 = X[X[root] == j]
Xo1 = Xo[Xo[root] == jo]
Y0 = Y[Y[root] == j]
Y1 = Y0['好瓜']
if Y1.unique().size > 1:
Xn, Xon, Yn = X1, Xo1, Y0
n3.append(gettree(Xn, Xon, Yn, m))
else:
flag = '好瓜' if Y1.unique() == '是' else '坏瓜'
print(flag)
n3.append(flag)
n2.append(n3)
n1 += n2
return n1
#数组处理及绘制函数
def dealanddraw(n0, pngname):
alstr = str(n0)
alstr = alstr.replace(',', ':'); alstr = alstr.replace(']: [', ',')
alstr = alstr.replace(']:', '],')
alstr = alstr.replace('[', '{'); alstr = alstr.replace(']', '}')
inTree = eval(alstr)
# print(inTree)
plt.figure(figsize = (10, 7))
createPlot(inTree)
# dpi, 控制每英寸长度上的分辨率;bbox_inches, 能删除figure周围的空白部分
plt.savefig(pngname, dpi = 400, bbox_inches = 'tight')
f = open('watermelon3.txt')
watermelon3_df = pd.read_table(f)
Xo = watermelon3_df[['色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '密度', '含糖率']]
m = list(watermelon3_df.columns)
h = 0.001
for i in m:
if i != '密度' and i != '含糖率' and i != '好瓜':
size_mapping = {}
m0 = watermelon3_df[i].unique()
j = 1
for i0 in m0:
size_mapping[i0] = j
j += 1
# print(size_mapping)
watermelon3_df[i] = watermelon3_df[i].map(size_mapping)
X = watermelon3_df[['色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '密度', '含糖率']]
Y = watermelon3_df
m = list(X.columns)
n0 = gettree(X, Xo, Y, m)
pngname = os.path.basename(os.path.realpath(__file__)).replace('py', 'png')
dealanddraw(n0, pngname)
这段代码现在看来十分青涩与初级,在当时带给我的成就感是难以忘怀的。
未来我会从事计算机视觉相关的工作,希望可以做出小小的贡献,让这个世界更多的东西被计算机“看见”。
Tips