202210.10 主要学习了贝叶斯和数据清理基础知识,刷题Lintcode 667最长回文序列
#包含pandas库
import pandas as pd
#读入名叫jiangsu的表,并命名为jiangsu
jiangsu = pd.read_excel('jiangsu.xls', index_col = 0)
#保存表。到work文件夹中,命名为jiangnewtable
jiangsu.to_csv('work/jiangnewtable.xls')
#显示表内容
jiangnewtable = pd.read_csv(filepath_or_buffer = r"work/jiangnewtable.xls",index_col=0)
jiangnewtable
读取表用的是Pandas库中的.read_csv()
摘自:https://blog.csdn.net/m0_46336403/article/details/119817479
jiangnewtable = pd.read_csv(filepath_or_buffer = r"work/jiangnewtable.xls",index_col=0)
这里主要注意的是index_col=0
#读入cpi表格,显示前四行
#在此填写程序
cpi = pd.read_excel('cpi.xls')
cpi_1 = cpi.iloc[:4,:]
cpi_1
这里仅粗略记录与这里代码相关的切片语法
这里涉及到python中非常重要的语法 — 列表切片
简单切片指的是这样的切片形式:a[start:stop],其行为是得到下标在这样一个前闭后开区间范围内的元素,其中start和stop为负数时,简单看作是负数下标对应的位置即可:
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[2:3]
[2]
>>> a[5:9]
[5, 6, 7, 8]
>>> a[5:-1]
[5, 6, 7, 8]
>>> a[-5:9]
[5, 6, 7, 8]
>>> a[-5:-1]
[5, 6, 7, 8]
早期的Python解释器仅支持上述a[start:stop]形式的基本切片,后来加入了下面要介绍的切片形式,扩展切片的名称也流传下来,实际上不用担心,这早已是Python所支持的标准语法。
扩展切片指的是这样的切片形式:a[start:stop:step],其中step是一个非零整数,即比简单切片多了调整步长的功能,此时切片的行为可概括为:从start对应的位置出发,以step为步长索引序列,直至越过stop对应的位置,且不包括stop本身。事实上,简单切片就是step=1的扩展切片的特殊情况。需要详细解释的是step分别为正数和负数的两种情况。
step为正数
当step为正数时,切片行为很容易理解,start和stop的截断和缺省规则也与简单切片完全一致:
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[0:6:2]
[0, 2, 4]
>>> a[::2]
[0, 2, 4, 6, 8]
>>> a[:-2:2]
[0, 2, 4, 6]
>>> a[4::2]
[4, 6, 8]
step为负数
当step为负数时,切片将其解释为从start出发以步长|step|逆序索引序列,此时,start和stop的截断依然遵循前述规则,但缺省发生一点变化,因为我们说过,在缺省的情况下,Python的行为是尽可能取最大区间,此时访问是逆序的,start应尽量取大,stop应尽量取小,才能保证区间最大,因此:
按照扩充索引范围的观点,start的缺省值是无穷大(),stop的缺省值是无穷小()
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[5::-1]
[5, 4, 3, 2, 1, 0]
>>> a[:4:-2]
[9, 7, 5]
>>> a[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
摘自:https://zhuanlan.zhihu.com/p/79541418
#提取并修改表中内容
cpi.columns = cpi.iloc[1] #
cpi = cpi[2:] # ⑥
cpi.drop([11, 12], axis=0, inplace=True) # ⑦
cpi['cpi_index'] = ['总体消费', '食品烟酒', '衣着', '居住', '生活服务', '交通通信', '教育娱乐', '医保', '其他'] # ⑧
cpi.drop(['指标'], axis=1, inplace=True) # ⑨
cpi.reset_index(drop=True, inplace=True) # ⑩
cpi.columns.rename('', inplace=True) # ⑪
#保存表。到work文件夹中,命名为cpinewtable
cpi.to_csv('work/cpinewtable.xls')
cpi.drop([11, 12], axis=0, inplace=True)
是切去第11,12行,涉及到一个axis取值的问题,简单理解为axis=1为横向,axis=0为纵向,inplace=True
是覆盖原数据
摘自https://blog.csdn.net/weixin_45944896/article/details/118925846#:~:text=cpi.drop%20%28%5B%2011%2C%2012%20%5D%2C%20axis%3D,0%2C%20inplace%3DTrue%29%20%E5%88%A0%E9%99%A4%E7%AC%AC11%E3%80%8112%E8%A1%8C%EF%BC%8C%E5%B9%B6%E8%A6%86%E7%9B%96%E5%8E%9F%E6%9D%A5%E7%9A%84%20cpi.reset_index%20%28drop%3DTrue%2C%20inplace%20%3DTrue%29
#根据上面程序,画出第3行数据的图形
##在此填写程序
import matplotlib.pyplot as plt # ⑬
r = plt.bar(cpi.iloc[3, :-1].index, cpi.iloc[3, :-1].values) # ⑭
plt.grid() # ⑮
这里绘图效果一般,理解大多来自底下的文章,但深知matplotlib.pyplot远非如此,抽空研究
摘自:https://blog.csdn.net/QLeelq/article/details/115702337
r = plt.bar(cpi.iloc[3, :-1].index, cpi.iloc[3, :-1].values)
iloc函数使用方法:前面的冒号就是取行数,后面的冒号是取列数,其中数字遵循切片原则
摘自:https://blog.csdn.net/qq_39368111/article/details/110435536
plt.bar()是一个绘图函数,用于柱状图绘制,这里暂不展开说明
.摘自: https://zhuanlan.zhihu.com/p/113657235
决策树模型中有个很重要的概念为熵(entropy),熵与信息内容的不确定程度有等价关系。
熵的概念对人工智能领域有很大的启发,模型(信息处理系统)在没有训练之前无法准确预测结果(虽然可以强行输出特征但输出的结果无法掌握),而模型经过训练后可以非常准确预测结果。
所以将模型的训练过程与熵的概念进行连接,即模型的训练过程可以看成是一个本来输出熵很大的系统(通俗来说就是瞎猜),经过人为训练逐步熵减,直到变成一个相对有序的过程(熵减的过程)。
import numpy as np
"""
概率(概念):表示一个事件发生可能性的数字化度量
pa = 0.3
pb = 0.9
信息量:
- 听君一席话,胜读十年书!!!
- 头条!!!
- 爆炸性!!
- 数字化!!!
- 信息量的大小,如何用一个数来表达???
- 明天,太阳将会从东方升起!---》 没有信息量
- 大概率的事件发生了,没有信息量!!!
- 小概率事件发生了,信息量很大!!!
- 信息量的度量:概率
- 信息熵
- entropy
- cross entropy 交叉熵损失函数
- mse 均方误差损失函数
- 混乱程度
"""
举个例子:分类三种小球
#小球分类问题
"""
r: 30
g: 30
b: 30
"""
A = [30, 30, 30]
"""
r: 45
g: 45
b: 0
"""
B = [45, 45, 0]
"""
r: 90
g: 0
b: 0
"""
C = [90, 0, 0]
"""
A的信息熵
"""
# 如何计算A的信息熵
a = np.array(A)
pa = a / a.sum()
ea = -(0.3333 * np.log(0.333333) + 0.3333 * np.log(0.333333) + 0.3333 * np.log(0.333333))
# op:1.0985034273397427
# A
-(pa * np.log(pa)).sum()
# op:1.0985034273397427
# P(B)
pb = np.array([45, 45, 0])
pb = pb / pb.sum()
pb += 1e-6 # log不能为负
#op:0.6931603823628645
-(pb * np.log(pb)).sum()
-(pc * np.log(pc)).sum() # 其实就是0
# op:2.6631020616010977e-05
# 注意:还是那句话单独的0.6931603823628645不能说明混乱程度,需要和其他数值相比
以决策树为例
# 计算entropy
value = [42,39,46]
value = np.array(value)
p = value / value.sum()
-(p * np.log2(p)).sum()
# op:1.5816621019614714
这里有一些注意点
为什么是x[2] <= 2.6?
如何得知第二个特征熵减最快?
这里有三个重要的分类依据 —> ID3 C4.5 CART
这里着重介绍CART(分类回归树),其中最重要的思想就是将所有特征看作连续量
决策树优点
缺点
如果让树自然生长,决策树会试图将每个数据送到最合适的地方,将导致非常严重的过拟合,进而出现了一个概念为剪枝,剪枝即强行停止决策树继续分类
Q:把一个样本分为2个子样本后,怎么认为降熵降的最多,是摸一个子分类的熵最小还是2个子分类的信息熵和?
A:都不是,要看加权和最小