# 天津大学电气自动化与信息工程学院
# 丛明钧 3020234480
# 开发时间:2022/4/4 15:11
import math
import xlrd as xd
# Logistic函数: lgstc'(x) = lgstc(x)(1 - lgstc(x))
def lgstc (x):
return 1 / (1 + math.exp(-x))
# 目标方程:1 + w1x1 + w2x2 = 0
# w0增量函数
def Del_w0(Input1, # 输入坐标1的列表
Input2, # 输入坐标2的列表
Desired, # 标注样本点属于哪一类的函数f
w0, #
w1, #
w2): #
sumDel = 0
for i in range(len(Input1)):
lc_p = lgstc(w0 + w1 * Input1[i] + w2 * Input2[i])
sumDel += Desired[i] - lc_p
return sumDel
# w1增量函数
def Del_w1(Input1, # 输入坐标1的列表
Input2, # 输入坐标2的列表
Desired, # 标注样本点属于哪一类的函数f
w0, #
w1, #
w2): #
sumDel = 0
for i in range(len(Input1)):
lc_p = lgstc(w0 + w1 * Input1[i] + w2 * Input2[i])
sumDel += Input1[i] * (Desired[i] - lc_p)
return sumDel
# w2增量函数
def Del_w2(Input1, # 输入坐标1的列表
Input2, # 输入坐标2的列表
Desired, # 标注样本点属于哪一类的函数f
w0, #
w1, #
w2): #
sumDel = 0
for i in range(len(Input1)):
lc_p = lgstc(w0 + w1 * Input1[i] + w2 * Input2[i])
sumDel += Input2[i] * (Desired[i] - lc_p)
return sumDel
# Loss函数每次迭代后的损失函数,表征概率之积
def Loss(Input1, # 输入坐标1的列表
Input2, # 输入坐标2的列表
Desired, # 标注样本点属于哪一类的函数f
w0, #
w1, #
w2): #
loss = 0
for i in range(len(Input1)):
lc_p = lgstc(w0 + w1 * Input1[i] + w2 * Input2[i])
loss += Desired[i] * math.log(lc_p) + (1 - Desired[i]) * math.log(1 - lc_p)
return loss
# 梯度上升法求极值
def GDM_LC(Input1, # 输入坐标1的列表
Input2, # 输入坐标2的列表
Desired, # 标注样本点属于哪一类的函数f
w0 = 0, # w0迭代初值,默认为0
w1 = 0, # w1迭代初值,默认为0
w2 = 0, # w2迭代初值,默认为0
Alpha = 0.1, # 学习参数,默认为0.1
err = 1e-9): # 误差,默认为1e-9
w0_list = [] # 迭代过程中w0构成的列表
w1_list = [] # 迭代过程中w1构成的列表
w2_list = [] # 迭代过程中w2构成的列表
loss_list = [] # 损失函数构成的列表
IterTime = 0 # 迭代次数
while 1:
w0, w1, w2 =\
w0 + Alpha * Del_w0(Input1, Input2, Desired, w0, w1, w2), \
w1 + Alpha * Del_w1(Input1, Input2, Desired, w0, w1, w2), \
w2 + Alpha * Del_w2(Input1, Input2, Desired, w0, w1, w2)
w0_list.append(w0)
w1_list.append(w1)
w2_list.append(w2)
loss_list.append(Loss(Input1, Input2, Desired, w0, w1, w2))
IterTime = IterTime + 1
# 判断w0, w1, w2, 损失函数都在误差内跳出循环
if IterTime > 3:
if abs(w0_list[IterTime-1] - w0_list[IterTime - 2]) < err:
if abs(w1_list[IterTime - 1] - w1_list[IterTime - 2]) < err:
if abs(w2_list[IterTime - 1] - w2_list[IterTime - 2]) < err:
break
return w0, w1, w2, w0_list, w1_list, w2_list, loss_list, IterTime
# 正确率验证函数
def bool_rate(Input1, # 输入坐标1的列表
Input2, # 输入坐标2的列表
Desired, # 标注样本点属于哪一类的函数f
w0, #
w1, #
w2): #
boolnum = len(Input1) # 样本总量
boolT = 0 # 与分类直线匹配到正确位置的数量
for i in range(boolnum):
if Desired[i] == 0:
if w0 + w1 * Input1[i] + w2 * Input2[i] < 0:
boolT += 1
elif Desired[i] == 1:
if w0 + w1 * Input1[i] + w2 * Input2[i] >= 0:
boolT += 1
return boolT / boolnum
# 从asc文件读取到xls的函数
def data_asc_xls(file_rd, # 需要读取的asc文件地址
wb, # 打开一个excel文件用函数,类似于xlwt.Workbook(encoding='ANSI')
sheet_add, # 添加列表的名字
row_ini = 0, # 写入excel列表中的初始行数
col_ini = 0 ): # 写入excel列表中的初始列数
# 打开数据文本文档,注意编码格式的影响,这里用的是ANSI编码
f = open(file_rd, 'r', encoding='ANSI')
row = row_ini # 写入的起始行
col = col_ini # 写入的起始列
k = 0
for lines in f:
# txt文件中每行的内容按\tab分割并存入数组中
a = lines.split(' ')
k += 1
for i in range(len(a)):
# 向Excel文件中写入每一项
sheet_add.write(row, col, a[i])
col += 1
row += 1
col = col_ini
return wb
# excel读取数据函数,按列读取
def excel_readnum(file_root, # 读取excel地址
sheetname, # 列表名
col, # 读取的列数
line_start): # 起始读取行数
data = xd.open_workbook(file_root)
sheet = data.sheet_by_name(sheetname)
list_output = []
for r in range(line_start, sheet.nrows):
data1 = []
for c in range(sheet.ncols):
data1.append(sheet.cell_value(r, c))
list_output.append(float(data1[col]))
return list_output
if __name__ == '__main__':
GDM_LC()
bool_rate()
data_asc_xls()
excel_readnum()
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
平面上两类点集的区分是迈向人工智能机器学习的第一步。本例程用Python编程实现对平面上二点集的分类。例程中设置了训练集和测试集,用训练集算出最优分类直线,还能通过测试集对分类直线的内容进行正确率预测。二分类原理可以参考我的文章:https://blog.csdn.net/m0_53253879/article/details/123915601?spm=1001.2014.3001.5501 本文章适合没有二分类机器学习基础的同学去理解。祝大家学习愉快!
资源详情
资源评论
资源推荐
收起资源包目录
LC.zip (17个子文件)
LC
prob2.2 test Input.asc 713B
LC_functions.py 7KB
LC_datasave.py 777B
__pycache__
LC_functions.cpython-39.pyc 3KB
LC_main.py 5KB
prob2.2 train Input.asc 706B
Test_Train_Set.xls 10KB
.idea
vagrant.xml 222B
other.xml 198B
misc.xml 294B
modules.xml 275B
workspace.xml 18KB
.gitignore 184B
inspectionProfiles
profiles_settings.xml 174B
Template.iml 291B
prob2.2 test Desired.asc 100B
prob2.2 train Desired.asc 100B
共 17 条
- 1
迟钝皮纳德
- 粉丝: 188
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0